"For"-Loop in VBA

Bei Makros kann man jeden Befehl einzeln programmieren oder aufzeichnen. In einer ersten Einführung in die VBA-Umgebung habe ich Dir gezeigt, wie Du mit dem Makro-Rekorder arbeiten kannst und schnell zu mehr Code kommst. Sich wiederholende Befehle kann man selbstverständlich alle einzeln in Code schreiben. Es ist jedoch deutlich übersichtlicher, wenn Du Wiederholungen mit sogenannten Loops (Schleifen) programmierst. In diesem Beitrag möchte ich Dir die "For"-Schleife zeigen.

Mit diesem Loop kannst Du einen Befehl x-beliebig ausführen lassen. Mit dem nachfolgenden Code wird im Bereich A1:A10 jeweils "Mein erster Loop" geschrieben:

For x = 1 To 10
Cells(x, 1) = "Mein erster Loop"
Next

Betrachten wir die einzelnen Bestandteile genauer: Der Loop beginnt mit "For". Danach verwenden wir X als Variable, beginnend bei 1 bis 10. In der zweiten Code-Zeile verwenden wir "Cells" - also Zelle. In Zelle "x, 1" soll unser Text geschrieben werden. Wichtig zu beachten ist, dass in "Cells" die Reihenfolge gegenüber Excel umgekehrt ist - es beginnt hier mit der Zeile (Row), danach wird erst nach der Spalte (Column) gefragt. In Excel ist zuerst die Spalte und dann die Zeile anzugeben (beispielsweise A1). Der Befehl "Next" erweitert das X um eins und die Schlaufe wird erneut durchlaufen. Probier es mal aus und führe Dein Makro mit F8 Schritt für Schritt aus. Du kannst mit dem Cursor auf X bleiben, dann zeigt es Dir jeweils den aktuellen Wert der Variable an. Zu Beginn ist dies "x = Leer", danach nimmt es die Werte 1 bis 10 an.

Weitere Anwendungsbereiche

Abhängig von Deinem spezifischen Makro kann diese For-Schleife in unterschiedlicher Form zur Anwendung kommen. Im ersten Beispiel oben hast Du Dich auf die Zeile bezogen. Dasselbe funktioniert natürlich auch mit der Spalte [Cells(1, x)]. Eine weitere Möglichkeit besteht darin, eine Zelle auf dessen Wert zu überprüfen. In der nachfolgenden Datenbank soll das Geschlecht jeweils ausgeschrieben werden (W = Weiblich; M = Männlich).

For-Schleife

Dazu schreiben wir folgenden Code:

For x = 2 To 7
If Cells(x, 1) = "M" Then
Cells(x, 2) = "Männlich"
End If
If Cells(x, 1) = "W" Then
Cells(x, 2) = "Weiblich"
End If
Next

Die For-Schleife beginnt diesmal bei X = 2. Danach findet eine Überprüfung mittels "If-Then" statt. Pro Durchlauf habe ich jeweils nach "M" und anschliessend nach "W" gesucht - einfacher wäre die Verwendung von "If-Then-Else", also "Wenn-Dann-Sonst". Ich decke diesen Fall nicht in diesem Beitrag ab, Du kannst das aber gerne selbst ausprobieren!

Den letzten Fall, den ich noch aufzeigen möchte, ist das Entfernen von Zeilen. Nehmen wir an, wir möchten nur die weiblichen Personen angezeigt haben. Unsere Überprüfung soll also nach "M" suchen und in dem Fall die gesamte Zeile entfernen. Der Code dazu lautet wie folgt:

For x = 2 To 7
If Cells(x, 1) = "M" Then
Rows(Cells(x, 1).Row).Delete
x = x - 1
End If
Next

