VBA For Schleife
Inhaltsverzeichnis
- 1 VBA For Schleife
- 2 Ein Teil der Infrastruktur
- 3 Nicht aus dem Luftverkehr
- 4 Denke z. B. an ein Kartenspiel
- 5 Schleifen-Arten
- 6 Der Bezug zum Code – VBA For Schleife
- 7 VBA For Schleife selbst (zählergesteuert)
- 8 VBA For Schleife (zählergesteuert) rückwärts
- 9 Ein weiteres VBA For Schleife Beispiel (objektgesteuert)
VBA For Schleife
Du möchtest die VBA For Schleife zum Durchlaufen von z. B. Zellen verwenden, oder verstehen, was Schleifen sind?
Dann starte jetzt durch und lerne in meinem heutigen Beitrag alles Wissenswerte über das für die Programmierung essentielle Thema namens „Schleifen„.
Vielleicht möchtest Du zu einem späteren Zeitpunkt auch in meine folgenden anderen Beiträge reinschauen: MsgBox, Range, VBA Array.
Ein Teil der Infrastruktur
Schleifen sind in der Programmierung ein essentieller Teil der Infrastruktur und somit so gut wie in jeder Sprache ein häufig genutzten Basis-Werkzeug.
Nicht umsonst ist das so, denn wir müssen an verschiedenen Stellen im Programmablauf gewisse Dinge wiederholen.
Die Konditionen, bzw. Bedingungen für diese Wiederholungen können unterschiedlicher Natur sein und können sich während des Programmablaufs verändern.
Manchmal möchten wir Objekte durchlaufen, manchmal möchten wir Prozeduren und Sub-Prozeduren anhand einer gewissen Anzahl an Durchläufen wiederholen.
Nicht aus dem Luftverkehr
Anders als man eventuell als Nicht-Entwickler denken könnte, haben Schleifen in der Softwareentwicklung nichts mit „eine Schleife fliegen“ zu tun.
Okay, zugegebenermaßen wiederholen Flugzeuge ja beim Schleifen–Ziehen auch vermutlich gewisse Muster – insofern ich das beurteilen kann..
Daher läuft es zumindest ähnlich bei einer Schleife in der Softwareentwicklung ab, da auch dort gewisse Prozesse wiederholt, oder zumindest ähnlich abgearbeitet werden.
Denke z. B. an ein Kartenspiel
Stell‚ Dir mal ein gutes altes Kartenspiel wie z. B. Mau-Mau, oder auch Skip-Bo wenn Du möchtest vor.
Meistens werden in den gängigen Spielen aus einem vorhandenen Deck eine gewisse Anzahl an Karten gezogen.
Diese müssen natürlich einerseits aus dem Deck verschwinden und andererseits in Deine Hand aufgenommen werden.
So wie ich die Mau-Mau Regeln kenne, zieht jeder Spieler zu Beginn des Spiels 7 Karten aus dem Deck und sortiert Diese wie Ihm beliebt.
Dabei haben wir auch schon ein wichtiges Kriterium a la „7 Karten“ genannt, wir haben also eine Art Zähler.
Der Zähler gibt dabei an, wie oft der Inhalt der Schleife, also der „Zieh eine Karte“-Prozess wiederholt werden soll.
Dadurch wird der sogenannte Body (der Inhalt) der Schleife, anhand einer gewissen Anzahl von Wiederholungen ausgeführt.
Schleifen-Arten
In der Programmierung unterscheiden wir gängigerweise zwischen zwei verschiedene Arten von Schleifen. Die Ausführung, bzw. die genauere Steuerung des Schleifeninhalts kann unter Umständen variieren.
In einigen Fällen müssen wir eventuell erst ein bestimmtes Kriterium überprüfen und anschließend den Inhalt der Schleife ausführen.
In anderen Fällen müssen wir hingegen eventuell die Prüfung für die Ausführung an das Ende der Schleife verlagern.
Siehe Dir dazu das folgende Bild genauer an:
Wie in dem Teil hier drüber bereits angeschnitten, gibt es einerseits die zählergesteuerte Schleife. Die Anzahl der Wiederholungen einer zählergesteuerten Schleife wird anhand eines Zählers festgelegt. Der Zähler kann dabei natürlich aus unterschiedlichen Quellen wie z. B. einer Variable, oder eines Zellenwertes kommen.
Kopfgesteuerte Schleifen
Bei den Kopfgesteuerten Schleifen handelt es sich um ein Schleifenkonstrukt, Welches die Bedingung zur Ausführung im Kopf prüft.
Falls und auch nur wenn die Bedingung erfüllt ist, wird der Body, also der Inhalt der Schleife ausgeführt und anschließend wieder zum Kopf gesprungen.
Danach folgt eine erneute Prüfung und eine eventuelle neue Durchführung – eine Schleife ist geboren!
Fußgesteuerte Schleifen
Der nächste Schleifen-Typ wäre die fußgesteuerte Schleife, Welche analog zur obigen funktioniert.
Hierbei wird allerdings die Überprüfung der Bedingung erst im Fuß durchgeführt.
Das hat dann zur Folge, dass der Body der Schleife zuerst ausgeführt wird und erst im Fuß eine erneute Ausführung erörtert wird.
Der Bezug zum Code – VBA For Schleife
Fangen wir nun einmal an, mit dem folgenden Beispiel den konkreten Bezug zum Code herzustellen. Dabei ist es wichtig zu verstehen, in welchem Kontext die Schleifen arbeiten. Andererseits sollte man diverse gängige Fehler durch die Verwendung von Schleifen vermeiden.
Prozesse, bzw. Unterprozesse aufrufen
Viele anfängliche Excel-Programmierer verwenden Code wie gleich demonstriert. Sei es aus welchen Beweggründen auch immer: Unwissen, Unsicherheit, etc. Leider ist die dann entstehende Vorgehensweise wie wir gleich sehen werden, aus diversen Gründen nicht sehr vorteilhaft.
Stellen wir uns dafür vor, dass wir folgende 3 Unterprozesse haben, die zusammen letztendlich z. B. eine Email versenden sollen:
' Deck prüfen ' HandPrüfen ' das Karten ziehen selbst
Manuell mehrfach aufrufen
Falls man bisher noch keine Berührungspunkte mit Schleifen hatte, könnte man in die bekannteste Versuchung kommen (nicht seit es Schokolade gibt – wer die Werbung noch kennt!).
Dieser jemand würde also die obigen drei Schritte – hier einfach nur als Kommentare dargestellt – ggf. so aufrufen:
' Deck prüfen ' HandPrüfen ' das Karten ziehen selbst ' Deck prüfen ' HandPrüfen ' das Karten ziehen selbst ' .... pro Spieler wiederholen
Die Nachteile – bitte nicht machen!
Die dabei auftretenden Probleme stechen einem unerfahrenen Programmierer häufig nicht direkt ins Auge.
Folgeänderungen
Früher oder später wird man allerdings z. B. auf das Problem stoßen, dass Änderungen an Schritt 2 alle 5 Code-Blöcke betreffen.
Man müsste also um praktisch eine Sache zu ändern, 5 Punkte anpassen und je nachdem wie groß der jeweilige Punkt ist, hat man auch den Aufwand – würg!
Dieses Problem könnte natürlich durch den Bau einer Sub gelöst werden. Konzentriere dich hierbei bitte nicht zu sehr auf eine Art Implementierung, also die Vorgehensweise selbst. Versuche nach Möglichkeit den abstrakten Weg dahinter zu verstehen. Die konkrete Ausführung des Ziehens selbst ist hier eher irrelevant, viel mehr spielt die Struktur eine Rolle!
Sub KartenZiehen(anzahlKarten As Integer, spieler As Integer) ' Deck prüfen ' HandPrüfen ' das Karten ziehen selbst For i As Integer = 1 To anzahlKarten ' realisiere das Ziehen der Karten.. Next End Sub
Der Aufruf würde dann durch die Verwendung der Sub so aussehen:
KartenZiehen(7, 1) KartenZiehen(7, 2)
Das ist natürlich auch nicht wirklich besser, wenn wir an das Beispiel mit dem Kartenspiel denken, denn allein die Formulierung macht es aus:
"..beim Start des Spiels, zieht jeder Spieler X Karten"
Duplicated Code
Ein weiteres Problem, Welches der obige Code ganz klar an den Tag legt, ist das Vorhandensein von „Duplicated Code„.
Wir wiederholen also bestehenden Code, statt ihn korrekterweise in einer Schleife aufzurufen.
Jedes Mal, wenn man z. B. die Bezeichnung der Sub ändern würde, müsste man im schlimmsten Fall alle anderen Vorkommnisse manuell ändern.
Natürlich gibt es auch Funktionen der Entwicklungsumgebung, Welche uns dabei helfen könnten, allerdings ist das ja nicht das Ziel des Ganzen.
VBA For Schleife selbst (zählergesteuert)
Kommen wir nun zur For–Schleife bezogen auf das Beispiel selbst, womit wir die obigen Probleme vermeiden. Auch wenn es hier vermutlich besser wäre eine „For Each“-Schleife zu verwenden.. Das Thema hier ist ja schließlich die For- also eine Zählergesteuerte Schleife!
Dim startHandKartenZahl As Integer startHandKartenAnzahl = 7 Dim spielerNr As Integer For spielerNr = 1 To 2 KartenZiehen(7, spielerNr) Next
Diese Schleifen-Art nennt man auch zählergesteuerte und kopfgesteuerte Schleife, denn Sie benutzt eine Zähler–Variable namens „spielerNr“.
Ebenso verwendet die Schleife die Bedingung zur Ausführung im Kopf, dass heißt, dass die Schleife nur ausgeführt wird, solange und nur wenn die Bedingung im Kopf „True“ ergibt.
VBA For Schleife (zählergesteuert) rückwärts
Besonders cool ist auch die Möglichkeit die Schleife mit wenig Aufwand einfach rückwärts laufen zu lassen. In diesem Fall würde also statt der Spieler 1, der Spieler 2 seine Karten zuerst bekommen.
Es kann ja nicht immer nur Mario an Platz 1 sein, sondern auch mal Luigi!
For spielerNr = 2 To 1 Step -1 KartenZiehen(7, spielerNr) Next
Ein weiteres VBA For Schleife Beispiel (objektgesteuert)
Ein weiteres nützliches Beispiel für eine VBA For Schleife wäre – ich nenne es mal – das objektgesteuerte Beispiel.
Statt wie oben mit einer Zähler-Variable zu arbeiten, verwendet man hierbei die tatsächlichen Objekte an sich als Iterationsmöglichkeit.
Eine einfache Erklärung könnte z. B. die gute alte Chipstüte bieten, klingt zwar komisch, ist aber so!
Ich glaube jeder stand schon mal, bzw. steht immer wieder vor dem „Problem“ nicht aufhören zu können.
Statt nach einer kleinen Portion bereits aufzuhören – was vermutlich auch dem ein oder anderen Fettpölsterchen gut täte – wird immer weiter gefuttert.
So könnte man auch bei einer „objektgesteuerten“ For Schleife verfahren, wörtlich gesprochen wie folgt:
- „Für“ jeden einzelnen Chip
- Nehme den Chip in die Hand
- Führe den Chip in den Mund (öffnen und schließen lasse ich jetzt mal weg..)
..Du merkst vermutlich worauf das hier hinausläuft.
Der letztendlich für das Dein Verständnis relevante Part ist hier das „Für jeden einzelnen Chip..“.
Alle Chips in der Tüte essen – yummy
Siehe Dir folgendes Beispiel einer VBA Schleife an, um zu verstehen wie ich obigen Pseudocode meine.
Beachte jedoch, dass ich hier die Deklarationen, bzw. Initialisierungen der Variablen erstmal weglasse..
Die „chips“-Auflistung kann z. B. auch durch den Aufruf, also als Rückgabewert einer Funktion zustande kommen.
For Each chip In chips Person.Essen(chip) Next
Alle Strings eines Arrays durchlaufen
Ich denke, es ist noch einfacher, oder eher näher am Code, wenn Du das folgende Beispiel siehst:
' deklariere ein neues Array der Größe 3 Dim namen(0 To 2) As String ' befülle das Array mit Namen namen(0) = "Robert" namen(1) = "John" namen(2) = "Debbie" For Each name In namen ' mach irgendwas mit dem Namen ' in der Variable "name" Next
Natürlich funktioniert diese Vorgehensweise auch mit anderen primitiven Datentypen wie z. B. Integern, oder Dates.