heute soll's zum ersten mal um das Thema VBA gehen.
Was ist VBA? Und was ist ein Makro?
Für alle, die damit noch nix zu tun hatten erstmal ein paar grundlegende Infos. VBA ist eine sogenannte Scriptsprache. Sie ist weniger umfangreich, als höhere Programmiersprachen und bedient sich der Funktionen des Programms, zu dem sie gehört. VBA gehört zu Office, d.h. es macht sich alles das zu nutze, was die Office-Programme eh schon können.Code, den man mithilfe von VBA erstellt, kann man nicht als gesondertes Programm ausführen, sondern es handelt sich um "Erweiterungen" von z.B. Excel, die auch nur dort laufen. Der Code ist bei Excel z.B. in einer bestimmten Arbeitsmappe enthalten und kann nur in dieser ausgeführt werden.
Einige haben vielleicht auch schon den Begriff "Makro" gehört. Damit wird der Code bezeichnet - hin und wieder wird auch der Begriff "Script" verwendet.
Für die ersten Grundlagen in VBA verwende ich Excel, das das einfach die besten Möglichkeiten bietet und dort Makros auch am häufigsten Anwendung finden.
Kleiner Helfer - Der Makrorekorder
So, genug des Vorgeplänkels. Jetzt kann's losgehen. Standardmäßig schreibt man, wenn man eine Programmiersprache lernt für den Einstieg erstmal ein "Hallo Welt"-Programm. Das machen wir später. Ich möchte vorher auf ein zeitweise sehr nützliches Extra eingehen, das in einigen Office-Programmen zu finden ist: den Makro-Recorder. Der kann alles aufzeichnen, was in der Oberfläche (z.B. im Tabellenblatt) ausgeführt wird und übersetzt das in VBA-Code. Um Makros zu erstellen ist der nicht wirklich hilfreich, weil er einen ganz schrecklichen Programmierstil hat - das liegt aber in der Natur der Sache, weil er ganz einfach jeden einzelnen Schritt/Klick übersetzt, egal, ob der zum Erreichen des gewünschten Effektes notwendig ist oder nicht.Warum halte ich den Makrorekorder dann trotzdem für sinnvoll? Ganz einfach: Angenommen, man muss eine Tabelle per VBA filtern, weiß aber nicht, wie man den Filter zustande bringen soll, weil man den Befehl nicht kennt. Dann zeichnet man das Filtern kurz aus und kann dann im erstellen Code die Befehle und Parameter ablesen.
Nun zur Praxis. Das Beispiel halte ich ganz kurz und einfach. Es soll nur dazu dienen, dass klar wird, wie der Rekorder bedient wird und was er produziert.
Wir brauchen eine neue leere Arbeitsmappe. Der Makrorekorder und auch der Zugang zur Entwicklungsumgebung, die wir später brauchen ist in der Registerkarte "Entwicklertools" zu finden. Die ist standardmäßig ausgeblendet und wir müssen sie erstmal einblenden. Das ist in jeder Excelversion etwas anders.
Vorgehensweise für Excel 2010:
- Klick auf "Datei" (ganz links in der Registerkartenleiste)
- dann in der linken Leiste ziemlich weit unten auf "Optionen"
- Im sich öffnenden Fenster wählst du links "Menüband anpassen" aus
- im rechten Fenster "Hauptregisterkarten" setzt du ein Häkchen bei "Entwicklertools" und bestätigst mit OK
In Excel 2007:
- Klick auf die Office-Schaltfläche, den runden Button oben links
- Von dort geht es in die Excel-Optionen
- Hier findet sich die Registerkarte in der Rubrik "Häufig verwendet"
- Dort setzt du ein Häkchen bei "Entwicklerregisterkarte einblenden" und bestätigst ebenfalls mit OK
Aus dem Register "Entwicklertools" werden wir nur die wenigsten Befehle wirklich verwenden. Im Moment interessiert uns "Makro aufzchn."
Mit Klick auf dieses Symbol öffnen sich das Rekorderfenster. Hier können wir dem Makro einen Namen geben, wenn man es später weiterverwenden will, und auch eine Tastenkombination einstellen, die das Makro später aufruft. Beides lassen wir, wie es ist, da wir uns des Makrorekorders nur zum "Spicken" bedienen wollen.
Die nächste Option ist "Makro speichern in:". Wie bereits erläutert, ist das Makro Teil einer Arbeitsmappe. Excel möchte hier wissen, in welcher Arbeitsmappe das Makro abgespeichert werden soll. Folgende Optionen stehen zu Auswahl:
- Persönliche Arbeitsmappe: klingt etwas seltsam und bedarf weiterer Erläuterung. Die Persönliche Arbeitsmappe ist eine Exceldatei, die immer beim Hochfahren von Excel mitgeladen wird. Sie bleibt aber im Hintergrund und ist erst im VBA-Editor sichtbar. Die Persönliche Arbeitsmappe wird erst beim ersten Aufzeichnen eines Makros angelegt, das in dieser Arbeitsmappe abgespeichert wird. Sie liegt in einem festen Pfad und hat den Namen "Personal.xlsb". Diese Mappe ist wunderbar geeignet, um Makros zu speichern, die man immer wieder in anderen Arbeitsmappen braucht, da sie ja immer mit geöffnet wird.
- Neue Arbeitsmappe: es wird eine neue Arbeitsmappe angelegt, in der das Makro abgespeichert wird
- Diese Arbeitsmappe: das Mkro wird in der aktuellen Arbeitsmappe abgespeichert
Der Makrorekorder läuft, das sehen wir unter anderem daran, dass der Button in der Entwicklerregisterkarte, mit dem wir die Aufzeichnung gestartet haben jetzt die Aufschrift "Aufzeichnung beenden" trägt.
Alles, was von jetzt an in Excel passiert schreibt der Makrorekorder mit - ähnlich penibel wie ein Gerichtsschreiber.
- Um das deutlich zu machen, klicken wir erstmal in irgendeine andere Zelle, als die, die grade markiert ist.
- Danach wechseln wir auf ein anderes Arbeitsblatt.
- Produktiv ist noch nicht passiert. Das ändern wir jetzt. Auf der neuen Tabelle wählen wir irgendeine Zelle und tragen dort den Text "Hallo Welt" ein (damit haben wir schon sowas wie ein Hallo-Welt-Programm...). Bestätigen der Eingabe mit Enter und das war's dann auch schon, was wir dem Rekorder zu tun geben.
- Mit Klick auf "Aufzeichnung beenden" schalten wir ihn ab.
Jetzt sieht man vom Makro nicht allzu viel. Wo ist das jetzt hin? Genau da, wo aller andere Code auch liegt.
Alle frei zugänglichen Makros können über den Button "Makros" in der Entwicklerleiste aufgerufen und auch geändert werden. Das wollen wir jetzt ausprobieren:
- Wir löschen das eben geschriebene "Hallo Welt" aus der Zelle
- und wechseln in ein anderes Tabellenblatt.
- Jetzt ein Klick auf "Makros" - das zweite Symbol von links in der Entwicklerleiste.
- Im sich öffnenden Makro sollte nun idealerweise nur ein Eintrag zu finden sein - das Makro, welches wir eben aufgezeichnet haben. Sollten hier mehrere Elemente in der Liste stehen, dann suche bitte das Makro von eben heraus. Dieser Eintrag wird markiert.
- Ein Klick auf "Ausführen" startet das Makro.
Das ist ziemlich viel Hin- und Her-Gehüpfe, was nicht notwendig ist, aber eben genau das, was der Rekorder "mitgeschrieben" hat. Und das werden wir uns jetzt mal ansehen. Je nachdem, was wo markiert und eingetragen wurde, kann das bei dir auch anders aussehen. Das ist nicht weiter tragisch, hier geht's erstmal nur um die Arbeitsweise an sich.
An den Code kommen wir auf mehrere Arten ran. Ansehen können wir ihn nur im VBA-Editor - ein extra Fenster, das wir öffnen müssen. Das geht z.B. folgendermaßen:
- Klick in der Entwicklerregisterkarte auf "Visual Basic" - das erste Symbol links
- Tastenkombination ALT + F11
- oder, wenn wir gleich das betreffende Makro geöffnet bekommen wollen über das Fenster Makros, von wo aus wir das eben auch ausgeführt haben. Hier klickst du aber nicht auf "Ausführen", sonder auf "Bearbeiten"
Folgendes Bild hast du dann:
Was da alles zu sehen ist, erklär ich später. Jetzt geht es um den großen Teil in der Mitte - das Codefenster - und den darin enthaltenen Code. Bei mir ist das folgender:
Sub Makro2()
'
' Makro2 Makro
'
'
Range("D1").Select
Sheets("Tabelle2").Select
ActiveCell.FormulaR1C1 = "Hallo Welt"
Range("A1").Select
End Sub
Ich erklär mal zeilenweise.
Zeile 1: "Sub Makro2()"
Ein Programmstück heißt Prozedur (es gibt auch Funktionen und Klassen, aber dazu später). Es beginnt immer mit den Wort Sub gefolgt vom Namen der Prozedur/des Makros und einem Klammerpaar, in dem wir später einmal sogenannte Argumente eintragen. Für den Anfang reicht es aber zu wissen, dass diese Klammern zwingend notwendig sind und bei manueller Eingabe von Code automatisch ergänzt werden, sollten sie fehlen.
Zeilen 2 - 6: Kommentare
Der einfache Anführungstrich leitet einen Kommentar ein. Alles, was nach diesem Zeichen kommt, wird beim Ausführen des Makros von Excel ignoriert. Hier kann - und sollte - man seinen Code möglichst präzise kommentieren. Schreiben kann man hier, was immer man will. Die Kommentare sind wichtig, umn später nachvollziehen zu können, was ein bestimmter Teil vom Code macht - das kann manchmal aus dem Code selber schwer nachvollziehbar sein. Unser Makrorekorder hat hier den Namen des Makros eingetragen und ggf. hätte hier auch eine Beschreibung gestanden, wenn wir eine erfasst hätten.
Es gibt (professionelle) Programmierer, die verzichten generell auf Kommentare - sehr zum Leidwesen derer, die später dort vielleicht einmal Anpassungen vornehmen müssen. Deren Motto heißt: "Es war verdammt schwer, diesen Code zu schreiben - genauso schwer sollte es auch sein, ihn zu verstehen."
Zeile 7: "Range("D1").Select"
Zunächst: der Rekorder rückt den Code hier schon brav ein. Das dient der Übersicht. Man kann am Anfang einer Zeile so viele Leerzeichen eintragen, wie man will, ohne dass sich das auf die Ausführung auswirkt. Es dient lediglich der Lesbarkeit des Codes - vor allem, wenn wir später mit Schleifen arbeiten, wird das dringend notwendig sein.
Nun zu dem, was da eigentlich steht:
"Range("D1")" - das ist die Zelle D1. Eine "Range" ist immer eine Zelle oder ein Zellbereich. Sie ist ein sogenanntes Objekt. Zu Zellen und Bereich müssen wir grundlegend wissen: Sie haben einen Namen und eine Adresse. Damit Excel weiß, mit welcher Zelle es etwas machen soll, müssen wir mitteilen, welche gemeint ist. Das erfolgt in der Klammer hinter dem Wort Range. Namen werden immer in Anführungszeichen angegeben - der Name ist in diesem Fall "D1".
Woher weiß Excel, um welchen Arbeitsblatt es geht? Nun, wenn wir das nicht extra mitteilen, dann wir einfach das Blatt genommen, was grad aktiv/ausgewählt ist. Auch dazu lernen wir später mehr.
Mit unserer Zelle müssen wir auch etwas machen. In dem Fall haben wir sie angeklickt, also ausgewählt. In VBA übersetzt heißt das "Select".
Der Select-Befehl ist eine sogenannte Methode. Ein Objekt hat Dinge, die es kann oder die man mit dem Objekt machen kann - eine Zelle kann man auswählen. Es hat auch Ereignisse - etwas, was mit dem Objekt passiert. Dazu lernen wir viel später noch viel mehr. Im Moment reicht es, zu wissen, dass es sowas gibt. Und last but not leat hat das Objekt Eigenschaften - die Zelle hat z.B. eine Zeilenhöhe oder einen Inhalt.
Die Übersetzung der Zeile 7 heißt also: Wähle die Zelle D1 auf dem Blatt aus, auf dem du dich grade befindest.
Zeile 8: "Sheets("Tabelle2").Select"
Das nächste Objekt: das Tabellenblatt. "Sheet" als Bezeichnung für ein Blatt ist einigermaßen nachvollziehbar. Aber warum die Mehrzahl? Ganz einfach: Es gibt grundsätzlich von jedem Objekt mehr als eins (auch wenn vielleicht in der Arbeitsmappe nur ein einziges Blatt enthalten ist). Um die vielen Objekte - z.B. Blätter - zu verwalten gibt es eine Liste - im Fachjargon "Auflistung" - mit allen Objekten eines bestimmten Typs. Bei den Arbeitsblättern ist das "Sheets" - wir werden später aber mit der Bezeichnung "Worksheets" arbeiten, da gibt es nochmal einen kleinen aber feinen Unterschied.
Das Tabellenblatt hat auch wieder einen Namen, nämlich "Tabelle2" (das ist der, der unten auf dem Register der Tabelle steht). Und auch hier wird nur ausgewählt - per Select-Befehl.
Zeile 9: "ActiveCell.FormulaR1C1 = "Hallo Welt""
Hier passiert mal tatsächlich was produktives - es wird etwas in die Zelle eingetragen. Zunächsat aber zu "ActiveCell". Das ist auch ein Objekt. Vom Typ Zelle, um genau zu sein. Hier wird nicht die Zelle mit Namen angegeben, sondern einfach die grade aktive Zelle genutzt. Das ist in diesem Moment Zelle D1 auf Tabelle2 (die Zellauswahl wir beim Wechsel des Tabellenblattes mit übernommen).
Das ist eine ziemlich seltsame Vorgehensweise, aber das macht der Makrorekorder immer so, weil das genau das ist, was er Schritt für Schritt so sieht. Wir werden das nachher etwas einkürzen.
Danach folgt ".FormulaR1C1". Zum Punkt: der kommt immer zwischen zwei "Ebenen" - in dem Fall zwischen Objekt und Eigenschaft - oder auch bei Select zwischen Objekt und Methode. Das ist so eine Art grammatikalische Regel, die immer so befolgt werden muss, sonst versteht VBA nur Bahnhof.
Also, das FormulaR1C1 - sieht sehr kryptisch aus und is in der Form vollkommen überflüssig. "Formula" impliziert schon mal, dass es sich um eine Formel handelt. "Hallo Welt" ist aber beim besten Willen keine Formel, sondern nur ein Text, ein Wert, wenn wir so wollen. das angehängte R1C1 gibt die "Schreibweise" an. Alles Themen, mit denen wir uns zu gegebener Zeit beschäftigen.
Generell arbeiten wir, wenn wir einen Wert (keine Formel, die rechnen soll) in eine Zelle eintragen eher mit der Eigenschaft "Value". Das werden wir nachher beim Verbessern des Codes auch tun.
danach folgt noch " = "Hallo Welt"". Das Gleichheitszeichen wird verschiedentlich genutzt. Hier bedeutet es. dass wir der Eigenschaft "FormulaR1C1" den Wert "Hallo Welt" zuweisen.
Hallo Welt ist ein Text. Texte müssen immer in Anführungszeichen stehen, damit klar ist, dass es sich nicht um Befehle handelt. Eine Zahl wiederum wird ohne Anführungszeichen geschrieben, also z.B. "= 1".
Zeile 10: "Range("A1").Select"
Hier bin ich nach der Eingabe nochmal in eine andere Zelle gesprungen - Zelle A1 - was der Rekorder promt mit aufgezeichnet hat.
Zeile 11: "End Sub"
Zu jeden "Sub ...()" wie in Zeile 1 gehört immer auch ein "End Sub", welches anzeigt, dass hier der Code zu Ende ist. Es wird genau wie die Klammern bei Bedarf automatisch ergänzt.
Was macht das Makro am Ende? Es trägt in Zelle D1 auf Tabelle2 den text "Hallo Welt ein". Das geht aber auch mit nur einer einzigen Zeile Code. Alles, was "Select" ist, können wir weglassen.
Damit bleibt "Range("D1")", "Tabelle2" und "FormulaR1C1 = "Hallo Welt"". Aus dem Formula-Gedöns wollten wir ja das gebräuchlichere "Value" machen. Sub und End Sub sind unerlässlich. Damit bleibt folgender Code übrig:
Sub Makro2()
Worksheets("Tabelle2")Range("D1").Value = "Hallo Welt"
End Sub
Soviel zunächst zu VBA allgemein und dem Makrorekorder. Ganz nebenher haben wir schon erste Begriffe aus dem Bereich der Programmierung kennengelernt und einen kurzen Blick auf den VBA-Editor geworfen. Mit dem werden wir uns im nächsten Post näher beschäftigen. Es wird um die einzelnen Fenster, Einstellungsmöglichkeiten und die verschiedenen Funktionen im Editor gehen. Nebenbei gibt es noch ein paar kleine Tips und Tricks, die die regelmäßige Arbeit erleichtern.
Keine Kommentare:
Kommentar veröffentlichen