{"id":55000273,"date":"2015-02-01T00:00:00","date_gmt":"2020-01-24T15:59:19","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=273"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Die_VBAWithAnweisung","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html","title":{"rendered":"Die VBA-With-Anweisung"},"content":{"rendered":"<p class='introduction'>Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Ber&uuml;cksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich &uuml;ber IntelliSense zus&auml;tzlich das Schreiben von Objektmethoden. <\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1501_WithAnweisung.mdb<\/b>.<\/p>\n<h2>Grundlegende Syntax<\/h2>\n<p>Die <b>With<\/b>-Anweisung stellt einen Bezug zu einer Variablen her, der entweder ein benutzerdefinierter Datentyp (<b>UDT<\/b>) zugrunde liegt, oder ein Objekt. Ob diese in ihren eigenen Modulen deklariert sind, oder in einer Verweisbibliothek, spielt dabei keine Rolle. Die Blockanweisung besteht aus zwei Elementen, dem Blockstart und dem Blockende:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>Variable<span style=\"color:blue;\"> As <\/span>...\r\n<span style=\"color:blue;\">With<\/span> [Variable]  'Blockstart\r\n.[Methode oder]\r\n.[Eigenschaft] = ...\r\nEnd <span style=\"color:blue;\">With<\/span>  'Blockende<\/pre>\n<p>Nach dem reservierten Wort <b>With<\/b> folgt der Name einer Variablen, auf die sich die Methoden, Eigenschaften oder Typelemente im Folgenden beziehen sollen.<\/p>\n<p>Wird in einer Prozedur die Variable nicht mehr weiter ben&ouml;tigt, so schlie&szlig;t man den Bezug mit der Anweisung <b>End With<\/b>. <\/p>\n<h2>With im Einsatz<\/h2>\n<p>Einen Code aus dem wahren Datenbankprogrammiererleben finden Sie im Listing 1 der Beispieldatenbank, wo auf eine Tabelle <b>tblTest<\/b> eine Datensatzgruppe (<b>Recordset<\/b>) ge&ouml;ffnet wird, um sie mit Datens&auml;tzen zu f&uuml;llen und jene anschlie&szlig;end im VBA-Direktfenster auszugeben. In der ersten Zeile der Routine wird die Tabelle zun&auml;chst mit einer SQL-Anweisung per <b>Database.Execute<\/b> geleert. Dann erfolgt das Setzen des Recordsets <b>rsTest<\/b> auf die Tabelle. Die Recordset-Variable <b>rsTest<\/b> wurde &uuml;brigens bereits im Modulkopf deklariert, ebenso die Z&auml;hlervariable <b>i<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OhneWITH()\r\n     CurrentDb.Execute \"DELETE * FROM tblTest\"\r\n     <span style=\"color:blue;\">Set<\/span> rsTest = CurrentDb.OpenRecordset(\"SELECT * FROM tblTest\", dbOpenDynaset)\r\n     For i = 1 To 100\r\n         rsTest.Add<span style=\"color:blue;\">New<\/span>\r\n         rsTest!ID = i\r\n         rsTest!Code = Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd)\r\n         rsTest.Update\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     \r\n     rsTest.MoveFirst\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rsTest.EOF\r\n         <span style=\"color:blue;\">Debug.Print<\/span> rsTest!ID, rsTest!Code\r\n         rsTest.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     rsTest.Close\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 1: Durchlaufen der Datens&auml;tze einer Tabelle<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>rsTest<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n<span style=\"color:blue;\">Private <\/span>i<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Im weiteren Verlauf werden in einer Schleife auf den Z&auml;hler <b>i<\/b> der Tabelle hundert Datens&auml;tze hinzugef&uuml;gt, wobei f&uuml;r das Feld <b>Code<\/b> jeweils ein dreistelliger zuf&auml;lliger Buchstabencode generiert wird. Zum Schluss werden alle Datensatzinhalte wieder in einer Schleife &uuml;ber <b>Debug.Print <\/b>in das VBA-Direktfenster ausgegeben. Das Ergebnis w&auml;re etwa dieses:<\/p>\n<pre>  1            J\\Q\r\n  2            PEZ\r\n  3            BWU\r\n  4            H[N\r\n  5            ULG\r\n...<\/pre>\n<p>Auffallend ist, dass der Variablenname <b>rsTest<\/b> sehr h&auml;ufig in der Routine auftaucht. Genau dies l&auml;sst sich mit der <b>With<\/b>-Anweisung umgehen, indem zum Blockstart der Verweis auf <b>rsTest<\/b> gesetzt wird und im Folgenden darauf nur noch indirekt Bezug genommen wird. Der abgewandelte Code steht in Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>MitWITH()\r\n     CurrentDb.Execute \"DELETE * FROM tblTest\"\r\n     <span style=\"color:blue;\">Set<\/span> rsTest = CurrentDb.OpenRecordset(\"SELECT * FROM tblTest\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">With<\/span> rsTest\r\n         For i = 1 To 100\r\n             .Add<span style=\"color:blue;\">New<\/span>\r\n             !ID = i\r\n             !Code = Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd) & Chr$(65 + 28 * Rnd)\r\n             .Update\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n         .MoveFirst\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> .EOF\r\n             <span style=\"color:blue;\">Debug.Print<\/span> !ID, !Code\r\n             .Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         .Close\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: Der gleiche Code unter Einsatz der With-Anweisung<\/p>\n<p>Statt <b>rsTest.AddNew<\/b> zum Anlegen eines neuen Datensatzes wird nun nur noch der Ausdruck <b>.AddNew<\/b> ben&ouml;tigt &#8211; VBA denkt sich vor den Punkt den oben definierten Objektbezug.<\/p>\n<p>Statt des Punktes ist auch der VBA-Ausrufezeichen-Operator f&uuml;r Auflistungen erlaubt. Deshalb l&auml;sst sich nun ein Feld des Recordsets statt &uuml;ber <b>rsTest!Code<\/b> einfach mit <b>!Code<\/b> ansprechen.<\/p>\n<p>K&uuml;rzer wird die Routine damit nicht. Sie ist im Gegenteil wegen der <b>With<\/b>-Anweisungen sogar um zwei Zeilen l&auml;nger. Der Zeichenumfang ist jedoch geringer. Das spielt allerdings weniger eine Rolle als die nun erh&ouml;hte &uuml;bersichtlichkeit des Codes. Die Methoden, Eigenschaften und Feldbezeichnungen des Recordsets treten nun optisch deutlicher zutage, weil sie isolierter dastehen. <\/p>\n<p>Aber nicht nur die Gestalt des Programmcodes &auml;ndert sich damit, sondern auch die Art, wie VBA das Modul kompiliert. Denn bei jedem Ansprechen der Variablen <b>rsTest <\/b>in der ersten Variante sucht es sich gesondert einen Zeiger auf die Objektvariable, um dann deren Methoden auszuf&uuml;hren. Bei <b>With<\/b>-Bl&ouml;cken wird intern nur ein Zeiger auf die Objektvariable angelegt und dann f&uuml;r die Methodenaufrufe mehrfach verwendet. Das f&uuml;hrt zu einer geringf&uuml;gig besseren Ausf&uuml;hrungsgeschwindigkeit der Routine. Ehemals wurde die <b>With<\/b>-Anweisung deshalb auch in Sammlungen zu Performance-Tipps aufgenommen, spielt aber in dieser Hinsicht heute keine nennenswerte Rolle mehr &#8211; ein paar Nanosekunden mehr oder weniger sind unerheblich.<\/p>\n<h2>Objektvariablen &uuml;berfl&uuml;ssig machen<\/h2>\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\/55000273\/\">\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\/55000273?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\/55000273\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"22c77db969\"\/>\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>Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Ber&uuml;cksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich &uuml;ber IntelliSense zus&auml;tzlich das Schreiben von Objektmethoden. <\/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":[66012015,662015,44000011],"tags":[],"class_list":["post-55000273","post","type-post","status-publish","format-standard","hentry","category-66012015","category-662015","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>Die VBA-With-Anweisung - Access [basics]<\/title>\n<meta name=\"description\" content=\"Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Ber\u00fccksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich \u00fcber IntelliSense zus\u00e4tzlich das Schreiben von Objektmethoden.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Die VBA-With-Anweisung - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Ber\u00fccksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich \u00fcber IntelliSense zus\u00e4tzlich das Schreiben von Objektmethoden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:19+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\/Intellisense.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=\"8\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\/Die_VBAWithAnweisung.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/Intellisense.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html\",\"name\":\"Die VBA-With-Anweisung - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:19+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Unter den Elementen, die den Programm-Code unter VBA strukturierter erscheinen lassen, findet die With-Anweisung oft wenig Ber\\u00fccksichtigung. Dabei spart man mit ihr nicht nur Programmtext ein, sondern erleichtert sich \\u00fcber IntelliSense zus\\u00e4tzlich das Schreiben von Objektmethoden.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.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\/Die_VBAWithAnweisung.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Die_VBAWithAnweisung.html\",\"name\":\"Die VBA-With-Anweisung\"}}]},{\"@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\/55000273","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=55000273"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000273\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}