{"id":55001066,"date":"2016-12-01T00:00:00","date_gmt":"2020-05-22T13:35:12","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1066"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Steuerelemente_zur_Laufzeit_debuggen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/","title":{"rendered":"Steuerelemente zur Laufzeit debuggen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn im Formular oder in den enthaltenen Steuerelementen zur Laufzeit merkw&uuml;rdige Werte angezeigt werden oder die Elemente nicht wie gew&uuml;nscht reagieren, kann das verschiedene Ursachen haben. Viele davon lassen sich am einfachsten aufdecken, wenn Sie die Werte und Eigenschaften auslesen, w&auml;hrend das Formular in der Formularansicht ge&ouml;ffnet ist. Doch das ist nicht ganz einfach, denn es erfordert eine Menge Tipparbeit &#8211; und oft die genaue Kenntnis der Formular-, Unterformular- oder Steuerelementnamen. Wir zeigen eine Methode, die das Abfragen der Eigenschaftswerte erheblich vereinfacht.<\/b><\/p>\n<h2>Die Standardmethode<\/h2>\n<p>Sind wir mal ehrlich: Wenn Sie den Wert der Eigenschaft eines Steuerelements eines ge&ouml;ffneten Formulars ermitteln wollen, geht man &uuml;blicherweise &uuml;ber das Direktfenster und ermittelt den gesuchten Wert mit der <b>Debug.Print<\/b>-Anweisung.<\/p>\n<p>Schauen Sie sich beispielsweise das Formular aus Bild 1 an. Es enth&auml;lt einige Kombinationsfelder, die nat&uuml;rlich &#8211; wie es in einer professionel gestalteten Anwendung der Fall sein sollte &#8211; nicht die Prim&auml;rschl&uuml;sselwerte der gebundenen Datenherkunft, sondern die f&uuml;r den Benutzer wichtigen Werte wie den Kundennamen, den Namen des Sachbearbeiters oder auch im Unterformular den Namen des Artikels anzeigen. Nun kommt es vor, dass Sie sich fragen, welches Formular Sie dort gerade &uuml;berhaupt ge&ouml;ffnet haben. Wenn es das einzige Formular ist, k&ouml;nnen Sie dies mit dem ersten Eintrag der <b>Forms<\/b>-Auflistung herausfinden:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_001.png\" alt=\"Formular und Unterformular zur Verwaltung von Bestellungen\" width=\"549,6265\" height=\"414,183\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular und Unterformular zur Verwaltung von Bestellungen<\/span><\/b><\/p>\n<pre>  Forms(0).Name\r\nfrmBestellungen<\/pre>\n<p>Sind mehrere Formular ge&ouml;ffnet, hilft dies nicht weiter, denn Sie kennen ja den Index des zu untersuchenden Formulars nicht. In diesem Fall greifen Sie einfach &uuml;ber die Eigenschaft <b>ActiveForm <\/b>des <b>Screen<\/b>-Objekts auf das Formular zu und lassen sich dessen Namen ausgeben:<\/p>\n<pre>  Screen.ActiveForm.Name\r\nfrmBestellungen<\/pre>\n<p>Auf diese Weise haben Sie schon einmal den Namen des Formulars herausgefunden. Damit k&ouml;nnen Sie nun gezielt auf dieses Formular und seine Eigenschaften, wie zum Beispiel <b>Name<\/b>, zugreifen (was zugegebenerma&szlig;en wenig Sinn macht, da wir den Namen ja schon kennen &#8211; aber es ist ja nur ein Beispiel!):<\/p>\n<pre>  Forms!frmBestellungen.Name\r\nfrmBestellungen<\/pre>\n<p>Sie k&ouml;nnen damit nat&uuml;rlich auch etwa die Datenherkunft des Formulars ausgeben lassen:<\/p>\n<pre>  Forms!frmBestellungen.Recordsource\r\ntblBestellungen<\/pre>\n<p>Auf die gleiche Weise greifen Sie auch auf die &uuml;brigen Eigenschaften des Formulars zu.<\/p>\n<h2>Steuerelemente ansprechen<\/h2>\n<p>Nun gehen wir einen Schritt weiter und k&uuml;mmern uns um die Steuerelemente. Wenn Sie nicht wissen, wie ein Steuerelement hei&szlig;t, k&ouml;nnen Sie sich in einer Schleife die Steuerelementnamen ausgeben lassen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Steuerelementnamen()\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     For Each ctl In Forms!frmBestellungen.Controls\r\n         <span style=\"color:blue;\">Debug.Print<\/span> ctl.Name\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies gibt die Namen aller Steuerelemente im Direktfenster aus. Wenn Sie das gew&uuml;nschte Steuerelement gefunden haben, k&ouml;nnen Sie wie folgt darauf zugreifen &#8211; in diesem Beispiel auf das Steuerelement <b>BestellungID<\/b>:<\/p>\n<pre>  Forms!frmBestellungen.Controls(\"BestellungID\").Value\r\n  10248 <\/pre>\n<p>Das entspricht der folgenden Syntax mit dem Ausrufezeichen:<\/p>\n<pre>  Forms!frmBestellungen!BestellungID\r\n10248<\/pre>\n<h2>Aktivierbare Steuerelemente ansprechen<\/h2>\n<p>Bei den Steuerelementen, die aktivierbar sind, also denen Sie den Fokus etwa per Mausklick zuweisen k&ouml;nnen, gibt es noch eine einfachere Methode, beispielsweise den Namen zu ermitteln. Dazu verwenden Sie eine weitere Eigenschaft des <b>Screen<\/b>-Objekts, n&auml;mlich <b>ActiveControl<\/b>. Wenn Sie einmal das Steuerelement zur Anzeige des Feldes <b>BestellungID <\/b>per Mausklick aktivieren und dann im Direktfenster die folgende Anweisung absetzen, erhalten Sie ebenfalls den Namen dieses Steuerelements:<\/p>\n<pre>  Screen.ActiveControl.Name\r\nBestellungID<\/pre>\n<p>Auf den enthaltenen Wert oder andere Eigenschaften greifen Sie auf diesem Wege zu:<\/p>\n<pre>  Screen.ActiveControl.Value\r\n  10248 <\/pre>\n<h2>Nicht sichtbare Werte ermitteln<\/h2>\n<p>Aber warum sollte man &uuml;berhaupt auf den Wert eines Steuerelements zugreifen, wenn man diesen sowieso im Formular selbst ablesen kann Nun: Es gibt ja auch Steuerelemente, die ihren eigentlichen Inhalt nicht offenbaren &#8211; zum Beispiel die Kombinationsfelder dieses Beispielformulars, die allesamt nicht den Wert der gebundenen Spalte anzeigen (also den Feldwert des Feldes der Datenherkunft des Formulars, an das sie gebunden sind), sondern den Wert einer anderen Spalte der Datensatzherkunft des Kombinationsfeldes. Um die <b>KundeID <\/b>des Kunden aus dem Kombinationsfeld <b>KundeID <\/b>zu ermitteln, geben Sie folglich ein:<\/p>\n<pre>  Forms!frmBestellungen!KundeID\r\n  90 <\/pre>\n<p>Diese Information k&ouml;nnen Sie dem Kombinationsfeld sonst nicht entlocken. Sie k&ouml;nnen nat&uuml;rlich auch auf den Inhalt der &uuml;brigen Spalten der Datensatzherkunft des Kombinationsfeldes zugreifen:<\/p>\n<pre>  Forms!frmBestellungen!KundeID.Column(1)\r\nWilman Kala<\/pre>\n<p>Noch sinnvoller ist dies nat&uuml;rlich, wenn die Datensatzherkunft des Kombinationsfeldes noch weitere Felder enth&auml;lt, die nicht eingeblendet sind. Mit der Eigenschaft <b>Column <\/b>stehe ich &uuml;brigens auf Kriegsfu&szlig; &#8211; ich gebe immer Columns ein, da ich denke, dass diese Eigenschaft, der man ja einen Index &uuml;bergibt, eine Auflistung sein und dementsprechend im Plural angegeben werden m&uuml;sste. Deshalb w&auml;re es praktisch, wenn man hier mit IntelliSense arbeiten k&ouml;nnte &#8211; aber der VBA-Editor erkennt an dieser Stelle nicht den Typ des Objekts <b>KundeID <\/b>und blendet somit auch nicht dessen Eigenschaften und Methoden ein. Sp&auml;ter schauen wir uns allerdings eine M&ouml;glichkeit an, auch &uuml;ber das Direktfenster auf solche Informationen per IntelliSense zuzugreifen.<\/p>\n<h2>Unterformular-Steuerelement referenzieren<\/h2>\n<p>Nun st&uuml;rzen wir uns allerdings erstmal auf das Unterformular. Hier entsteht oft das Missverst&auml;ndnis, dass das Unterformular-Steuerelement, das ja quasi nur ein Rahmen f&uuml;r das eigentliche, als Unterformular angegebene Formular ist, als Formular angesprochen wird.<\/p>\n<p>Das Unterformular-Steuerelement hat jedoch ganz andere Eigenschaften als das darin enthaltene Formular, und Sie k&ouml;nnen auch nicht direkt &uuml;ber das Unterformular-Steuerelement auf die enthaltenen Steuerelemente des Unterformulars zugreifen. Zur Verdeutlichung haben wir das Unterformular-Steuerelement, das beim Hineinziehen des Unterformulars in den Entwurf des Hauptformulars unpraktischerweise den gleichen Namen erh&auml;lt wie das Unterformular selbst (hier <b>sfmBestellungen<\/b>), umbenannt, und zwar in <b>sfmBestellungen_UFD <\/b>(f&uuml;r Unterformular-Control, s. Bild 2). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_002.png\" alt=\"Umbenennen des Unterformulare-Steuerelements\" width=\"649,559\" height=\"439,7578\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Umbenennen des Unterformulare-Steuerelements<\/span><\/b><\/p>\n<p>Nun k&ouml;nnen wir zun&auml;chst wie folgt auf das Unterformular-Steuerelement zugreifen und uns zum Beispiel die beiden Felder ausgeben lassen, &uuml;ber welche die Synchronisation zwischen den Datens&auml;tzen aus Haupt- und Unterformular hergestellt wird:<\/p>\n<pre>  Forms!frmBestellungen!sfmBestellungen_UFC.LinkChildFields\r\nBestellungID\r\n  Forms!frmBestellungen!sfmBestellungen_UFC.LinkMasterFields\r\nBestellungID<\/pre>\n<p>Den Namen dieser beiden Eigenschaften m&uuml;sste man zu diesem Zweck auch erst mal kennen beziehungsweise ermitteln. Das Unterformular-Steuerelement ist &uuml;brigens eines der Steuerelemente, dem Sie nicht den Fokus zuweisen k&ouml;nnen. Sie k&ouml;nnen also auch nicht mit <b>Screen.ActiveControl <\/b>darauf zugreifen.<\/p>\n<h2>Unterformular referenzieren<\/h2>\n<p>Wenn Sie dann auf das im Unterformular-Steuerelement selbst enthaltene Unterformular zugreifen wollen, m&uuml;ssen Sie noch die Eigenschaft <b>Form <\/b>hinzuf&uuml;gen &#8211; hier ermitteln wir den Namen des Unterformulars:<\/p>\n<pre>  Forms!frmBestellungen!sfmBestellungen_UFC.Form.Name\r\nsfmBestellungen<\/pre>\n<p>Um auf die im Unterformular enthaltenen Steuerelemente zuzugreifen, k&ouml;nnen Sie einfach wieder den Steuerelementnamen entweder &uuml;ber die <b>Controls<\/b>-Auflistung referenzieren oder direkt per Ausrufezeichen-Syntax:<\/p>\n<pre>  Forms!frmBestellungen!sfmBestellungen_UFC.Form.BestellungID\r\n  10248 <\/pre>\n<p>In diesem Fall greifen wir auf ein Feld der Datenherkunft zu, das selbst gar nicht als Steuerelement abgebildet ist. Woran erkennen Sie, dass Sie ein Feld der Datenherkunft referenzieren und dass es kein Steuerelement ist Sie k&ouml;nnen versuchen, etwa die Eigenschaft <b>Name <\/b>oder <b>DefaultValue <\/b>abzufragen. Das f&uuml;hrt zu der Fehlermeldung aus Bild 3. Greifen wir lieber auf ein echtes Steuerelement zu, beispielsweise um die <b>ArtikelID <\/b>des Artikels der ersten Bestellposition im Unterformular zu erhalten. Erstmal geben wir den Namen aus, um zu pr&uuml;fen, ob wir auch auf das Steuerelement zugreifen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_003.png\" alt=\"Fehler beim Zugriff auf die Eigenschaft DefaultValue eines Feldes\" width=\"549,6265\" height=\"257,1252\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Fehler beim Zugriff auf die Eigenschaft DefaultValue eines Feldes<\/span><\/b><\/p>\n<pre>  Forms!frmBestellungen!sfmBestellungen_UFC.Form.ArtikelID.Name\r\nArtikelID<\/pre>\n<p>Danach holen wir uns die <b>ArtikelID<\/b>:<\/p>\n<pre>  Forms!frmBestellungen!sfmBestellungen_UFC.Form. ArtikelID.Value\r\n  11 <\/pre>\n<p>&uuml;brigens k&ouml;nnen Sie so auch nur auf die Werte des jeweils aktivierten Datensatzes im Unterformular zugreifen. Wenn beispielsweise der erste Datensatz markiert ist und Sie wollen die <b>ArtikelID <\/b>f&uuml;r den zweiten Datensatz einer Bestellung erhalten, m&uuml;ssen Sie diesen Datensatz zun&auml;chst im Unterformular markieren.<\/p>\n<p>Wenn Sie diesen Datensatz im Unterformular markieren, k&ouml;nnen Sie aber auch gleich auf das Kombinationsfeld zur Auswahl der Artikel klicken, um die folgende, viel einfachere Anweisung zu nutzen:<\/p>\n<pre>  Screen.ActiveControl.Value\r\n  42 <\/pre>\n<p>Dennoch: Es st&ouml;rt schon etwas, dass man immer noch die Eigenschaften selbst eintippen muss und dass kein IntelliSense zur Verf&uuml;gung steht. Wie Sie dies hinzuf&uuml;gen k&ouml;nnen, schauen wir uns im Folgenden an.<\/p>\n<h2>Eigene Debugging-Klasse<\/h2>\n<p>Um unser Ziel zu erreichen, bedarf es der Programmierung einer kleinen Klasse mit speziellen Eigenschaften.<\/p>\n<p>Diese Klasse f&uuml;gen Sie &uuml;ber den Men&uuml;befehl <b>Einf&uuml;gen|Klassenmodul <\/b>des VBA-Editors hinzu und nennen sie <b>Debugger<\/b>. Dann exportieren Sie die Klasse &uuml;ber den Kontextmen&uuml;-Befehl des neuen Eintrags im Projekt-Explorer in eine Textdatei (s. Bild 4). Entfernen Sie die soeben erstellte Klasse dann mit dem Kontextmen&uuml;-Eintrag <b>Entfernen von Debugger &#8230; <\/b>und antworten Sie auf die nun erscheinende Meldung mit <b>Nein<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_004.png\" alt=\"Exportieren des Klassenmoduls\" width=\"499,6607\" height=\"341,4669\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Exportieren des Klassenmoduls<\/span><\/b><\/p>\n<p>Nun &auml;ndern Sie in einem Texteditor Ihrer Wahl die gespeicherte Textdatei mit der Klasse wie in Bild 5. Dabei stellen Sie die Werte f&uuml;r die beiden Eigenschaften <b>VB_Creatable <\/b>und <b>VB_PredeclaredID <\/b>auf <b>True <\/b>ein:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_005.png\" alt=\"Ge&auml;nderte Version des Klassenmoduls\" width=\"599,593\" height=\"253,976\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ge&auml;nderte Version des Klassenmoduls<\/span><\/b><\/p>\n<pre>Attribute VB_Creatable = <span style=\"color:blue;\">True<\/span>\r\nAttribute VB_PredeclaredId = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Nun importieren Sie die Datei wieder in das VBA-Projekt &#8211; am einfachsten, indem Sie es einfach aus dem Windows Explorer in den Projekt-Explorer ziehen. Aber was bewirkt diese &auml;nderung nun Das l&auml;sst sich schnell erkl&auml;ren, wenn Sie eine kleine Beispielmethode wie die folgende zu der Klasse hinzuf&uuml;gen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test()\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Test erfolgreich\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie k&ouml;nnen nun im Direktfenster einfach den folgenden Ausdruck eingeben, um die Klasse zu instanzieren und die Methode <b>Test <\/b>zu nutzen:<\/p>\n<pre>Debugger.Test<\/pre>\n<p>Dies zeigt dann das erwartete Meldungsfenster an. Nun wollen wir unsere Debugger-Klasse zun&auml;chst mit den Funktionen ausstatten, die auch die Screen-Klasse bietet &#8211; zum Beispiel mit dem Zugriff auf das aktive Formular &uuml;ber die Eigenschaft <b>Screen.ActiveForm<\/b>. Dazu f&uuml;gen wir der Klasse die folgende <b>Property Get<\/b>-Methode hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ActiveForm()\r\n     <span style=\"color:blue;\">Set<\/span> ActiveForm = _\r\n         Screen.ActiveForm\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Damit k&ouml;nnen Sie nun wie in Bild 6 mit IntelliSense-Unterst&uuml;tzung auf die Methode <b>ActiveForm<\/b> unserer neuen Klasse zugreifen. Diese leitet dann das Ergebnis der Methode <b>Screen.ActiveForm <\/b>weiter. Der komplette Aufruf sieht etwa wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_006.png\" alt=\"Neue Methoden per IntelliSense\" width=\"424,7115\" height=\"134,5715\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Neue Methoden per IntelliSense<\/span><\/b><\/p>\n<pre>  Debugger.ActiveForm.Name\r\nfrmBestellungen<\/pre>\n<p>Das Gleiche erledigen wir noch f&uuml;r die Eigenschaft <b>ActiveControl<\/b>. Aber was haben wir damit nun erreicht &#8211; abgesehen davon, dass wir nun eine eigene Klasse haben, auf die wir direkt zugreifen k&ouml;nnen und die uns eine Teilmenge der Funktionen der Screen-Klasse liefert Noch nicht viel, aber: Unsere Klasse k&ouml;nnen wir im Vergleich zur <b>Screen<\/b>-Klasse erweitern! Und hier beginnt der Spa&szlig;: Wir k&ouml;nnen nun beispielsweise Eigenschaften hinzuf&uuml;gen, mit denen wir nicht nur allgemein auf das aktuelle Steuerelement zugreifen, was nicht viel bringt, da wir nicht per IntelliSense auf seine Eigenschaften zugreifen k&ouml;nnen.<\/p>\n<h2>Aktives Textfeld ansprechen<\/h2>\n<p>Da w&auml;re zum Beispiel die <b>Property Get<\/b>-Eigenschaft namens <b>ActiveTextbox <\/b>aus Listing 1, die &#8211; falls das aktive Steuerelement ein Textfeld ist &#8211; einen Verweis auf dieses Textfeld zur&uuml;ckliefern soll. Die Eigenschaft hat den Datentyp <b>Textbox<\/b>, was bedeuetet, dass Sie per IntelliSense auf alle Eigenschaften dieses Steuerelements zugreifen k&ouml;nnen. Dazu m&uuml;ssen wir es allerdings erst einmal referenzieren. Die Eigenschaftsmethode stellt dazu zun&auml;chst die <b>Control<\/b>-Variable <b>ctl <\/b>auf das mit <b>Screen.ActiveControl <\/b>ermittelte aktive Steuerelement ein. Handelt es sich dabei um ein Steuerelement des Typs <b>Textbox<\/b>, was wir durch den Abgleich der Eigenschaft <b>ControlType <\/b>mit der Konstanten <b>acTextBox <\/b>pr&uuml;fen, stellt die Prozedur den R&uuml;ckgabewert der Methode auf <b>Screen.ActiveControl <\/b>ein. Das ist im Grunde nichts anderes als das, was <b>Screen.ActiveControl <\/b>selbst liefert &#8211; nur, dass wir &uuml;ber die Eigenschaft den Datentyp des gelieferten Elements auf <b>Textbox <\/b>einstellen.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ActiveTextbox()<span style=\"color:blue;\"> As <\/span>Textbox\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>Textbox\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>ctl.ControlType = acTextBox<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> txt = Screen.ActiveControl\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strTyp = GetControlType(ctl)\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement hat den Typ ''''\" & strTyp & \"''''.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ActiveTextbox = txt\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Definition einer Eigenschaft f&uuml;r den Zugriff auf das aktive Textfeld<\/span><\/b><\/p>\n<p>Sollte der Benutzer die Eigenschaft <b>Debugger.ActiveText-box <\/b>aufrufen, wenn das aktive Steuerelement nicht den Typ <b>Textbox <\/b>aufweist, ermitteln wir mit der Hilfsfunktion <b>GetControlType <\/b>eine Zeichenkette mit dem Namen des Steuerelementtyps und geben eine Meldung aus, damit der Benutzer &uuml;ber den Grund der nachfolgenden Fehlermeldung informiert wird.<\/p>\n<p>Die Abfolge der Meldungen in diesem Fall finden Sie, ausgehend vom Absetzen der <b>Debugger.ActiveTextbox<\/b>-Anweisung im Direktfenster, in Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_007.png\" alt=\"Fehlermeldungen beim Zugriff auf das aktive Steuerelement, wenn es kein Textfeld ist\" width=\"599,593\" height=\"348,3723\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Fehlermeldungen beim Zugriff auf das aktive Steuerelement, wenn es kein Textfeld ist<\/span><\/b><\/p>\n<h2>Hilfsfunktion zum Ermitteln des Steuerelementtyps<\/h2>\n<p>Die Hilfsfunktion <b>GetControlType<\/b> sieht wie in Listing 2 aus. Die Funktion erwartet einen Verweis auf das zu untersuchende Steuerelement als Parameter und pr&uuml;ft dann in einer <b>Select Case<\/b>-Bedingung den Wert der Eigenschaft <b>ControlType <\/b>des Steuerelements. Wir haben hier nur die vier Steuerelementtypen <b>Textbox<\/b>, <b>ComboBox<\/b>, <b>ListBox <\/b>und <b>CommandButton <\/b>ber&uuml;cksichtigt &#8211; weitere k&ouml;nnen Sie nach Bedarf erg&auml;nzen.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetControlType(ctl<span style=\"color:blue;\"> As <\/span>Control)<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case ctl.ControlType\r\n         <span style=\"color:blue;\">Case <\/span>acTextBox\r\n             GetControlType = \"Textbox\"\r\n         <span style=\"color:blue;\">Case <\/span>acComboBox\r\n             GetControlType = \"ComboBox\"\r\n         <span style=\"color:blue;\">Case <\/span>acListBox\r\n             GetControlType = \"Listbox\"\r\n         <span style=\"color:blue;\">Case <\/span>acCommandButton\r\n             GetControlType = \"CommandButton\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hilfsfunktion zum Ermitteln eines Strings mit dem Steuerelementtyp<\/span><\/b><\/p>\n<p>Wenn Sie nun im Direktfenster wie in Bild 8 die Zeichenfolge <b> Debugger.ActiveTextbox <\/b>gefolgt von einem Punkt eingeben, erhalten Sie direkt eine Liste der verf&uuml;gbaren Eigenschaften, Methoden und Ereignisse &#8211; im Gegensatz zum Aufruf von <b>Screen.ActiveControl<\/b>, wo Sie logischerweise keine IntelliSense-Unterst&uuml;tzung erwarten d&uuml;rfen &#8211; Access kann einfach zur Laufzeit nicht ermitteln, welchen Typ das aktuelle Steuerelement aufweist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_008.png\" alt=\"Zugriff auf die spezifischen Eigenschaften eines Steuerelements des Typs Textbox\" width=\"424,7115\" height=\"218,5594\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Zugriff auf die spezifischen Eigenschaften eines Steuerelements des Typs Textbox<\/span><\/b><\/p>\n<h2>Unterst&uuml;tzung f&uuml;r weitere Steuerelemente<\/h2>\n<p>Sie sehen, dass wir hiermit schon einen gro&szlig;en Fortschritt im Vergleich zu den vorhandenen M&ouml;glichkeiten gemacht haben. Das wollen wir noch erweitern, indem wir &auml;hnliche Methoden f&uuml;r weitere Steuerelementtypen zur Klasse <b>Debugger<\/b> hinzuf&uuml;gen. In der Beispieldatenbank zu diesem Beitrag finden Sie die Unterst&uuml;tzung f&uuml;r das <b>ComboBox<\/b>-, das <b>ListBox<\/b>&#8211; und das <b>CommandButton<\/b>-Steuerelement.<\/p>\n<p>Die dazu verwendeten Eigenschaftsmethoden hei&szlig;en <b>ActiveComboBox<\/b>, <b>ActiveListBox <\/b>und <b>ActiveCommandButton<\/b>. Den Code dieser Elemente finden Sie in Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ActiveComboBox()<span style=\"color:blue;\"> As <\/span>ComboBox\r\n     <span style=\"color:blue;\">Dim <\/span>cbo<span style=\"color:blue;\"> As <\/span>ComboBox\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>ctl.ControlType = acComboBox<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cbo = Screen.ActiveControl\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strTyp = GetControlType(ctl)\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement hat den Typ ''''\" & strTyp & \"''''.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ActiveComboBox = cbo\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>ActiveCommandButton()<span style=\"color:blue;\"> As <\/span>CommandButton\r\n     <span style=\"color:blue;\">Dim <\/span>cmd<span style=\"color:blue;\"> As <\/span>CommandButton\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>ctl.ControlType = acCommandButton<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> cmd = Screen.ActiveControl\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strTyp = GetControlType(ctl)\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement hat den Typ ''''\" & strTyp & \"''''.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ActiveCommandButton = cmd\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>ActiveListBox()<span style=\"color:blue;\"> As <\/span>ListBox\r\n     <span style=\"color:blue;\">Dim <\/span>lst<span style=\"color:blue;\"> As <\/span>ListBox\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>ctl.ControlType = acListBox<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> lst = Screen.ActiveControl\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strTyp = GetControlType(ctl)\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement hat den Typ ''''\" & strTyp & \"''''.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ActiveListBox = lst\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Eigenschaftsmethoden, welche den Zugriff auf das weitere Steuerelement erlauben<\/span><\/b><\/p>\n<h2>Unterformular-Steuerelement<\/h2>\n<p>Wie weiter oben erl&auml;utert, k&ouml;nnen Sie nicht per <b>Screen.ActiveControl <\/b>auf das aktuelle Unterformular-Steuerelement zugreifen &#8211; und auch nicht mit <b>Screen.ActiveForm <\/b>auf das darin enthaltene Formular.<\/p>\n<p>Der Grund ist ganz einfach: Beide lassen sich nicht mit dem Fokus versehen. Dieser landet immer auf dem Steuerelement im Unterformular (im Falle von <b>Screen.ActiveControl<\/b>) oder auf dem Hauptformular (bei <b>Screen.ActiveForm<\/b>).<\/p>\n<p>Aber es w&auml;re doch gelacht, wenn wir dies nicht mit einer eigenen Eigenschaftsmethode in unserer Klasse <b>Debugger <\/b>hinbekommen w&uuml;rden. Dazu m&uuml;ssen wir uns zun&auml;chst &uuml;berlegen, wie wir &uuml;berhaupt an das Unterformular-Steuerelement beziehungsweise an das darin enthaltene Formular herankommen.<\/p>\n<p>Von oben aus ist das einfach: <b>Forms!frmBestellungen!sfmBestellungen_UFC <\/b>liefert einen Verweis auf das Unterformular-Steuerelement, <b>Form!frmBestellungen!sfmBestellungen_UFC.Form <\/b>einen Verweis auf das als Unterformular verwendete Formular. Wir wollen nun auf diese Elemente zugreifen, w&auml;hrend ein Steuerelement im Unterformular selbst den Fokus hat. Es ist am einfachsten, wenn wir dieses Steuerelement auch als Ausgangsposition verwenden. Aber wie kommen wir von dort aus an das Unterformular heran, in dem sich dieses befindet &#8211; und wie an das Unterformular-Steuerelement <\/p>\n<p>F&uuml;r das Unterformular-Steuerelement erledigen wir das mit der Ereignismethode <b>ActiveSubformControl <\/b>aus Listing 4. Die Vo-raussetzung daf&uuml;r, dass wir &uuml;ber ein Steuerelement, das wir mit <b>Screen.ActiveControl <\/b>ermitteln und in der Variablen <b>ctl <\/b>speichern, zwei &uuml;bergeordnete <b>Parent<\/b>-Elemente finden k&ouml;nnen. Das erste <b>Parent<\/b>-Element ist das Unterformular, in dem sich das Element befindet, das zweite ist das Formular, in dem sich das Unterformular befindet (also nicht etwa das Unterformular-Steuerelement &#8211; dies wird von der <b>Parent<\/b>-Eigenschaft nicht ber&uuml;cksichtigt). Sind keine zwei <b>Parent<\/b>-Elemente vorhanden, handelt es sich auch nicht um ein Unterformular.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ActiveSubformControl()<span style=\"color:blue;\"> As <\/span>SubForm\r\n     <span style=\"color:blue;\">Dim <\/span>sfmControl<span style=\"color:blue;\"> As <\/span>SubForm\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>ctlParent<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctlForm<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ctlParent = ctl.Parent.Parent\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctlParent Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>TypeName(ctl.Parent.Parent) = \"Form_\" & Screen.ActiveForm.Name<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> frm = Screen.ActiveForm\r\n             For Each ctlForm In frm.Controls\r\n                 <span style=\"color:blue;\">If <\/span>ctlForm.ControlType = acSubform<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>TypeName(ctlForm.Form) = \"Form_\" & ctl.Parent.Name<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> sfmControl = ctlForm\r\n                         <span style=\"color:blue;\">Exit For<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> ctlForm\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> ActiveSubformControl = sfmControl\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement befindet sich nicht in einem Unterformular.\"\r\n         <span style=\"color:blue;\">Exit Property<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Ermitteln des aktuellen Unterformular-Steuerelements<\/span><\/b><\/p>\n<p>Um herauszufinden, ob sich das aktive Steuerelement in einem Unterformular befindet, lesen wir einfach das <b>Parent<\/b>-Objekt des <b>Parent<\/b>-Objekts des Steuerelements aus und referenzieren es mit der Variablen <b>ctlParent<\/b> &#8211; das Ganze bei deaktivierter Fehlerbehandlung, denn ein Fehler wird ausgel&ouml;st, wenn nicht beide <b>Parent<\/b>-Objekte vorhanden sind. Hat <b>ctlParent <\/b>danach den Wert <b>Nothing<\/b>, befindet sich das Steuerelement nicht in einem Unterformular und es erscheint eine entsprechende Meldung. Enth&auml;lt <b>ctlParent <\/b>jedoch einen Verweis auf ein Objekt, dann sind zwei dem Steuerelement &uuml;bergeordnete Formulare vorhanden. In diesem Fall m&uuml;sste das mit <b>Screen.ActiveForm <\/b>ermittelte Formular dem in <b>ctlParent <\/b>gespeicherten Formular entsprechen (die Ausnahme w&auml;re, dass hier verschachtelte Unterformular vorliegen &#8211; diesen Fall deckt die Prozedur nicht ab). F&uuml;r die Pr&uuml;fung vergleichen wir den Wert, den die <b>TypeName<\/b>-Eigenschaft f&uuml;r <b>ctlParent <\/b>liefert, mit dem Namen des aktiven Formulars mit vorangestelltem <b>Form_<\/b>. <b>TypeName <\/b>liefert n&auml;mlich nicht den Namen des Formulars, sondern den Typ des Code behind-Moduls, in diesem Fall also etwa <b>Form_frmBestellungen<\/b>.<\/p>\n<p>Sollte diese Bedingung erf&uuml;llt sein, stellt die Prozedur die Variable <b>frm <\/b>auf das mit <b>Screen.ActiveForm <\/b>ermittelte und soeben als solches best&auml;tigtes Hauptformular ein. Nun kann es aber immer noch sein, dass das Hauptformular mehrere Unterformulare enth&auml;lt, sodass wir genau das Unterformular ermitteln m&uuml;ssen, das dem Formular entspricht, in dem sich unser aktives Steuerelemente befindet.<\/p>\n<p>Dies erledigen wir in einer <b>For Each<\/b>-Schleife &uuml;ber alle Steuerelemente des Hauptformulars, also &uuml;ber die Auflistung <b>frm.Controls<\/b>. Die dabei durchlaufenen Steuerelemente landen in der Variablen <b>ctlForm <\/b>und werden danach zwei Pr&uuml;fungen unterzogen. Die erste untersucht die Steuerelementart dieses Elements. Handelt es sich beim Wert der Eigenschaft <b>ctlForm.ControlType <\/b>um den Wert <b>acSubform<\/b>, ist die erste Bedingung erf&uuml;llt. Die zweite <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob der Wert der Funktion <b>Typename <\/b>f&uuml;r <b>ctlForm.Form <\/b>dem Namen des Formulars entspricht, in dem sich das aktive Steuerelement befindet &#8211; wieder mit vorangestelltem <b>Form_<\/b>.<\/p>\n<p>Ist auch dies der Fall, weisen wir <b>ctlForm <\/b>der Variablen <b>sfmControl <\/b>mit dem Datentyp <b>SubForm <\/b>zu und verlassen die Schleife mit <b>Exit For<\/b>, da wir ja das passende Unterformular gefunden haben.<\/p>\n<p>Schlie&szlig;lich schreiben wir den Inhalt von <b>sfmControl <\/b>in den R&uuml;ckgabewert der Eigenschaftsmethode. Damit k&ouml;nnen Sie nun, wenn ein Steuerelement im Unterformular den Fokus hat, &uuml;ber das Direktfenster auf das Unterformular-Steuerelement zugreifen, in dem sich das Steuerelement befindet. So geben Sie beispielsweise schnell die Werte der Eigenschaften <b>LinkChildFields <\/b>(<b>Verkn&uuml;pfen von<\/b>) oder <b>LinkMasterFields <\/b>(<b>Verkn&uuml;pfen nach<\/b>) aus (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_06\/pic_1066_009.png\" alt=\"Direkter Bezug auf das Unterformular-Steuerelement\" width=\"424,7115\" height=\"185,1552\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Direkter Bezug auf das Unterformular-Steuerelement<\/span><\/b><\/p>\n<h2>Unterformular referenzieren<\/h2>\n<p>Auf &auml;hnliche Weise referenzieren Sie mit der Eigenschaftsmethode <b>ActiveSubform <\/b>aus Listing 5 das Unterformular, in dem sich das aktive Steuerelement befindet.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>ActiveSubform()<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>strTyp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>ctlParent<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctlForm<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> ctl = Screen.ActiveControl\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> ctlParent = ctl.Parent.Parent\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctlParent Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>TypeName(ctl.Parent.Parent) = \"Form_\" & Screen.ActiveForm.Name<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> frm = Screen.ActiveForm\r\n             For Each ctlForm In frm.Controls\r\n                 <span style=\"color:blue;\">If <\/span>ctlForm.ControlType = acSubform<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>TypeName(ctlForm.Form) = \"Form_\" & ctl.Parent.Name<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> sfm = ctlForm.Form\r\n                         <span style=\"color:blue;\">Exit For<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> ctlForm\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> ActiveSubform = sfm\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Aktives Steuerelement befindet sich nicht in einem Unterformular.\"\r\n         <span style=\"color:blue;\">Exit Property<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ermitteln des aktuellen Unterformulars<\/span><\/b><\/p>\n<h2>Einsatz in Ihren Anwendungen<\/h2>\n<p>Um diese Klasse zu nutzen, m&uuml;ssen Sie diese lediglich zum VBA-Projekt Ihrer Access-Anwendung hinzuf&uuml;gen. Die Befehle wie <b>Debugger.ActiveSubform <\/b>stehen dann sofort zur Verf&uuml;gung.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SteuerelementeZurLaufzeitDebuggen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/325B3702-C9A2-4DE1-B7F1-41930F30BC16\/aiu_1066.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn im Formular oder in den enthaltenen Steuerelementen zur Laufzeit merkw&uuml;rdige Werte angezeigt werden oder die Elemente nicht wie gew&uuml;nscht reagieren, kann das verschiedene Ursachen haben. Viele davon lassen sich am einfachsten aufdecken, wenn Sie die Werte und Eigenschaften auslesen, w&auml;hrend das Formular in der Formularansicht ge&ouml;ffnet ist. Doch das ist nicht ganz einfach, denn es erfordert eine Menge Tipparbeit &#8211; und oft die genaue Kenntnis der Formular-, Unterformular- oder Steuerelementnamen. Wir zeigen eine Methode, die das Abfragen der Eigenschaftswerte erheblich vereinfacht.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662016,66062016,44000025],"tags":[],"class_list":["post-55001066","post","type-post","status-publish","format-standard","hentry","category-662016","category-66062016","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Steuerelemente zur Laufzeit debuggen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Steuerelemente zur Laufzeit debuggen\" \/>\n<meta property=\"og:description\" content=\"Wenn im Formular oder in den enthaltenen Steuerelementen zur Laufzeit merkw&uuml;rdige Werte angezeigt werden oder die Elemente nicht wie gew&uuml;nscht reagieren, kann das verschiedene Ursachen haben. Viele davon lassen sich am einfachsten aufdecken, wenn Sie die Werte und Eigenschaften auslesen, w&auml;hrend das Formular in der Formularansicht ge&ouml;ffnet ist. Doch das ist nicht ganz einfach, denn es erfordert eine Menge Tipparbeit - und oft die genaue Kenntnis der Formular-, Unterformular- oder Steuerelementnamen. Wir zeigen eine Methode, die das Abfragen der Eigenschaftswerte erheblich vereinfacht.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T13:35:12+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Steuerelemente zur Laufzeit debuggen\",\"datePublished\":\"2020-05-22T13:35:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/\"},\"wordCount\":2993,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c9a90e9baba84584b003c669ca9dd182\",\"articleSection\":[\"2016\",\"6\\\/2016\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/\",\"name\":\"Steuerelemente zur Laufzeit debuggen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c9a90e9baba84584b003c669ca9dd182\",\"datePublished\":\"2020-05-22T13:35:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c9a90e9baba84584b003c669ca9dd182\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c9a90e9baba84584b003c669ca9dd182\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_zur_Laufzeit_debuggen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Steuerelemente zur Laufzeit debuggen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Steuerelemente zur Laufzeit debuggen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/","og_locale":"de_DE","og_type":"article","og_title":"Steuerelemente zur Laufzeit debuggen","og_description":"Wenn im Formular oder in den enthaltenen Steuerelementen zur Laufzeit merkw&uuml;rdige Werte angezeigt werden oder die Elemente nicht wie gew&uuml;nscht reagieren, kann das verschiedene Ursachen haben. Viele davon lassen sich am einfachsten aufdecken, wenn Sie die Werte und Eigenschaften auslesen, w&auml;hrend das Formular in der Formularansicht ge&ouml;ffnet ist. Doch das ist nicht ganz einfach, denn es erfordert eine Menge Tipparbeit - und oft die genaue Kenntnis der Formular-, Unterformular- oder Steuerelementnamen. Wir zeigen eine Methode, die das Abfragen der Eigenschaftswerte erheblich vereinfacht.","og_url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T13:35:12+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Steuerelemente zur Laufzeit debuggen","datePublished":"2020-05-22T13:35:12+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/"},"wordCount":2993,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182","articleSection":["2016","6\/2016","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/","url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/","name":"Steuerelemente zur Laufzeit debuggen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182","datePublished":"2020-05-22T13:35:12+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/c9a90e9baba84584b003c669ca9dd182"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_zur_Laufzeit_debuggen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Steuerelemente zur Laufzeit debuggen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001066","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001066"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001066\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}