Der Check in den ersten beiden Zeilen bleibt gleich wie im oberen Beispiel. Danach wird die Zeile der Zelle "x, 1" entfernt. Da sämtliche unteren Zeilen nach oben rücken, müssen wir in dem Fall x unbedingt wieder um 1 zurücksetzen, ansonsten werden einzelne Zeilen ungewollt übersprungen. Je nach dem, wie Deine Daten angeordnet sind, kannst Du mit "x - 1" oder "x + y" y-beliebig viele Zeilen überspringen, bevor Dein Loop wieder zur Anwendung kommt. Deine Variable in der For-Schleife bezieht sich dann nicht auf die Zeile selbst, sondern auf den Fall Nummer x. Dein Loop verarbeitet somit x-beliebige Fälle - und den Code dazu brauchst Du nur ein einziges Mal zu erfassen.

Natürlich könnten sämtliche dieser Befehle leicht in Excel mittels Formel "WENN", dem Setzen eines Filters und dem Löschen der jeweiligen Zeilen vorgenommen werden. Falls es sich aber um eine grosse Tabelle handelt, oder ein wiederkehrender Prozess vorliegt, kann das Makro abgespeichert und jederzeit aufgerufen werden - es lediglich ein initialer Aufwand zur Programmierung notwendig, danach entstehen erhebliche Zeitgewinne und das Fehlerpotenzial wird minimiert (sofern alles korrekt programmiert wurde).

Einführung in die Makro-Umgebung (VBA)

Makros werden programmiert, um insbesondere wiederkehrende Tätigkeiten automatisch auszuführen. Beispielsweise können Daten direkt von Excel – oder eben durch ein Makro – zu einem Diagramm verarbeitet werden. Auch Formatierungen können so automatisiert werden. Es gibt natürlich noch viele weitere Möglichkeiten mit Makros, aber wir wollen uns hier erstmal auf die Basics fokussieren.

Um zu einem Makro zu gelangen, werden nicht zwingend Programmierkenntnisse in VBA (Visual Basic for Applications) benötigt – man kann die vorzunehmenden Tätigkeiten nämlich mit dem “Makro Recorder“ aufzeichnen. Jeder Schritt, den man in Excel vornimmt, wird direkt aufgenommen und in Code geschrieben.

Eine solche Aufzeichnung kannst Du starten, indem Du im Menüband auf “Ansicht“ und dann ganz rechts auf “Makros“ → “Makro aufzeichnen“ klickst. Eine weitere Möglichkeit besteht, indem Du einen Rechtsklick auf beispielsweise “Ansicht“ im Menüband machst und auf “Menüband anpassen“ klickst. Auf der rechten Seite kannst Du bei “Entwicklertools“ einen Haken setzen, um einen weiteren Menüpunkt anzuzeigen – darin findest Du ebenfalls den Button “Makro aufzeichnen“.

Bevor die Aufzeichnung startet, kann dem Makro noch ein Name gegeben werden. Wichtig zu beachten ist, dass keine Leerzeichen erlaubt sind. Während die Aufzeichnung läuft, kannst Du Formatierungen vornehmen, in Zellen etwas reinschreiben etc. – den Code dazu kannst Du Dir gleich anschauen: Nach der Aufzeichnung (nun heisst der Menüpunkt nicht “Makro aufzeichnen“ sondern “Aufzeichnung beenden“) können die aufgezeichneten Schritte via ALT+F11 eingesehen werden. Mit einem Doppelklick auf “Modul1“ wird der Code ersichtlich:

VBA-Einfuehrung

Es gilt ferner zu beachten, dass in VBA die Sprache Englisch ist. Formeln, Befehle und so weiter sind also nicht auf Deutsch. Bei der Aufzeichnung wird dies jedoch automatisch übersetzt.

Öffnet man nun eine zu bearbeitende Excel-Tabelle (oder löscht man die bei der Aufzeichnung getätigten Änderungen in der Tabelle), kann man aus dem Modul1 via dem Button oberhalb des Codes (oder mit F5 auf der Tastatur) das Makro ausführen. Voilà – Du hast soeben Dein eigenes Programm erstellt!

Wie geht es nun weiter?

