{"id":55000336,"date":"2022-08-01T00:00:00","date_gmt":"2023-03-02T17:00:02","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=336"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBA_Basics_Bedingungen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/VBA_Basics_Bedingungen\/","title":{"rendered":"VBA Basics: Bedingungen"},"content":{"rendered":"<p><b>Wenn man in VBA-Routinen bestimmte Anweisungen in Abh&auml;ngigkeit von einem Wert einer Variablen, einer Eingabe oder anderen Bedingungen ausf&uuml;hren lassen m&ouml;chte, verwendet man sogenannte Bedingungen. Unter VBA gibt es dazu die If&#8230;Then-Bedingung und die Select Case-Bedingung. Streng genommen gibt es noch einige VBA-Funktionen, die auch Bedingungen enthalten. Diese schauen wir uns aber in einem anderen Artikel an. Hier geht es zun&auml;chst um die beiden genannten Konstrukte.<\/b><\/p>\n<p>Manche Prozeduren oder Funktionen unter VBA erfordern es, dass abh&auml;ngig von bestimmten Voraussetzungen unterschiedliche Anweisungen ausgef&uuml;hrt werden sollen. Ein einfaches Beispiel: Wenn Du per <b>MsgBox<\/b>-Funktion vom Benutzer einen der Werte <b>vbYes <\/b>oder <b>vbNo <\/b>abfragst, dann wirst Du im Code auch f&uuml;r die beiden Eingaben jeweils eigene Anweisungen ausf&uuml;hren wollen. Wenn nur diese beiden M&ouml;glichkeiten bestehen, bist Du mit einer einfachen <b>If&#8230;Then<\/b>-Bedingung gut vorbereitet. Es kann auch sein, dass es noch mehr verschiedene Auswahlm&ouml;glichkeiten gibt. Dann w&uuml;rde man eine <b>If&#8230;Then<\/b>-Bedingung mit mehr als nur zwei Zweigen verwenden &#8211; oder vielleicht sogar eine <b>Select Case<\/b>-Bedingung, die das Verwalten mehrerer Zweige oft einfacher und &uuml;bersichtlicher macht.<\/p>\n<h2>Die If&#8230;Then-Bedingung<\/h2>\n<p>Eine <b>If&#8230;Then<\/b>-Bedingung kann nur aus einem einzigen Zweig bestehen, dessen Anweisungen nur bei der Erf&uuml;llung der angegebenen Bedingung ausgef&uuml;hrt werden. Die Bedingung ist im einfachsten Fall wie folgt aufgebaut:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>[Bedingung]<span style=\"color:blue;\"> Then<\/span>\r\n     [Anweisungen]\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p><b>[Bedingung]<\/b> kann dabei ein beliebiger Ausdruck sein,  der den Wert <b>True <\/b>oder <b>False <\/b>zur&uuml;ckliefert. Das Ergebnis des f&uuml;r <b>[Bedingung] <\/b>angegebenen Ausdrucks muss also den Datentyp <b>Boolean <\/b>aufweisen. Wenn <b>[Bedingung] <\/b>den Wert <b>True <\/b>ergibt, werden die zwischen <b>If&#8230;Then <\/b>und <b>End If <\/b>enthaltenen Anweisungen ausgef&uuml;hrt. Das sieht im einfachsten Fall wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolBedingung<span style=\"color:blue;\"> As Boolean<\/span>\r\nbolBedingung = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">If <\/span>bolBedingung<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"bolBedingung ist True\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Viele Entwickler schreiben die <b>If&#8230;Then<\/b>-Zeile in diesem Fall wie folgt:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>bolBedingung = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n...<\/pre>\n<p>Das ist nicht grunds&auml;tzlich falsch, aber <b>bolBedingung <\/b>enth&auml;lt bereits einen <b>Boolean<\/b>-Wert, der Vergleich mit <b>True <\/b>hat hier keinen zus&auml;tzlichen Nutzen und kostet lediglich Rechenzeit. Wenn Du allerdings im <b>If&#8230;Then<\/b>-Zweig pr&uuml;fen willst, ob die Bedingung nicht erf&uuml;llt ist, dann ben&ouml;tigen wir mindestens einen weiteren Operator. Die erste M&ouml;glichkeit ist der Vergleich mit dem Wert <b>False<\/b>:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>bolBedingung = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"bolBedingung ist False\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die zweite M&ouml;glichkeit ist der Einsatz des Operators <b>Not<\/b>:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolBedingung<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"bolBedingung ist False\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>In den folgenden Beispielen verwenden wir statt der <b>Boolean<\/b>-Variable einen richtigen Vergleichsausdruck, dessen Ergebnis wir mithilfe einer <b>MsgBox<\/b>-Anweisung ermitteln. Klickt der Benutzer auf <b>Ja<\/b>, erscheint die nachfolgend definierte Meldung:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>lngResult<span style=\"color:blue;\"> As <\/span>VbMsgBoxResult\r\nlngResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Ja oder Nein?\", vbYesNo)\r\n<span style=\"color:blue;\">If <\/span>lngResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Ja'' angeklickt.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<h2>Der Else-Zweig<\/h2>\n<p>In einer <b>If&#8230;Then<\/b>-Bedingung sind wir allerdings nicht darauf beschr&auml;nkt, nur Anweisungen f&uuml;r die im <b>If&#8230;Then<\/b>-Teil angegebene Bedingung auszuf&uuml;hren. Wir k&ouml;nnen auch Anweisungen ausf&uuml;hren, wenn die Bedingung nicht erf&uuml;llt ist. Die einfachste und universellste Variante daf&uuml;r ist der <b>Else<\/b>-Zweig.<\/p>\n<p>Im folgenden Beispiel behandeln wir den Fall, dass der Benutzer auf <b>Nein <\/b>klickt, im <b>Else<\/b>-Zweig:<\/p>\n<pre>lngResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Ja oder Nein?\", vbYesNo)\r\n<span style=\"color:blue;\">If <\/span>lngResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Ja'' angeklickt.\"\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Nein'' angeklickt.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Da <b>lngResult <\/b>nur die beiden Werte <b>vbYes <\/b>oder <b>vbNo <\/b>enthalten kann, wird <b>vbNo <\/b>im <b>Else<\/b>-Zweig abgehandelt. Wenn wir neben <b>Ja <\/b>und <b>Nein <\/b>noch weitere M&ouml;glichkeiten anbieten, zum Beispiel <b>Abbrechen<\/b>, w&uuml;rde der <b>Else<\/b>-Zweig auch diese behandeln:<\/p>\n<pre>lngResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Ja oder Nein?\", vbYesNoCancel)<\/pre>\n<p>Klickt der Benutzer also auf <b>Abbrechen<\/b>, zeigt die vorherige <b>If&#8230;Then<\/b>-Bedingung auch an, dass der Benutzer auf <b>Nein<\/b> geklickt hat. Um dies zu behandeln, gibt es noch den <b>ElseIf<\/b>-Zweig.<\/p>\n<h2>Der ElseIf-Zweig<\/h2>\n<p>Wenn wir nicht nur zwei M&ouml;glichkeiten auswerten wollen, m&uuml;ssen wir entsprechend mehr Zweige anbieten. Im Falle von <b>Ja<\/b>, <b>Nein <\/b>und <b>Abbrechen <\/b>f&uuml;gen wir im folgenden Beispiel eine weitere Unterscheidung hinzu, die gezielt auf den Wert <b>vbNo <\/b>untersucht. Alles, was nicht <b>vbYes <\/b>oder <b>vbNo <\/b>ist, wird im <b>Else<\/b>-Teil behandelt, in diesem Fall also <b>vbCancel<\/b>:<\/p>\n<pre>lngResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Ja oder Nein?\", vbYesNoCancel)\r\n<span style=\"color:blue;\">If <\/span>lngResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Ja'' angeklickt.\"\r\n<span style=\"color:blue;\">Else<\/span>If lngResult = vbNo Then\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Nein'' angeklickt.\"\r\n<span style=\"color:blue;\">Else<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Abbrechen'' angeklickt.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Wir k&ouml;nnten im <b>Else<\/b>-Teil auch explizit auf <b>vbCancel <\/b>pr&uuml;fen, indem wir diesen wie folgt in einen <b>ElseIf<\/b>-Zweig umwandeln:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>lngResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Ja'' angeklickt.\"\r\n<span style=\"color:blue;\">Else<\/span>If lngResult = vbNo Then\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Nein'' angeklickt.\"\r\n<span style=\"color:blue;\">Else<\/span>If lngResult = vbCancel Then\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Benutzer hat ''Abbrechen'' angeklickt.\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Das passt in diesem Fall, da wir genau drei F&auml;lle behandeln wollen. <\/p>\n<h2>Else-Zweig am Ende<\/h2>\n<p>Wenn Du einen <b>Else<\/b>-Zweig verwendest, musst Du diesen hinter allen verwendeten <b>ElseIf<\/b>-Zweigen einf&uuml;gen. Anderenfalls wird beim Kompilieren der Fehler aus Bild 1 ausgel&ouml;st.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_336_001.png\" alt=\"Fehler, wenn der Else-Zweig nicht am Ende steht\" width=\"499,6267\" height=\"293,7504\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Fehler, wenn der Else-Zweig nicht am Ende steht<\/span><\/b><\/p>\n<h2>Else-Zweig als Backup<\/h2>\n<p>In den meisten F&auml;llen wei&szlig; man vorher, welche Werte in einer <b>If&#8230;Then<\/b>-Bedingung verarbeitet werden sollen. Manchmal k&ouml;nnen jedoch auch Werte auftauchen, die man zuvor noch nicht kennt oder erwartet. In diesem Fall kann es sinnvoll sein, den <b>Else<\/b>-Zweig mit einer entsprechenden Meldung oder einer anderen Aktion auszustatten, mit der sowohl der Benutzer als auch der Entwickler informiert werden, wenn es unbehandelte F&auml;lle gibt.<\/p>\n<h2>Performance optimieren durch richtige Reihenfolge<\/h2>\n<p>Wenn Du Schritt f&uuml;r Schritt durch eine solche <b>If&#8230;Then<\/b>-Bedingung l&auml;ufst, stellst Du fest, dass die Bedingungen von oben nach unten gepr&uuml;ft werden und dass nach dem Erreichen einer g&uuml;ltigen Bedingung die im entsprechenden Zweig enthaltenen Anweisungen ausgef&uuml;hrt werden und die nachfolgenden Zweige nicht mehr untersucht werden.<\/p>\n<p>Da auch das schlichte Untersuchen der Bedingungen in einem <b>If&#8230;Then&#8230;ElseIf&#8230;Else<\/b>-Konstrukt Rechenzeit kostet und sich das beispielsweise bei vielen Wiederholungen in einer Schleife schnell auswirken kann, gibt es in manchen F&auml;llen eine sinnvolle Strategie zur Optimierung der Performance. Bei diesen F&auml;llen wei&szlig; man vorher, welche der Bedingungen &ouml;fter eintreten als die anderen. Diese tr&auml;gt man dann einfach in absteigender Priorit&auml;t von oben nach unten ein. Die wahrscheinlichste Bedingung landet also direkt im <b>If&#8230;Then<\/b>-Zweig, die unwahrscheinlichste ganz unten.<\/p>\n<h2>Einzeilige If&#8230;Then-Bedingung<\/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>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\/55000336\/\">\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\/55000336?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<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000336\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"1f69832577\"\/>\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 man in VBA-Routinen bestimmte Anweisungen in Abh&auml;ngigkeit von einem Wert einer Variablen, einer Eingabe oder anderen Bedingungen ausf&uuml;hren lassen m&ouml;chte, verwendet man sogenannte Bedingungen. Unter VBA gibt es dazu die If&#8230;Then-Bedingung und die Select Case-Bedingung. Streng genommen gibt es noch einige VBA-Funktionen, die auch Bedingungen enthalten. Diese schauen wir uns aber in einem anderen Artikel an. Hier geht es zun&auml;chst um die beiden genannten Konstrukte.<\/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,66042022,44000023,44000025,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000336","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-PowerApps","category-VBAProgrammierung","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000336","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=55000336"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000336\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000336"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}