{"id":55000343,"date":"2022-12-01T00:00:00","date_gmt":"2023-03-02T16:57:54","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=343"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBA_Basics_Schleifen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/VBA_Basics_Schleifen\/","title":{"rendered":"VBA Basics: Schleifen"},"content":{"rendered":"<p><b>Wenn wir in VBA einen Vorgang mehr als einmal durchf&uuml;hren wollen, verwenden wir dazu eine sogenannte Schleife. Davon gibt es verschiedene Arten: Einige, wie die &#8220;<b>For&#8230;Next&#8221;<\/b>-Schleife und die &#8220;<b>For Each&#8221;<\/b>-Schleife, werden entsprechend einer vorgegebenen Anzahl durchlaufen, andere solange, wie eine bestimmte Bedingung erf&uuml;llt ist &#8211; so zum Beispiel die &#8220;Do While&#8221;-Schleife. Dieser Artikel stellt die verschiedenen Schleifenarten vor und zeigt, welche sich f&uuml;r welchen Einsatzzweck eignet.<\/b><\/p>\n<h2>Schleifen<\/h2>\n<p>Grunds&auml;tzlich sind Schleifen Code-Konstrukte und &auml;hneln vom Aufbau her den VBA-Routinen. Sie besitzen einen Schleifenkopf und eine abschlie&szlig;ende Anweisung, die allerdings in diesem Fall nur das Ende eines Durchlaufs der Anweisungen innerhalb der Schleife bedeutet. Innerhalb der Schleife werden Anweisungen ausgef&uuml;hrt, solange die Bedingungen f&uuml;r das Fortsetzen der Schleife erf&uuml;llt sind. Diese Bedingungen k&ouml;nnen auf verschiedene Arten aufgebaut sein.<\/p>\n<p>Unter VBA kennen wir die folgenden Schleifentypen:<\/p>\n<ul>\n<li><b>For&#8230;Next<\/b>-Schleife: Diese Schleife hat eine Laufvariable mit einem Zahlendatentyp sowie einen Start- und einen Endwert. Mit einer zus&auml;tzlichen Option k&ouml;nnen wir festlegen, dass nicht jeder, sondern nur jeder x-te Wert ber&uuml;cksichtigt wird oder auch dass die Werte in umgekehrter Reihenfolge durchlaufen werden.<\/li>\n<li><b>For Each<\/b>-Schleife: Die <b>For Each<\/b>-Schleife durchl&auml;uft alle Elemente einer Auflistung. Dabei wird der Laufvariablen dieses Schleifentyps jeweils das aktuelle Element der Auflistung zugewiesen.<\/li>\n<li><b>Do While<\/b>-Schleife: Diese Schleife wird solange durchlaufen, wie die angegebene Bedingung erf&uuml;llt ist. Dementsprechend haben die in der Schleife enthaltenen Anweisungen in der Regel Einfluss auf den als Bedingung angegebenen Ausdruck. Diese Schleife gibt es in zwei Ausf&uuml;hrungen &#8211; mit der Abbruchbedingung in der ersten und in der letzten Zeile.<\/li>\n<li><b>Do Until<\/b>-Schleife: Im Gegensatz zur <b>Do While<\/b>-Schleife, die solange durchlaufen wird, wie die Bedingung erf&uuml;llt ist, l&auml;uft die <b>Do Until<\/b>-Schleife solange, bis die Bedingung erf&uuml;llt ist. Auch die <b>Do Until<\/b>-Schleife gibt es in zwei Ausf&uuml;hrungen, von denen die eine die Bedingung in der ersten Zeile pr&uuml;ft und die andere in der letzten Zeile.<\/li>\n<\/ul>\n<h2>Beispiele<\/h2>\n<p>Die ersten Beispiele zu diesem Artikel findest Du in in der Excel-Datei <b>VBABasics_Schleifen.xlsm<\/b> oder in der Access-Datenbank <b>VBABasics_Schleifen.accdb<\/b>.<\/p>\n<h2>For&#8230;Next-Schleife<\/h2>\n<p>Die <b>For&#8230;Next<\/b>-Schleife zeichnet sich dadurch aus, dass zu Beginn festgelegt wird, wie oft die enthaltenen Anweisungen durchlaufen werden.<\/p>\n<p>Um nachzuhalten, wie oft die Anweisungen innerhalb der Schleife bereits durchlaufen wurden, wird eine sogenannte Laufvariable verwendet, die meistens <b>i <\/b>genannt wird. F&uuml;r diese Variable legt man einen Zahlendatentyp wie <b>Integer <\/b>oder <b>Long <\/b>fest. Wenn Du den Typ <b>Integer <\/b>w&auml;hlst, musst Du den recht kleinen Wertebereich von <b>-32.768 <\/b>bis <b>32.767 <\/b>beachten.<\/p>\n<p>Die erste Zeile der <b>For&#8230;Next<\/b>-Schleife enth&auml;lt au&szlig;erdem noch den ersten und den letzten Wert sowie gegegebenfalls eine Schrittweite. Die Standardschrittweite lautet <b>1<\/b>. Man gibt nur in Ausnahmef&auml;llen eine alternative Schrittweite an &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Die letzte Zeile einer <b>For&#8230;Next<\/b>-Schleife enth&auml;lt lediglich das <b>Next<\/b>-Schl&uuml;sselwort und optional den Namen der Laufvariablen. Insgesamt sieht eine <b>For&#8230;Next<\/b>-Schleife, die beispielsweise mit den Werten von <b>1 <\/b>bis <b>10 <\/b>f&uuml;r die Variable <b>i <\/b>durchlaufen werden soll, wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 1 To 10\r\n     <span style=\"color:blue;\">Debug.Print<\/span> i\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Innerhalb der <b>For&#8230;Next<\/b>-Schleife wird der Wert von <b>i <\/b>im Direktfenster ausgeben. Dort erscheinen beim Aufrufen der Prozedur <b>ForNext_Einfach <\/b>des Moduls <b>mdlBeispieleSchleifen <\/b>der Beispieldatenbank also die Zahlen von <b>1 <\/b>bis <b>10<\/b>. Der Ablauf der <b>For&#8230;Next<\/b>-Schleife wird auch vom Flussdiagramm in Bild 1 skizziert. Die Schleife startet mit dem Wert <b>1 <\/b>f&uuml;r die Variable <b>i<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_343_003.png\" alt=\"Diagramm f&uuml;r den Ablauf einer einfachen For...Next-Schleife\" width=\"574,6265\" height=\"198,9092\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Diagramm f&uuml;r den Ablauf einer einfachen For&#8230;Next-Schleife<\/span><\/b><\/p>\n<p>Enth&auml;lt <b>i <\/b>einen Wert kleiner oder gleich dem Endwert der Schleife, werden die Anweisungen des Schleifenk&ouml;rpers ausgef&uuml;hrt und <b>i <\/b>um eins erh&ouml;ht.<\/p>\n<h2>Monate ausgeben<\/h2>\n<p>Die Laufvariable k&ouml;nnen wir gleich sinnvoll nutzen. Das folgende Beispiel durchl&auml;uft etwa die Zahlen von <b>1 <\/b>bis <b>12 <\/b>und gibt die entsprechenden Monatsnamen aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 1 To 12\r\n     <span style=\"color:blue;\">Debug.Print<\/span> Format(\"1.\" & i & \".\" & Year(Date), _\r\n        \"mmmm\")\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<h2>Schrittweite mit Step einstellen<\/h2>\n<p>Der <b>For&#8230;<\/b>-Zeile k&ouml;nnen wir noch das Schl&uuml;sselwort <b>Step<\/b> mit der gew&uuml;nschten Schrittweite hinzuf&uuml;gen.<\/p>\n<p>Wenn wir die Zahlen von <b>10 <\/b>bis <b>1 <\/b>r&uuml;ckw&auml;rts durchlaufen m&ouml;chten, geben wir als Startwert <b>10<\/b>, als Endwert <b>1 <\/b>und f&uuml;r <b>Step <\/b>den Wert <b>-1 <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 10 To 1 Step -1\r\n     <span style=\"color:blue;\">Debug.Print<\/span> i\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<h2>Exit For<\/h2>\n<p>Gelegentlich werden wir eine <b>For&#8230;Next<\/b>-Schleife vorzeitig verlassen wollen. In diesem Fall k&ouml;nnen wir die <b>Exit For<\/b>-Anweisung verwenden:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 1 To 10\r\n     <span style=\"color:blue;\">Debug.Print<\/span> i\r\n     <span style=\"color:blue;\">If <\/span>i = 5<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit For<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<h2>Verschachtelte Schleifen<\/h2>\n<p>M&ouml;glicherweise m&ouml;chten wir einmal zwei oder mehr verschachtelte Schleifen verwenden. Dazu ben&ouml;tigen wir entsprechend viele Laufvariablen, im folgenden Beispiel <b>i <\/b>und <b>j<\/b>: <\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 1 To 5\r\n     For j = 1 To 5\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"(\" & j & \",\" & i & \")\",\r\n     <span style=\"color:blue;\">Next<\/span> j\r\n     <span style=\"color:blue;\">Debug.Print<\/span>\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Die obigen Schleifen geben eine Zahlenmatrix wie in Bild 2 aus. Damit jeweils f&uuml;nf Eintr&auml;ge nebeneinander ausgegeben werden, beenden wir die <b>Debug.Print<\/b>-Anweisung der inneren Schleife mit dem Komma-Zeichen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_343_002.png\" alt=\"Ausgabe einer Zahlenmatrix mit zwei verschachtelten Schleifen\" width=\"524,6265\" height=\"180,9388\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausgabe einer Zahlenmatrix mit zwei verschachtelten Schleifen<\/span><\/b><\/p>\n<p>Dies bedeutet, dass die folgende <b>Debug.Print<\/b>-Anweisung in die gleiche Zeile drucken soll &#8211; und zwar mit einem Tabulator-Schritt als Abstand.<\/p>\n<p>Wir k&ouml;nnen auch das Semikolon als letztes Zeichen angeben. Die Ausgabe wird dann unmittelbar hinter dem letzten Zeichen fortgesetzt.<\/p>\n<p>Damit die Ausgabe nach f&uuml;nf Elementen in der folgenden Zeile fortgesetzt wird, ruft die Prozedur nach der Abarbeitung der inneren Schleife eine <b>Debug.Print<\/b>-Anweisung ohne auszugebenden Text auf.<\/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>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000\"><a style=\"color: #ff0000\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000\">Danach greifen Sie sofort auf <strong>alle rund 200 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:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000343\/\">\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=\"\/data\/wp\/v2\/posts\/55000343?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:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000343\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"bf09018a47\"\/>\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>Wenn wir in VBA einen Vorgang mehr als einmal durchf&uuml;hren wollen, verwenden Sie dazu eine sogenannte Schleife. Davon gibt es verschiedene Arten: Einige, wie die For&#8230;Next-Schleife und die For Each-Schleife, werden entsprechend einer vorgegebenen Anzahl durchlaufen, andere solange, wie eine bestimmte Bedingung erf&uuml;llt ist &#8211; so zum Beispiel die Do While-Schleife. Dieser Artikel stellt die verschiedenen Schleifenarten vor und zeigt, welche sich f&uuml;r welchen Einsatzzweck eignet.<\/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":[662022,66062022,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000343","post","type-post","status-publish","format-standard","hentry","category-662022","category-66062022","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000343"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000343\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000343"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}