Das Aufzeichnen eines Makros ist eine sehr gute Möglichkeit, um Dir die Programmiersprache anzueignen. Du kannst einfache Befehle, die Du kennst, aufzeichnen und dann im Modul den Code interpretieren. Um Dein Programm zu analysieren, eignet sich die Taste F8 – damit führst Du Dein Makro Schritt für Schritt aus und Du kannst genau sehen, was bei jeder Zeile von Code tatsächlich gemacht wird. Die beim Drücken von F8 gelb markierte Codezeile wird als nächstes ausgeführt werden. Es eignet sich hierzu, Deine Exceltabelle auf die eine Bildschirmhälfte (oder auf den einen Bildschirm, falls Du mehrere hast) und VBA auf die andere zu nehmen, denn so kannst Du die Vorgänge gleich live mitverfolgen.

Du hast sicherlich bemerkt, dass vereinzelte Zeilen in Deinem Makro grün sind und mit einem Apostroph (‘) beginnen. Das sind Kommentare und sie werden nicht ausgeführt. Als Entwickler kannst Du so sämtliche Prozeduren umschreiben und erklären, damit sowohl Du als auch andere mögliche Personen die Vorgänge besser verstehen. Programmierer kommentieren häufig vorübergehend einzelne Codeblöcke aus, um diese nicht auszuführen oder daran zu arbeiten. Wenn Du also eine Codezeile vorläufig nicht ausführen möchtest, füge einfach ein Apostroph vorne dran. In der Symbolleiste “Bearbeiten“ gibt es übrigens einen Button, womit Du gleich ganze (zuerst markierte) Codeblöcke auskommentieren kannst. Du findest diese via “Ansicht“ → “Symbolleisten“.

Du hast nun gelernt, wie Du Deinen Code analysieren kannst. Doch was, wenn Du Dein Makro noch um weitere Befehle erweitern möchtest? Gerade am Anfang kennt man sich in der Programmiersprache noch nicht aus. Deshalb empfehle ich, einfach ein neues Makro über die zusätzlichen Schritte aufzuzeichnen. Du wirst den Code wiederum in Deinem VBA-Fenster in dem erstellten Modul finden. Du kannst nun einfach den Code markieren, entweder kopieren oder ausschneiden, und in Deinem Haupt-Makro an der entsprechenden Stelle einfügen. Das “Hilfsmakro“ für den neuen Code kannst Du komplett entfernen, indem Du alles markierst und mit “Delete“ auf Deiner Tastatur löschst. So gelangst Du sehr schnell an Dein Ziel!

Der wohl einfachste Weg, um Dein Makro später wieder auf andere Excel-Tabellen anwenden zu können, ist, das Modul zu exportieren. Mache hierzu einen Rechtsklick auf “Modul1“ und gehe auf “Datei exportieren…“. Speichere das Modul an der gewünschten Stelle ab. Um das Makro zu einem späteren Zeitpunkt wiederzuholen steigst Du via ALT+F11 in das VBA-Fenster und klickst nach einem Rechtsklick auf den Bereich (oder über “Datei“ in der Menüleiste), wo das Modul1 vorhin war, auf “Datei importieren…“. Danach kannst Du Dein Makro ausführen und Deine Datei wird von selbst bearbeitet – toll, oder?!

Was gilt es zusätzlich zu beachten?

Dein Programm macht selbstverständlich nur das, was Du ihm sagst. Code ist sehr präzise, Dein Programm wird also nicht einfach ohne weiteres ein mögliches Szenario interpretieren… So kann es auch zu Fehlern in Deinem Makro kommen und Du musst “Debugging“ betreiben – also einen Fehler beheben. VBA zeigt Dir jeweils an, in welcher Codezeile das Programm beim Ausführen einen “Bug“ hatte. Analysiere diesen Code genau. Wenn Du nicht weiter weisst, kannst Du auf Google nach diesem Problem oder nach dem Schritt suchen, den Du eigentlich hättest ausgeführt haben wollen. Ich empfehle Dir, bei Google stets mit den Begriffen “VBA“ oder “Makro“ zu beginnen – damit grenzt Du Deine Suche gleich ein. Selbstverständlich kannst Du auch auf Excelblog.ch nachfragen! Generell lernst Du durch “Debuggen“ wohl am meisten. Es kann jedoch mühselig sein, aber einen Fehler erfolgreich zu beheben und danach ein sauber laufendes Programm zu haben ist echt ein erfüllendes Gefühl!