{"id":55000194,"date":"2013-06-01T00:00:00","date_gmt":"2020-01-24T15:58:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=194"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Debugging_im_VBAEditor_Teil_2","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html","title":{"rendered":"Debugging im VBA-Editor, Teil 2"},"content":{"rendered":"<p class='introduction'>Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Au&szlig;erdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu geh&ouml;ren beispielsweise das Lokalfenster und die &uuml;berwachungen.<\/p>\n<h2>Anhalten bei bestimmtem Wert<\/h2>\n<p>Wenn Sie eine Stelle im Code zur Laufzeit untersuchen m&ouml;chten, f&uuml;gen Sie dort entweder einen Haltepunkt oder die Stop-Anweisung ein. Beides h&auml;lt den Code bei jedem Erreichen der entsprechenden Stelle  an.<\/p>\n<p>Manchmal wird die betroffene Codestelle jedoch sehr oft durchlaufen, sodass der Code entsprechend oft angehalten und beispielsweise die Variablen untersucht werden m&uuml;ssen. In vielen F&auml;llen wissen Sie jedoch, dass ein Problem nur unter bestimmten Bedingungen auftaucht. So k&ouml;nnte es sein, dass Sie in einer Schleife alle Datens&auml;tze der Tabelle <b>tblArtikel <\/b>durchlaufen, aber schon wissen, dass ein Problem nur bei einem bestimmten Datensatz auftaucht.<\/p>\n<p>Wenn Sie wissen, dass ein Problem immer in Zusammenhang mit dem Datensatz mit dem Wert <b>20 <\/b>im Feld <b>ArtikelID <\/b>auftaucht, k&ouml;nnen Sie gezielt einen Haltepunkt setzen. Damit dieser auch nur f&uuml;r den betroffenen Datensatz erreicht wird, fassen Sie diesen in eine entsprechende <b>If&#8230;Then<\/b>-Bedingung ein. Dies sieht beispielsweise wie in Bild 1 aus, wobei die Bedingung <b>rst!ArtikelID = 20 <\/b>lautet. Nur wenn diese Bedingung erf&uuml;llt ist, wird die innerhalb der If&#8230;Then-Bedingung enthaltene und mit einem Haltepunkt versehene Anweisung erreicht. Nun k&ouml;nnen Sie beispielsweise weitere Werte des aktuellen Datensatzes im Direktfenster ausgeben &#8211; etwa so:<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_194_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_194_001.png\" alt=\"Anhalten des Codes bei Erreichen eines bestimmten Wertes\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Anhalten des Codes bei Erreichen eines bestimmten Wertes<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> rst!Artikelbestand<\/pre>\n<h2>Haltepunkt per Assert<\/h2>\n<p>Die <b>Debug<\/b>-Klasse bietet neben der <b>Print<\/b>-Methode noch eine weitere, relativ unbekannte Methode. Diese hei&szlig;t <b>Assert <\/b>und erwartet einen Ausdruck als Parameter, der entweder den Wert <b>True <\/b>oder <b>False <\/b>zur&uuml;ckliefert. Wenn der Ausdruck den Wert <b>False <\/b>zur&uuml;ckgibt, h&auml;lt die Prozedur automatisch in der Zeile mit der <b>Debug.Assert<\/b>-Anweisung an.<\/p>\n<p>Im Gegensatz zum vorherigen Beispiel, wo die <b>Debug.Print <\/b>mit dem Haltepunkt genau beim Eintreten der gew&uuml;nschten Bedingung ausgel&ouml;st wird, m&uuml;ssen Sie bei <b>Debug.Assert <\/b>also genau dem umgekehrten Fall formulieren.<\/p>\n<p>Auf jeden Fall brauchen Sie mit <b>Debug.Assert <\/b>nur eine statt drei Zeilen, um den Code beim Eintreten der gew&uuml;nschten Bedingung anzuhalten:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GezielterHaltepunkt_II()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset( _\r\n         \"SELECT * FROM tblArtikel\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Debug.Assert<\/span> <span style=\"color:blue;\">Not<\/span> (rst!ArtikelID = 20)\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie m&uuml;ssen lediglich beachten, dass Sie den Ausdruck durch Voranstellen des Schl&uuml;sselworts <b>Not <\/b>ins Gegenteil umkehren.<\/p>\n<h2>Das Lokal-Fenster<\/h2>\n<p>Wenn Sie eine Prozedur per Einzelschritt durchlaufen oder diese an der gew&uuml;nschten Stelle auf eine der oben angegebenen Arten angehalten haben, wissen Sie in vielen F&auml;llen noch nicht, wonach Sie suchen m&uuml;ssen. Da hilft es oft, sich einfach einmal einen &uuml;berblick &uuml;ber die aktuellen Werte aller derzeit verwendeten Variablen zu verschaffen.<\/p>\n<p>Dabei ist das Lokal-Fenster eine gro&szlig;e Hilfe. Sie blenden es mit dem Men&uuml;befehl <b>Ansicht|Lokal-Fenster<\/b> ein. Wenn aktuell kein Code durchlaufen wird, ist das Fenster leer. Deshalb schauen wir uns nun an, was das Lokalfenster beim Durchlaufen der Prozedur <b>GezielterHaltepunkt_II <\/b>tut.<\/p>\n<p>Lassen wir die Prozedur ruhig genau an der mit Debug.Assert festgelegten Position anhalten, indem wir die Einf&uuml;gemarke an beliebiger Stelle innerhalb der Prozedur platzieren und dann auf <b>F5 <\/b>dr&uuml;cken. <\/p>\n<p>Wie Bild 2 zeigt, geschieht in der Prozedur doch mehr als erwartet &#8211; es gibt mehr Variablen als gedacht. Das liegt daran, dass die beiden in der Prozedur verwendeten Objektvariablen db und rst jeweils auf Objekte verweisen, die eine ganze Reihe von Eigenschaften enthalten. Im Lokal-Fenster k&ouml;nnen Sie all diese Werte zum aktuellen Zeitpunkt pr&uuml;fen. Sie brauchen also nicht jede Eigenschaft mit <b>Debug.Print <\/b>im Direktbereich auszugeben, sondern k&ouml;nnen die Eigenschaften im Lokal-Fenster verfolgen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_194_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_194_002.png\" alt=\"Das Lokal-Fenster liefert eine Reihe Informationen.\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Das Lokal-Fenster liefert eine Reihe Informationen.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000194\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000194?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000194\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Au&szlig;erdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu geh&ouml;ren beispielsweise das Lokalfenster und die &uuml;berwachungen.<\/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":[662013,66032013,44000011],"tags":[],"class_list":["post-55000194","post","type-post","status-publish","format-standard","hentry","category-662013","category-66032013","category-VBAGrundlagen"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Debugging im VBA-Editor, Teil 2 - Access [basics]<\/title>\n<meta name=\"description\" content=\"Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Au\u00dferdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu geh\u00f6ren beispielsweise das Lokalfenster und die \u00dcberwachungen.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Debugging im VBA-Editor, Teil 2 - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Au\u00dferdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu geh\u00f6ren beispielsweise das Lokalfenster und die \u00dcberwachungen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:58:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_194_001.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"9\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_194_001.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\",\"name\":\"Debugging im VBA-Editor, Teil 2 - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:58:50+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Nachdem Sie im ersten Teil dieser Artikelreihe einige codebasierten Debugging-Techniken kennengelernt haben, schauen wir uns in diesem Teil weitere VBA-gesteuerte Features an. Au\\u00dferdem werfen wir einen Blick auf die Tools, die der VBA-Editor uns zum Debuggen bietet. Dazu geh\\u00f6ren beispielsweise das Lokalfenster und die \\u00dcberwachungen.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Debugging_im_VBAEditor_Teil_2.html\",\"name\":\"Debugging im VBA-Editor, Teil 2\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000194"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000194\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}