Excel aufmöbeln mit VBA - Dietrich Baumgarten "10. Oktober 2014

Die Seite wird erstellt Aurel Feldmann
 
WEITER LESEN
Excel aufmöbeln mit VBA

      Dietrich Baumgarten

      « 10. Oktober 2014
1 Einführung in Visual Basic

1.1 Überblick
In diesem Kapitel erfahren Sie
   - wie eine Folge von Befehlen durch Makros aufgezeichnet werden kann;
   - wie die Entwicklungsumgebung von Visual Basic aufgebaut ist;
   - wie eigene Sub-Prozeduren und Funktionen erstellt werden;
   - Alle Beispiel sind in der Arbeitsmappe VBAEinfuehrung.

1.2 Makroaufzeichnen
Visual Basic for Applications, kurz VBA, ist eine leistungsfähige Skriptsprache, die zur
Erweiterung der Möglichkeiten der Microsoft-Oce-Anwendungen wie Excel, Word oder
Access entwickelt wurde. Daher wird VBA zusammen mit den Programmen des Micro-
soft Oce Pakets ausgeliefert. VBA hat eine eigene Entwicklungsumgebung, die in allen
Programmen des Oce-Pakets fast gleich aussieht. Mit VBA lassen sich die Fähigkeiten
von Oce-Programmen beträchtlich erweitern, da man eigene Dialoge und zusätzliche
Menüs erstellen kann. Mit VBA kann man im Excel ab 2007 dem Menüband benutzer-
denierte Registerkarten und Gruppen zufügen.
  Die vielen Möglichkeiten von VBA lernt man am besten über die Makroaufzeichnung.
Das Aufzeichnen von Makros ist auch ohne Programmierkenntnisse möglich und ist daher
weit verbreitet. Es wird eine Folge von Aktionen wie Önen und Schlieÿen von Dateien,
Formatierungen von Texten usw. auf dem Wirtsprogramm, hier also Excel, ausgeführt,
und dann in einer Folge von Visual Basic Code aufgezeichnet. Dieser Code wird ein
Makro genannt und hat eine bestimmte Struktur, die auch bei der Erstellung eigener
Programmteile eingehalten werden muss. Der aufgezeichnete Code kann analysiert und
geändert werden. Damit werden wiederholt durchzuführenden Aufgaben automatisiert.
  Für die Makroaufzeichnung ist im neuen Excel ist das Register Entwicklertools
nötig, das standardmäÿig nicht vorhanden ist. Sie bringen es wie folgt zum Vorschein:
  1. Klicken Sie auf die Registerkarte       .
                                         Datei

  2. Klicken Sie auf die Schaltäche Optionen.
  3. Klicken Sie auf Menüband anpassen.

                                                                                      1
1 Einführung in Visual Basic

Es önet sich ein riesiges Fenster, das ich verkürzt in der Abbildung 1.1 zeige. Suchen
Sie im abgebildeten Listenfeld das Register Entwicklertools und aktivieren es mit
einem Häkchen.

                  Abbildung 1.1: Der Dialog Optionen ab Excel 2007.

   Im alten Excel sorgen Sie bitte zunächst dafür, dass die Symbolleiste Visual Ba-
sic zu sehen ist. Das geschieht entweder über das Kontextmenü der Symbolleisten oder
über die Befehlsfolge Ansicht|Symbolleisten. In der Abbildung 1.2 auf Seite 3 be-
ndet sich diese Symbolleiste links. Darin bendet sich ein Symbol für den Start der
Makroaufzeichnung.
   Die Makroaufzeichnung muss natürlich veranlasst werden. Dazu gibt es folgende Mög-
lichkeiten:

    • In Excel ab 2007 bendet sich der Befehl    Makro Aufzeichnen     in der Gruppe
      Code   des Registers   Entwicklertools  .

    • Im alten Excel können Sie die Befehlsfolge   Extras|Makros|Aufzeichnen. . .
      verwenden, oder Sie aktivieren die Symbolleiste Visual Basic und wählen den
      entsprechenden Befehl.

Es önet sich der Dialog, der in der Abbildung 1.2 rechts zu sehen ist. Sie müssen
sich für einen Namen für das Makro entscheiden, können aber auch den vorgeschlagenen
Bezeichner Makro1 übernehmen, das nächste Makro hieÿe dann Makro2. Auÿerdem
kann dem Makro wie zu sehen ist ein Tastaturkürzel zugewiesen werden.

2
1.3 Der Visual Basic Editor

          Abbildung 1.2: Symbolleisten für Visual Basic und Makrorecorder

   Sobald Sie im Dialog Makro aufzeichnen auf OK drücken, verwandelt sich im
alten Excel der Kreis des Symbols Aufzeichnen. . .  in ein Quadrat, womit die Auf-
zeichnung wieder beendet werden kann. Zur Sicherheit erscheint auch noch das kleine
Dialogfeld, das ich zwischen den Symbolleisten abgebildet habe, womit die Aufzeichnung
über das Quadrat ebenfalls beendet werden kann. Im neuen Excel drücken Sie den Be-
fehl  Aufzeichnen beenden in der Gruppe Code des Registers Entwicklertools.
Aber dazu ist es noch zu früh, wir haben ja noch gar nicht begonnen. Ich habe wie
beschrieben die Makroaufzeichnung gestartet und vor dem Beenden der Aufzeichnung
folgende Aktionen durchgeführt:
  1. In der noch unbearbeiteten Arbeitsmappe Mappe1 habe ich die dritte Tabelle
     markiert und über das Kontextmenü gelöscht.
  2. Dann habe ich die erste Tabelle markiert und in die Zelle A1 Hallo! eingegeben.
  3. Nun habe ich die Mappe unter dem Namen Makrotest im Verzeichnis C:\ ge-
     speichert.
  Excel hat alles getreulich ausgeführt und der Makrorecorder hat den in der Abbildung
1.3 zu sehenden Code aufgezeichnet. Der Code bendet sich innerhalb der Entwicklungs-
umgebung von Visual Basic. Wie Sie dorthin gelangen, zeige ich gleich.

1.3 Der Visual Basic Editor
Wenn Sie alles nachgemacht haben, werden Sie sicher den Code suchen. Dazu müssen
Sie den Visual Basic Editor önen. Dafür haben Sie folgende Möglichkeiten:
  1. Über die Tastenkombination    Alt   + F11 .

  2. Im neuen Excel über den Befehl Visual Basic in der Gruppe Code des Registers
     Entwicklertools.

  3. Über die Befehlsfolge Extras|Makros|Visual Basic Editor. . . , oder über das
     Symbol Visual Basic Editor der Symbolleiste Visual Basic im alten Excel.

                                                                                    3
1 Einführung in Visual Basic

Visual Basic erscheint dann in der klassischen Dreiteilung: Links oben ist der Projekt-
Explorer zu sehen, darunter das Eigenschaftenfenster und rechts von beiden das Arbeits-
fenster zum Anzeigen von Code und/oder Formularen.

                        Abbildung 1.3: Der Visual Basic Editor

  Sollte das Eigenschaftenfenster nicht vorhanden sein, müssen Sie F4 drücken oder
den entsprechenden Befehl des Menüs Ansicht wählen. Sollte der Projekt-Explorer
nicht vorhanden sein, müssen Sie Strg + R drücken oder den entsprechenden Befehl
des Menüs Ansicht wählen. Zwischen den drei Fenstern benden sich Trennbalken,
worüber Sie die Gröÿen der einzelnen Fenster festlegen können.
  Aus der Entwicklungsumgebung von VBA gelangen Sie ebenfalls über die Tastenkom-
bination Alt + F11 zurück nach Excel oder über den Befehl des Menüs Ansicht.

1.3.1 Symbolleisten
Der Visual Basic Editor besitzt einige Symbolleisten, in der Abbildung 1.3 ist davon nur
Voreinstellung geönet. Die wichtigsten Schaltächen werde ich nun erklären. Über
die Schaltäche Excel gelangt man zurück nach Excel. Die Schaltäche Einfügen
enthält Unterbefehle für das Erstellen von neuen Modulen, Formularen oder Prozedu-
ren. Die Schaltäche Ausführen setzt den Code der gerade bearbeiteten Prozedur oder
des aktiven Formulars in Gang. Die Schaltäche daneben unterbricht die Ausführung.

4
1.3 Der Visual Basic Editor

Falls der Code fehlerhaft ist und von VBA unterbrochen wurde, muss die Schaltä-
che Zurücksetzen angeklickt werden. Auf Entwurfsmodus komme ich noch. Die
beiden Schaltächen Projektexplorer und Eigenschaftenfenster tun was ihr Name
verspricht und zeigen die entsprechenden Fenster. Sie sind aber keine Schalter, denn Sie
önen zwar geschlossene Fenster, schlieÿen aber kein oenes, da sowohl der Projektex-
plorer als auch das Eigenschaftenfenster selbst Schaltächen zum Schlieÿen haben.
  Weitere Symbolleisten können über die Menüfolge Ansicht|Symbolleisten einge-
fügt werden. Ich empfehle mindestens die Symbolleiste Bearbeiten.

1.3.2 Der Projekt-Explorer
Der Projekt-Explorer zeigt wie der Windows-Explorer eine hierarchische Liste der Pro-
jekte und aller Elemente an, die in den jeweiligen Projekten enthalten sind. Die Elemente
benden sich im Listenfenster, das einen Überblick über die Arbeitsmappen, Tabellen,
Module und Formulare des Projekts gibt. Zu jedem Listenelement kann Code geschrieben
werden.
  Objektorientiert gesehen steht das Programm Excel an der Spitze der Hierarchie. Ex-
cel verwaltet Arbeitsmappen, diese bestehen aus Tabellenblättern. Zu jedem Objekt
kann man VBA-Code bereitstellen. Zusätzlich kann weiterer Code in sogenannten Mo-
dulen abgelegt werden. Im Projekt-Explorer sind die Bestandteile aufgeführt, rechts
daneben bendet sich das Code-Fenster zum Erstellen des Codes. Die Auswahl zum
Bearbeiten erfolgt durch einfachen Doppelklick (kleiner Scherz) im Listenfenster des
Projekt-Explorers.
  Oberhalb des Listenfensters benden sich drei Symbole. Über das Symbol rechts kön-
nen die Objektordner ein- bzw. ausgeblendet werden, während die darin enthaltenen
Objekte weiterhin angezeigt werden.
  Das Symbol links aktiviert das Code-Fenster, während das Symbol in der Mitte das
Objekt selbst zeigt. Das Code-Fenster önet sich auch über die Taste F7 und das
Objekt selber wird angezeigt durch ⇑ + F7 . Bei der Bearbeitung von Formularen
kann man auf diese Weise zwischen der Erstellung des Formulars und der Erzeugung
des Codes hin- und herschalten. Bei Excel-Objekten führt das mittlere Symbol bzw. die
Tastenkombination ⇑ + F7 zurück zum Excel-Fenster.
  In der Abbildung 1.3 ist das Listenelement Modul1 unter dem Ordner Module
aktiviert. Module enthalten Visual Basic Code und deshalb existiert hierzu kein Objekt,
das mittlere Symbol ist deaktiviert. Im rechten Fenster, dem sogenannten Code-Fenster,
bendet sich der vom Makrorecorder erzeugte Code.

1.3.3 Das Code-Fenster
Das Code-Fenster erscheint wie erwähnt bei Objekten durch Auswahl des Objekts im
Listenfenster des Projekt-Explorers und Klicken des Symbols Code anzeigen oder
durch Doppelklick auf dem Objekt. In der Abbildung 1.3 ist das Objekt Modul1 aktiviert
und der zugehörige Code zu sehen. Man kann aber auch die Taste F7 drücken oder
im Menü Ansicht den Befehl Code wählen.

                                                                                       5
1 Einführung in Visual Basic

  Im Code-Fenster wird der Visual Basic-Code erstellt und bearbeitet. Sie können so
viele Code-Fenster önen wie Module vorhanden sind, sodass der Code auf einfache
Weise in verschiedenen Formularen oder Modulen angezeigt und zwischen diesen kopiert
und eingefügt werden kann. Über das Menü Fenster lassen sich die geöneten Fenster
anordnen. Sobald ein Fenster im Vollbild ist, überdeckt es alle übrigen Fenster.
  Über dem Code-Fenster können Sie zwei Dropdown-Listenfelder erkennen, das lin-
ke wird Objekt, das rechte Prozedur genannt. Bei Modulen gibt es nur ein Objekt
namens (Allgemein). Im Listenfeld rechts davon sind alle Deklarationen und allgemei-
nen Prozeduren aufgeführt. In der erwähnten Abbildung ist das aufgezeichnete Makro
zu sehen. Die Prozeduren sind alphabetisch nach Namen sortiert. Durch Auswahl einer
Prozedur wird der Cursor in deren erste Code-Zeile positioniert.

1.3.4 Das Eigenschaftenfenster
Das Eigenschaftenfenster wird zunächst selten benötigt, es kommt erst bei der Erstel-
lung von Formularen ins Spiel. Das Eigenschaftenfenster bendet sich unterhalb des
Projektexplorers, kann aber geschlossen werden und erscheint dann erneut über das
Menü Ansicht, die entsprechende Schaltäche der Symbolleiste Voreinstellung oder
über F4 . In der Abbildung 1.3 auf Seite 4 ist im Projektexplorer das Listenelement
Modul1 unter dem Ordner Module aktiviert. Deshalb zeigt das Eigenschaftenfenster
die Eigenschaften dieses Moduls. Module haben nur die Eigenschaft Name. Module
erhalten standardmäÿig die fortlaufenden Namen Modul1, Modul2 usw., können
aber über das Eigenschaftenfenster umbenannt werden.
  Die Objekte DieseArbeitsmappe und die Tabellen haben dagegen sehr viele Eigen-
schaften. Die Namen der Eigenschaften stehen links, die zugehörigen Werte rechts. Man
kann die Einstellungen zur Entwurfszeit oder später im Code ändern. Wichtig wird das
Eigenschaftenfenster erst im Zusammenhang mit Formularen.

1.3.5 Das Direktfenster
Das Direktfenster önet sich über die Tastenfolge Strg + G oder über den gleich-
lautenden Befehl des Menüs Ansicht. Es wird zum Debuggen und Auswerten von Aus-
drücken, Ausführen von Anweisungen, Drucken von Variablenwerten usw. verwendet.
Function Verdoppeln(ByVal input as Long) As long
  Debug.Print input
  Verdoppeln = input * 2
End Function

Gibt man ?MyFunction(2) oder Debug.Print MyFunction(2) im Direktfenster ein, und
drückt dann die Eingabetaste, erscheinen im Direktfenster die Werte 2 und 4 an. Nach der
Behebung aller Fehler sollten die Anweisungen Debug.Print wieder entfernt werden.

6
1.4 Aufbau von Visual Basic Code

1.3.6 Module
Der Makrorecorder hat den Code in einem sogenannten Modul gespeichert und diesem
Modul den einfallsreichen Namen Modul1 verpasst. Module enthalten aufgezeichne-
te Makros oder selbst erstellten Programmcode. Jedes VBA-Projekt darf beliebig viele
Module haben, ein einzelner Modul soll dabei einen logisch abgeschlossenen Themenbe-
reich abdecken. Die Gesamtheit aller Module und Formulare bezeichnet man als Projekt .
Die Entwicklungsumgebung legt bei der Aufzeichnung eines Makros einen neuen Modul.
Sie können aber auch selbst einen neuen Modul erzeugen, und zwar über den Befehl
Einfügen|Modul der Entwicklungsumgebung von VBA oder über die Schaltäche der
Symbolleiste Voreinstellung. Dadurch önet sich ein leeres Fenster des Editors.

1.4 Aufbau von Visual Basic Code
Sie wissen jetzt, das der Code von Visual Basic in Modulen angeordnet wird und wie
in der Abbildung 1.3 auf Seite 4 im eigentlichen Editor-Fenster der Entwicklungsumge-
bung betrachtet und bearbeitet werden kann. Den dargestellten Code werde ich jetzt
beschreiben.
   Visual Basic ist eine problemorientierte Programmiersprache. Darunter versteht man
Programmiersprachen, womit Programme aus einem bestimmten Anwendungsbereich
verfasst werden, die auf verschiedenen Rechnersystemen lauähig sind und ein vorgege-
benes Problem lösen. Das zugrunde liegende Problem wird durch Algorithmen gelöst,
d.h. in eine Kette von kleinen aufeinander aufbauenden Rechenschritten und Vorschrif-
ten zerlegt. Diese Algorithmen werden dann in der gewählten Programmiersprache in
das sogenannte Quellprogramm umgesetzt. Wie bei allen Programmiersprachen ist der
Code aus bestimmten Elementen zusammengesetzt und es müssen formale Vorschriften
eingehalten werden.
   Visual Basic Programme bestehen aus Prozeduren, die man in Funktionen und Sub-
Prozeduren unterteilt. Jede Prozedur hat einen Kopf mit dem eindeutigen Namen und
einem Rumpf mit dem eigentlichen Code. Der Rumpf einer Sub-Prozedur ist eine Fol-
ge von Anweisungen, die in den Anweisungen Sub und End Sub eingeschlossen sind
und Aktionen ausführen, aber keinen Wert zurückgeben. Der Rumpf einer Funktion
wird durch die Anweisungen Function und End Function begrenzt und es wird
ein Wert zurückgegeben.
   Der Rumpf besteht aus Anweisungen. Die meisten Anweisungen sind ausführbar, d.h.
sie veranlassen mathematische Operationen wie Addition und Multiplikation oder die
Ein- und Ausgabe von Daten. Nicht ausführbare Anweisungen geben dem Interpreter
Informationen für den Übersetzungsprozess. Jede Anweisung steht in einer eigenen Zeile,
das gilt auch für den Kopf einer Prozedur.

                                                                                     7
1 Einführung in Visual Basic

Hinweis
Bei sehr langen Anweisung verwendet man zur besseren Lesbarkeit den Unterstrich als
Fortsetzungszeichen und schreibt in der nächsten Zeile weiter. Der Unterstrich muss vom
restlichen Code durch ein Leerzeichen getrennt sein!

Der Quellcode eines in Visual Basic geschriebenen Programms ist für den Prozessor
noch unverständlich und muss von einem Dienstprogramm, dem sogenannten Interpreter,
in Maschinensprache übersetzt werden. Der Interpreter übersetzt eine Anweisung nach
der anderen, daher ist die Ausführung von Visual Basic Programmen vergleichsweise
langsam. Bei anderen höheren Programmiersprachen wie C oder Fortran wird dagegen
der ganze Quellcode in eine ausführbare Datei übersetzt, die auf Windowsrechnern meist
an der Endung exe zu erkennen ist. Die Übersetzung des Quellcodes erfolgt ebenfalls
von einem Dienstprogramm, das man Compiler nennt. Kompilierte Programme laufen
schneller ab als interpretierte, aber bei den Aufgaben, die Visual Basic Programme
erfüllen, spielt die Geschwindigkeit selten eine Rolle.

1.4.1 Erstellen von Sub-Prozeduren
Ich werde jetzt zeigen, wie Sie eigene Sub-Prozeduren erstellen können. Erzeugen Sie
zunächst einen neuen Modul und taufen im Eigenschaftenfenster den voreingestellten
Namen Modul2 in NeueMakros um. Der neue Modul wird jetzt im Projekt-Explorer
angezeigt. Durch Doppelklick wird das Code-Fenster aktiv. Im Vollbild ist nur jeweils
ein Code-Fenster zu sehen, Sie können aber über den Menüpunkt Fenster die Code-
Fenster nach Ihren Wünschen anordnen. Der Inhalt eines neu angelegten Moduls ist
zunächst leer.
   Jede Sub-Prozedur beginnt mit der Anweisung Sub IrgendeinName(), worauf der
Editor selbst das abschlieÿende End Sub ergänzt. Zwischen diese beiden Anweisungen
kommt dann der eigentliche Code.
Hinweis
Beachten Sie bitte, dass jede Sub-Anweisung ein leeres Paar von Klammern nach dem
Namen enthalten muss, also Sub NeuesBlatt()und nicht Sub NeuesBlatt.

  Als Beispiel werde ich zwei eng verwandte Makros erstellen. Das erste Makro soll
die dritte Tabelle löschen, das zweite Makro soll die gelöschte Tabelle Tabelle3 neu
erstellen und hinten einfügen.
Sub Tabelle3Weg() ’ Löschen der dritten Tabelle
   Sheets(3).Delete
End Sub

’ Neuerstellung der dritten Tabelle
Sub Tabelle3Her()
   Sheets.Add

8
1.4 Aufbau von Visual Basic Code

   ActiveSheet.Name = "Tabelle3"
   Sheets("Tabelle3").Move After:=Sheets(Sheets.Count)
End Sub
Ich habe beide Sub-Prozeduren durch einen sogenannten Kommentar eingeleitet. Ein
Kommentar richtet sich nur an den Leser und enthält daher Erläuterungen des Quell-
codes. Ein Kommentar wird in VBA mit einem Apostroph (oder REM) eingeleitet und
endet am Zeilenende. Erstreckt sich ein Kommentar über mehr als eine Zeile, muss jede
Zeile mit dem Apostroph beginnen.
   Durch Spielerei mit dem Makrorecorder gelangte ich zum Code der beiden Sub-
Prozeduren. Ein neues Tabellenblatt wird über die Methode Add des Behälterobjekts
Sheets angelegt. Sheet ist der englische Ausdruck für Blatt, somit bezeichnet Sheets
die Gesamtheit aller Blätter. Das aktive heiÿt ActiveSheet. Hier ist dies gerade das
neu angelegte und dieses gibt sich selbst den Namen Tabelle3. Neu eingefügte Blätter
erscheinen immer direkt vor dem Blatt, das vor dem Einfügen aktiv war, daher muss
das neue Blatt durch Code ans Ende verschoben werden.
   Ich habe Ihnen hier auch die beiden Möglichkeiten Arbeitsblätter anzusprechen ge-
zeigt. Kennt man den Namen eines Arbeitsblatts, etwa Tabelle3, wird dieses mit
Sheets("Tabelle3") angesprochen. Ist bekannt, an welcher Stelle das Arbeitsblatt
steht, kann statt des Namens die Ordnungszahl, etwa 3, angeben werden, wobei das
letzten Arbeitsblatt die laufende Nummer Sheets.Count hat.

1.4.2 Intellisense
Objekte wie Sheets.verfügen über unzählige Eigenschaften und Methoden, die man
sich nicht alle merken kann. Moderne Editoren wie der von VB erleichtern das Erstellen
durch eine Intellisense genannte Technologie. Der Code-Editor zeigt alle Eigenschaften
und Methoden eines Objekts in einem Listenfeld, wenn man den Namen und den an-
schlieÿenden Punkt wie Sheets. schreibt. Sie müssen dem Editor aber eine Chance
geben und nach dem Punkt eine Pause einlegen. Mit etwas Englisch, Erfahrung und
Phantasie werden Sie oft die passende Methode für Ihre Absicht nden. Wenn Sie den
Anfangsbuchstaben der gewünschten Eigenschaft oder Methode kennen und eingeben,
springt die Listenfeld an diese Stelle. Sie können die gewünschte Eigenschaft/Metho-
de markieren und deren Bezeichner durch Drücken der Tab-Taste (nicht Eingabetas-
te!) oder durch Doppelklick in das Codefenster übernehmen. Das funktioniert auch
für die voreingestellten Variablen ActiveCell, ActiveWorkbook nicht aber für
ActiveSheet.
   Intellisense erkennt auch syntaktische Fehler bereits bei der Eingabe und zeigt die
falsche Anweisung in roter Farbe.

1.4.3 Ausführen von Sub-Prozeduren
Eine Sub-Prozedur kann auf mehreren Wegen ausgeführt werden. Am einfachsten ist
es, wenn der Cursor noch im Code der Sub-Prozedur ist. Dann genügt es, die F5-Taste

                                                                                    9
1 Einführung in Visual Basic

zu drücken. Sie können Makros aber auch von Excel aus starten. Im neuen Excel gibt
es dafür den Befehl Makros der Gruppe Code des Registers Entwicklertools.
Dann önet sich ein Dialog mit allen erstellten Makros, hier also mit den beiden Makros
Tabelle3Her und Tabelle3Weg. Auch im alten Excel können Sie Sub-Prozeduren
aufrufen, und zwar über die Befehlsfolge Extra|Makro|Makros. . . oder die Tasten-
kombination Alt + F8 .

1.4.4 Laufzeitfehler
Schon die beiden Sub-Prozeduren Tabelle3Weg() und Tabelle3Her() haben
ihre Tücken, man kann keine zweimal hintereinander ausführen! Denn die erste Sub-
Prozedur löscht die Tabelle Tabelle3 und dann fehlt diese zum erneuten Löschen. Sie
müssten also zuvor die Sub-Prozedur Tabelle3Her() aufrufen, damit die verschwun-
dene Tabelle wieder auftaucht. Aber auch diese Sub-Prozedur kann nicht zweimal hin-
tereinander aufgerufen werden, da Excel nicht zwei Tabellen gleichen Namens duldet.
Sollten Sie es aber trotzdem versuchen, wehrt sich der Interpreter mit der garstigen
Fehlermeldung von Abbildung 1.4.

                          Abbildung 1.4: Eine Fehlermeldung

  Sie können jetzt verzagt die Schaltäche Beenden drücken oder sich über Debug-
gen mutig dem begangenen Fehler stellen. Dann önet sich das Code-Fenster, worin
die beanstandete Anweisung gelb unterlegt ist. Sie müssen nun im Menü Ausführen
den Befehl Zurücksetzen oder in der Symbolleiste Voreinstellung die entsprechende
Schaltäche anklicken, also die mit dem blauen Quadrat. Wenn Sie sich im Dialog der
Abbildung 1.4 für Beenden entscheiden, hebt der Editor die hässliche gelbe Unterma-
lung selbst wieder auf. Sie können die Fehler berichtigen und es erneut probieren. Zuvor
aber müssen Sie die Tabelle Tabelle3 löschen oder umbenennen, sonst gibt's wieder
Ärger. Da Anfänger öfter Fehler begehen, sei nochmals festgehalten, wie Sie wieder aus
der Klemme kommen.
Hinweis
Fehlerhafte Anweisungen werden vom Visual Basic Editor gelb unterlegt. Danach kann
der Code nicht mehr ausgeführt werden bis die Schaltäche Zurücksetzen der Symbol-
leiste Voreinstellung bzw. der Befehl Zurücksetzen des Menüs Ausführen geklickt
wurden.

10
1.4 Aufbau von Visual Basic Code

          Abbildung 1.5: Der Visual Basic Editor mit fehlerhafter Anweisung

1.4.5 Sub-Prozeduren und Zellen
Die bisherigen Sub-Prozeduren wirkten auf Arbeitsblätter als Ganzes. Sie können aber
auch auf einzelne Zellen oder Bereiche von Zellen zugreifen. Die folgende Prozedur ko-
piert den Wert der Zelle A1 des zweiten Arbeitsblatts in die Zelle B4 des ersten. Zusätz-
lich erhält die Zelle A4 des ersten Arbeitsblatts den Wert Hallo.
Sub Zellen()
 Sheets(1).[B4].Value = Sheets(2).[A1].Value und
 Sheets("Tabelle1").[A4].Value = "Hallo"
End Sub

1.4.6 Funktionen
Funktionen spielen in Excel eine groÿe Rolle. Zu den vorhandenen dürfen Sie jederzeit
eigene Funktionen erstellen. Genau wie bei Sub-Prozeduren ist ein Modul nötig, um den
Code aufzunehmen. Ich verwende dafür den bereits vorhandenen Modul NeueMakros
und erstelle als Beispiel die folgende atemberaubende Funktion:
Function Addi(ByVal a As Double, ByVal b As Double) As Double
   Addi = a + b
End Function

Das Schlüsselwort Sub ist hier am Anfang und am Ende Function gewichen. Auÿer-
dem haben Funktionen i.a. Parameter, hier a und b, aus denen das Ergebnis gebildet
wird. Das Ergebnis bendet sich immer in der Variablen, die den Namen der Funktion
trägt.
  Die erstellte Funktion taucht in Excel beim Funktionsassistent unter der Kategorie
benutzerdeniert auf. Sie können aber auch direkt in eine Zelle =Addi(12;13) ein-
geben und erhalten 25 als Ergebnis. Funktionen und Sub-Prozeduren werden später

                                                                                      11
1 Einführung in Visual Basic

näher behandelt, hier soll es nur um das Editieren gehen.
Warnung
In VBA müssen Sie die Parameter von Funktionen mit Kommas, in Excel aber mit
Semikolons trennen.

  Wenn Sie im Code eine Funktion verwenden, müssen Sie die Argumente der Funktion
in Klammern setzen, selbst dann, wenn die Funktion keine Argumente hat. Ich möchte
das an einer weiteren Sub-Prozedur erläutern, deren Aufgabe es sein soll, in die Zelle C4
der ersten Tabelle die Summe der Werte der Zellen A1 und B1 der zweiten Tabelle zu
bringen, wobei die Funktion Addi zu verwenden ist.
Sub Addieren()
  Sheets(1).[C4].Value = _
      Addi(Sheets(2).[A1].Value, Sheets(2).[B1].Value)
End Sub
Beachten Sie hier bitte wieder den Unterstrich, der als Fortsetzungszeichen einer Anwei-
sung dient, die zu lang oder zu unübersichtlich für eine einzelne Zeile wird.

1.4.7 Sub-Prozeduren mit Argumenten
In VBA müssen Sie drei Arten von Prozeduren unterscheiden
     1. Sub-Prozeduren ohne Argumente. Das sind die direkt ausführbaren Makros, wie
        etwa die Sub-Prozedur ZellenKopie. Sub-Prozeduren führen eine Folge von Anwei-
        sungen aus, geben aber keine Werte zurück. Daher tauchen Sie auch nicht in Excel
        unter den Funktionen auf, sondern als ausführbare Makros in der entsprechenden
        Liste.
     2. Funktionen mit und ohne Argumente. Auch Funktionen führen eine Folge von An-
        weisungen aus, aber mit dem Ziel einen bestimmten Wert zu ermitteln und diesen
        Wert dann zurückzugeben. Die Funktion Addi gibt die Summe ihrer Argumente
        wieder. Der Code der Funktion dient ausschlieÿlich der Berechnung des Rückga-
        bewerts. Funktionen tauchen in der Liste der Arbeitsblatt-Funktionen von Excel
        auf.
     3. Sub-Prozeduren mit Argumenten, sie gleichen Sub-Prozeduren ohne Argumenten
        dahin, dass kein Wert zurückgegeben wird. Sie tauchen aber nicht in der Liste
        der ausführbaren Makros auf. Sie dienen nur als Hilfsprozeduren von Makros und
        Funktionen, sind also nicht direkt aufrufbar.
Die folgende Sub-Prozedur mit Argumenten soll den Inhalt zweier beliebiger Zellen ver-
tauschen. Zellen haben den wichtigen Typ Range. Der Code lautet
Sub ZellenTausch(rg1 As Range, rg2 As Range)
  Dim zw As Variant

12
1.4 Aufbau von Visual Basic Code

  zw = rg1.Value
  rg1.Value = rg2.Value
  rg2.Value = zw
End Sub
Die Argumente sind die beiden Zellen, deren Inhalte in Excel Zahlen, Datumswerte oder
Zeichenfolgen sein können, daher gibt es den geschmeidigen Typ Variant, der wie ein
Chamäleon jeden Typ annehmen kann. Beachten Sie, dass der bisherige Wert der ersten
Zelle zwischengespeichert werden muss. Wie erwähnt, können Sie diese Prozedur nicht
von Excel aus aufrufen und auch in VBA ist sie allein nicht ausführbar.
  In dieser Sub-Prozedur sehen Sie zum ersten Mal die Deklaration einer Variablen,
hier der Variablen zw. Eine Deklaration hat die Syntax Dim EinName As Typ. Einer
Variablen kann über das Gleichheitszeichen ein Wert zugewiesen werden, der später
benötigt wird, was hier in der zweiten Anweisung erfolgt.
  Die folgende Sub-Prozedur ohne Argumente testet Zellentausch. Beim Aufruf von
Sub-Prozeduren mit und ohne Argumente dürfen Sie anders als bei Funktionen niemals
Klammern verwenden, es sei denn, Sie rufen die Sub-Prozedur mit voran gestelltem
Call auf, was aber kaum jemand macht. Bitte beachten Sie, dass bei allen anderen
Programmiersprachen, auch bei Visual Basic Net, beim Aufruf von Prozeduren immer
Klammern nötig sind.
Sub ZellenTauschTest()
  ZellenTausch Sheets(2).[A1], Sheets(2).[B1]
End Sub

1.4.8 Die MsgBox-Funktion
Über die MsgBox-Funktion wird eine Meldung in einem Dialogfeld gezeigt. Der Dialog be-
steht aus verschiedenen Schaltächen wie OK, Abbrechen usw. und einer Meldung
an den Benutzer, der dann als Reaktion die passende Schaltäche klickt, was dann den
Rückgabewert der Funktion festlegt. Eine typische Anwendung der MsgBox-Funktion
ist die folgende Sub-Prozedur, womit das gerade aktive Arbeitsblatt in Gustav um-
benannt wird, wenn der Anwender einverstanden ist:
Sub Gustav()
   Dim Rueck As Integer
   Rueck = MsgBox("Das aktive Arbeitsblatt Gustav nennen?", _
   vbYesNo + vbQuestion, "Entscheidung!")
   If (Rueck = vbNo) Then Exit Sub ’Bedingte Anweisung!
   ActiveSheet.Name = "Gustav"
End Sub
Hier taucht eine bedingte Anweisung auf, deren eigentliche Anweisung nur ausgeführt
wird, wenn die auf If folgende Bedingung zutrit. Auch bedingte Anweisungen müssen
in einer Zeile untergebracht werden, bei sehr langen Anweisungen wird daher oft das
Fortsetzungszeichen verwendet.

                                                                                   13
1 Einführung in Visual Basic

  Das erste Argument der MsgBox-Funktion ist der Text, der im Meldungsfenster ange-
zeigt wird. Das zweite Argument legt fest, mit welchen Schaltächen das Meldungsfenster
ausgestattet sein soll. Neben den Schaltächen können auch noch Symbole wie ein Frage-
oder Ausrufungszeichen erscheinen, dafür ist auch das zweite Argument zuständig. Das
zweite Argument ist also die Summe zweier Zahlen, von denen die erste die Schaltächen
und die zweite das Symbol bestimmen. Das zweite Argument wird durch Auswahl aus
der Tabelle 1.1 gebildet. Das dritte Argument ist der Titel des Meldungsfensters. Im
obigen Beispiel hat das Meldungsfenster zwei Schaltächen, und zwar Ja und Nein
und es erscheint ein Fragezeichen.

             Tabelle 1.1: Konstanten zur Ausgestaltung von Meldungsfenster
Konstante                Wert Beschreibung
vbOKOnly                 0      Nur OK anzeigen.
VbOKCancel               1      OK und Abbrechen anzeigen.
VbAbortRetryIgnore       2      Abbruch, Wiederholen und Ignorieren anzeigen.
VbYesNoCancel            3      Ja, Nein und Abbrechen anzeigen.
VbYesNo                  4      Ja und Nein anzeigen.
VbRetryCancel            5      Wiederholen und Abbrechen anzeigen.
VbCritical               16     Meldung mit Stop-Symbol anzeigen.
VbQuestion               32     Meldung mit Fragezeichen-Symbol anzeigen.
VbExclamation            48     Meldung mit Ausrufezeichen-Symbol anzeigen.
VbInformation            64     Meldung mit Info-Symbol anzeigen.

     Die MsgBox-Funktion hat also die Form
Rueck = MsgBox( Meldung, Btns, Titel)
wobei Meldung und Titel Inhalt und Titel des Meldungsfensters beschreiben und Btns
wie beschrieben aus der Tabelle 1.1 gebildet wird. Der Rückgabewert eines Meldungs-
fensters richtet sich nach der gedrückten Schaltäche. Die möglichen Werte sehen Sie in
der Tabelle 1.2.

                   Tabelle 1.2: Rückgabewerte von Meldungsfenstern
                   Konstante    Wert         gewählte Schaltäche
                   vbOK         1            OK
                   vbCancel     2            Abbrechen
                   vbAbort      3            Abbruch
                   vbRetry      4            Wiederholen
                   vbIgnore     5            Ignorieren
                   vbYes        6            Ja
                   vbNo         7            Nein

14
1.5 Aufgaben

  Am Rückgabewert der MsgBox-Funktion ist zu erkennen, welche Schaltäche der An-
wender gedrückt hat.
  Die MsgBox-Funktion hat drei Argumente, von denen aber nur das erste Argument
nötig ist, die beiden weiteren dürfen weggelassen werden. Dann hat das Meldungsfenster
nur die OK-Schaltäche und kein Symbol. Man setzt dies für Botschaften an den Be-
nutzer ein. Dann wird der Rückgabewert nicht benötigt und aus der MsgBox-Funktion
wird eine Sub-Prozedur, d.h. die Parameter werden ohne Klammern aufgeführt.
Sub EiGudeWie()
   MsgBox "Wir wünschen Ihnen einen guten Tag!"
End Sub

1.4.9 Eingabefenster
Die letzte Sub-Prozedur dieses Kapitels wird den Hintergrund der Zelle D4 des ersten
Arbeitsblatts rot oder gelb färben oder alles beim Alten lassen, wenn nicht eine dieser
Farben vom Anwender gewählt wird. Für sehr einfache Eingaben verwendet man die
InputBox-Funktion . Die InputBox-Funktion zeigt eine Eingabeauorderung in einem
Dialogfeld an, wartet auf die Eingabe eines Textes oder auf das Klicken auf eine Schalt-
äche und gibt einen Wert vom Typ String zurück, der den Inhalt des Textfeldes
angibt. heiÿt es dazu in der Online-Hilfe. Die Funktion hat bis zu sieben Argumente,
aber ich werde immer nur drei verwenden. Der erste ist die Meldung, der zweite der Titel
des Dialogs und der dritte der Vorgabewert, den der Anwender im Textfeld ändern kann
und soll. Wird auf dieses Argument verzichtet, erscheint das Textfeld am Anfang leer.
Sub FaerbeD4()
    Dim Farbe As String
    Farbe = InputBox("Rot oder gelb:", "Los", "rot")
    If (UCase(Farbe) = "ROT") Then
         Sheets(1).[D4].Interior.ColorIndex = 3
    Else
         Sheets(1).[D4].Interior.ColorIndex = 36
    End If
End Sub
Gewählt werden können nur die Farben rot oder gelb, wobei es wegen der Funktion
UCase() nicht darauf ankommt, ob groÿe oder kleine Buchstaben verwendet werden.
Wie Sie erkennen können, habe ich rot als Vorgabe gesetzt.

1.5 Aufgaben
Aufgabe 1.   Legen Sie einen neuen Modul an und schreiben Sie für folgende Vorhaben
geeignete Sub-Prozeduren:
  a) Umbenennung des letzten Arbeitsblatts in Gustav.

                                                                                     15
1 Einführung in Visual Basic

     b) Verschiebung des letzten Arbeitsblatts an den Anfang.
     c) Verwendung der Schriftfarbe Rot und des Fonts Arial für den Bereich A1:C5 der
        ersten Tabelle.
     d) Unsichtbarmachung der ersten Tabelle.
     e) Sichtbarmachung der ersten Tabelle.
     f) Frage über die InputBox-Funktion nach einem Wert für die Zelle C2 der ersten
        Tabelle und Übernahme dieses Wertes.
     g) Löschen der 10. Spalte der ersten Tabelle. Finden Sie über die Online-Hilfe heraus,
        was die Methode DisplayAlerts()tut und verwenden Sie diese, um die lästige
        Nachfrage, ob wirklich gelöscht werden soll, zu unterdrücken.
Aufgabe 2.   Erstellen Sie eine Sub-Prozedur, die ein Meldungsfenster mit den Schalt-
ächen OK und Abbrechen zeigt und den Benutzer mit einem nervigen Ausru-
fungszeichen erschreckt. Inhalt und Titel sind frei wählbar. Die Nummer der gedrückten
Schaltäche soll in der Zelle A1 einer neu erstellten Tabelle stehen.
Aufgabe 3.      Das erste Arbeitsblatt der Mappe VBAEinfuehrung.xlsm sieht wie folgt
aus:

                 A              B                 C                     D        E
      1 Schaltflächen       Symbol    Meldung                   Titel        Rückgabe
                                      Lieben Sie große Hunde
      2 OK und Abbrechen Fragezeichen und kleine Kinder?        Neugierig

  In der Zelle A2 stehen die Einträge Nur OK, OK und Abbrechen sowie Ja und
Nein. In der Zelle B2 stehen nur die Einträge Ausrufungszeichen, Fragezeichen und
Stopp. In die Zelle C2 ist der Text der Meldung und in die Zelle D2 der Titel. Schreiben
Sie eine Sub-Prozedur Meldung(), die zu den gewählten Eingaben das entsprechende
Meldungsfenster erstellt und in der Zelle E2 den Rückgabewert anzeigt.

16
2 Variablen, Datentypen und
     Operatoren

2.1 Überblick
Themen in diesem Kapitel sind
   - Datentyp und Gültigkeitsbereich von Variablen;
   - Datentypen für Festpunkt- und Gleitpunktzahlen;
   - Die Bildung von Ausdrücken aus Operatoren und Variablen;
   - Alle Beispiel nden Sie in der Arbeitsmappe VBAEinfuehrung.

2.2 Wiederholung
Wie Sie nun wissen verteilt sich der Code eines in Visual Basic geschriebenen Programms
auf Module. Die Module bestehen überwiegend aus Sub-Prozeduren und Funktionen und
diese bestehen wiederum aus sogenannten Anweisungen . Die Gesamtheit des in Visual
Basic geschriebenen Codes nennt man Quellcode . Der Quellcode ist für den Prozessor
noch unverständlich und wird von einem Dienstprogramm, dem sogenannten Interpre-
ter, in Maschinensprache übersetzt. Der Interpreter übersetzt eine Anweisung nach der
anderen, daher ist die Ausführung von Visual Basic Programmen vergleichsweise lang-
sam.

2.3 Variable
Variable stehen für Bezeichner, denen im Programm ein konstanter Speicherbereich für
die Aufnahme von Werten zugewiesen wird. Der Name Variable rührt daher, dass sich
diese Werte im Verlauf des Programms verändern dürfen. Im Gegensatz zu C unterschei-
det Visual Basic nicht zwischen groÿen und kleinen Buchstaben! Sie dürfen deshalb nicht
eine Variable Hans und eine andere hans nennen, der Interpreter nähme nur an, dass
Sie von nun an Hans klein schreiben wollten. Variablenbezeichner müssen bestimm-
te Bedingungen einhalten. Variablen haben einen genau festgelegten Datentyp , der die
Gröÿe des zugehörigen Speicherplatzes regelt und werden explizit in einer sogenannten
nicht ausführbaren Anweisung eingeführt. Diese Anweisung wird Deklaration genannt
und bestimmt neben dem Datentyp auch deren Gültigkeitsbereich .

                                                                                    17
2 Variablen, Datentypen und Operatoren

  Der Gültigkeitsbereich einer Variablen wird über die später erklärten Schlüsselwort
Public, Private und Dim festgelegt. Auch für den Datentyp gibt es festgelegte
Schlüsselwörter wie etwa Long oder Double. Ich zeige nun zwei typische Deklarationen
     Dim alt As Long
     Dim alpha As Double
Die Typangaben informieren den Interpreter über die Gröÿe des Speicherbereiches und
die zulässigen Werte. Für die Variable alt vom Typ Long werden vier Byte und für
die Variable alpha vom Typ Double werden acht Byte reserviert. Das Schlüsselwort
Dim legt den noch zu besprechenden Gültigkeitsbereich der Variablen fest.
  Bei der Deklaration versucht Visual Basic den Variablen sinnvolle Anfangswerte zu
geben. Numerische Variable erhalten der Wert 0, somit haben die Variablen alt und
alpha den anfänglichen Wert 0. Zeichenfolgen vom Typ String werden mit der lee-
ren Zeichenfolge "" initialisiert.
  Visual Basic ist anders als C oder Pascal keine streng typisierte Sprache, daher kön-
nen Variablen auch ohne Typangabe deklariert werden, dann vergibt Visual Basic den
Typ Variant, der stellvertretend für alle Typen steht. Sinnvoll ist das aber nicht. Die
Schlüsselworte Dim, Private oder Public am Anfang der Deklaration sind aber
immer nötig.
  Sie dürfen in einer Anweisung auch mehr als eine Variable deklarieren, müssen dann
aber bei jeder Variablen einzeln den Typ festlegen:
     Dim alt As Long, neu As Long ’So ist es richtig!
     Dim alpha, beta As Double ’So ist es falsch
In der ersten Anweisung sind beide Variable vom Typ Long, in der zweiten war wahr-
scheinlich beabsichtigt, dass beide Variablen vom Typ Double sind, was aber nur auf
beta zutrit, da nach alpha kein Typ folgt, weshalb alpha den Typ Variant erhält.

2.3.1 Option Explicit-Anweisung
Eigentlich müssen in Visual Basic Variablen gar nicht deklariert werden. Wenn Sie aber
die Anweisung
Option Explicit
in einem Modul als erste Anweisung verwenden, müssen alle Variablen explizit mit Dim,
Private, Public, ReDim oder Static deklariert werden. Wenn Sie nun versehent-
lich eine Variable falsch schreiben, tritt zur Kompilierungszeit ein Fehler auf, da ein
nicht deklarierter Namen verwendet wird. Leider muss diese Anweisung in jedem Modul
vorhanden sein. Das lässt sich aber automatisieren.
Hinweis
Die Anweisung Option Explicitwird automatisch in einen neu erstellten Modul ein-
gefügt, wenn im Dialogfeld Optionen, das in der Entwicklungsumgebung von VBA
über den Befehl Extras|Optionen. . . erreichbar ist, auf der Registerkarte Editor
die Option Variablendeklaration erforderlich aktiviert wird.

18
2.4 Format und Zeichenvorrat

2.4 Format und Zeichenvorrat
Visual Basic Programme erfordern ein bestimmtes Format und beruhen auf Ziern,
lateinischen Zeichen und Sonderzeichen. Dazu kommen sogenannte Schlüsselwörter.

2.4.1 Format von Anweisungen
Jede Zeile darf genau eine Anweisung haben, es sei denn die Anweisungen sind durch
einen Doppelpunkt : voneinander getrennt wie hier
          Dim alt As Long             :    alt = 30
Ich nde das unschön und erwähne es nur zu Ihrer Information. Sie sollten jede Anwei-
sung in einer Zeile unterbringen und somit den Code wie folgt umschreiben
          Dim alt As Long
          alt = 30
Wenn eine Anweisung zu lang für eine Zeile ist, verwendet man das Fortsetzungszeichen
_ und schreibt in der nächsten Zeile weiter. Das habe ich schon des Öfteren getan.
  Sie sollten Sie sich an folgende Prinzipien halten, da sie die Lesbarkeit des Codes
begünstigen:

   - Pro Anweisung eine Zeile.

   - Nach jedem Schlüsselwort wie Sub, Function oder If werden die nachfolgen-
     den Anweisungen eingerückt.

   - Die zugehörige schlieÿende Anweisung steht in der gleichen Spalte wie die önende
     also Function und End Function oder If und End If .

2.4.2 Zeichenvorrat
Der Zeichenvorrat umfasst drei Gruppen:

   - Lateinische Buchstaben: a . . . z und A . . . Z, aber keine Umlaute wie ä oder Ü.

   - Arabische Ziern: 0, 1,..., 9.

   - Sonderzeichen für Operatoren wie +, −, ∗ usw.

2.4.3 Schlüsselworte
Jede Programmiersprache hat reservierte Schlüsselworte , die vom Programmierer nicht
als Bezeichner verwendet werden dürfen. Einige davon kennen Sie bereits, etwa If oder
Sub. In der folgenden Tabelle habe ich die wichtigsten Schlüsselworte aufgelistet.

                                                                                         19
2 Variablen, Datentypen und Operatoren

                           Tabelle 2.1: Schlüsselworte
      If    Else   Else If End False True          Do Until Dim Public
     GoTo Function Sub      For Next While Case Loop Private Global

2.4.4 Bezeichner (identier)
Bezeichner beginnen mit einem Buchstaben, gefolgt von weiteren Buchstaben oder Zif-
fern und sollten nicht länger als 20 Zeichen sein. Gültige Bezeichner sind somit Xxx12,
xXX12, Xxx12, und diese sind eigentlich alle gleich, da in Visual Basic nicht zwi-
schen groÿen und kleinen Buchstaben unterschieden wird. Falsch sind dagegen _xyz,
92X oder gar -X und ?XY. Der Unterstrich _ ist auch erlaubt, darf aber anders als in
C nicht am Anfang stehen. Somit ist X_08_15 ein erlaubter Bezeichner.
   Bezeichner stehen für

     - Variablen, z.B. Dim x As Long.

     - Namen von Funktionen und Sub-Prozeduren, z.B. Function Summe(). Bezeich-
       ner sollten nicht zu lang, aber aussagekräftig sein; sie dürfen nicht mit Schlüssel-
       worten wie If übereinstimmen.

Im Gegensatz zu C unterscheidet Visual Basic nicht zwischen groÿen und kleinen Buch-
staben! Sie dürfen deshalb nicht eine Variable Hans und eine andere hans nennen, der
Interpreter nähme nur an, dass Sie von nun an Hans klein schreiben wollten.

2.4.5 Kommentare
Kommentare beginnen mit einem Hochkomma ’ und erstrecken sich bis ans Zeilenen-
de. Sie sind nur an den Leser des Programms gerichtet, der Interpreter geht über Kom-
mentare kommentarlos hinweg. Kommentare dürfen auch noch nach einer Anweisung in
derselben Zeile stehen. Manchmal werden problematische Anweisungen durch das vor-
angestellte Hochkomma inaktiviert, oder wie die Programmierer sagen, auskommentiert.
Man darf beliebig viele Kommentarzeilen hintereinander verwenden, muss dann aber je-
de Zeile für sich mit dem Hochkomma auskommentieren. Das kann bei gröÿeren Blöcken
lästig werden, daher beachten Sie folgenden Hinweis.
Hinweis
Im Visual Basic Editor kann über die Befehlsfolge Ansicht|Symbolleisten die Sym-
bolleiste Bearbeiten aktiviert werden. Diese enthält eine Schaltäche zum Auskom-
mentieren eines markierten Blocks. Eine weitere Schaltäche macht diesen Vorgang rück-
gängig.

20
2.5 Ein Beispiel

2.5 Ein Beispiel
In einem Betrieb wird die Entlohnung wie folgt festgelegt: Jeder Mitarbeiter erhält ein
Grundgehalt von 1000 Euro und eine Zulage von 50 Euro pro Lebensjahr, sodass ein
Dreiÿigjähriger 2500 = 1000 + 30 · 50 Euro verdient. Zur Anpassung an die Wirtschafts-
lage kann das Grundgehalt verändert werden, zum Ausgleich der Ination werden darauf
prozentuale Zuwächse vorgesehen, deren genauer Wert aber im Gegensatz zum Grund-
gehalt geheim bleiben soll. Die Alterszulage soll dagegen ewig auf den Wert 50 von
Euro eingefroren werden. Im Modul Lohn der Arbeitsmappe VBAEinfuehrung.xls
werden diese Vereinbarungen durch folgenden Quellcode modelliert:
Option Explicit
Muss am Anfang stehen!

Public Grundgehalt As Double
Private Zuwachs As Double

Public Const Zulage = 50

Function Lohn(ByVal Alter As Long) As Double
  Lohn = (Grundgehalt + Zulage * Alter) * (1 + Zuwachs)
End Function

Sub InitDaten()
   Grundgehalt = 1000 ’Darf jeder wissen!
   Zuwachs = 0,1      ’Chefsache!
End Sub

Private Sub LohnTest()
   ’ Zwei Anweisungen in einer Zeile! Brrrr!
   Dim alt As Long   :    alt = 30

   MsgBox "Lohn(30): " & Lohn(30)
   InitDaten
   alt = InputBox("Wie alt sind Sie?", "Alter eingeben", alt)
   MsgBox "Sie sind " & alt & " Jahre alt und verdienen " _
   & Lohn(alt) &   " Euros!"
End Sub
Bevor Sie weiterlesen, beantworten Sie bitte folgende Fragen:
   - Im Code sind zwei Syntaxfehler versteckt. Entdeckt?
   - Wie bringt man die Sub-Prozedur LohnTest zum Laufen?
   - Nach welchem Prinzip werden Anweisungen eingerückt?

                                                                                    21
2 Variablen, Datentypen und Operatoren

      - Wo stehen Kommentare, woran sind sie zu erkennen und wozu dienen sie?
      - Was bewirkt die Anweisung Option Explicit und wo muss sie stehen?
      - In welcher Zeile stehen zwei Anweisungen und woran ist das zu erkennen?
      - Wozu dient das Zeichen _?
      - Auf welche Weise gibt eine Funktion einen Wert zurück?
      - Warum stehen nach InitDaten und MsgBox keine runden Klammern, wohl
        aber nach Lohn und InputBox?
     Einige Antworten und zusätzliche Bemerkungen.
      - Fehler: Beim Kommentar in der zweiten Zeile fehlt der Apostroph. In der zweiten
        Anweisung von InitDaten() steht 0,1 statt 0.1.
      - Die Sub-Prozedur LohnTest() kann über die F5-Taste ausgeführt werden.
      - Anweisungen werden nach dem Beginn einer Sub-Prozedur oder Funktion einge-
        rückt.
      - Kommentare beginnen nach dem Hochkomma. Sie richten sich nur an den Leser.
      - Option Explicit erzwingt die Variablendeklaration. Es muss die erste Anwei-
        sung eines Moduls sein,
      - Jede Zeile darf genau eine Anweisung haben, es sei denn die Anweisungen sind
        durch einen Doppelpunkt : voneinander getrennt wie hier
                   Dim alt As Long:           alt = 30

        Das sollte man aber eigentlich nicht machen!
      - Wenn eine Anweisung zu lang für eine Zeile ist, verwendet man das Fortsetzungs-
        zeichen _ und schreibt in der nächsten Zeile weiter. Das geschieht hier in der
        MsgBox-Anweisung.
      - Der Rückgabewert einer Funktion ist der letzte Wert derjenigen Variablen, die den
        Namen der Funktion trägt. Das ist hier gut an der Funktion Lohn() zu sehen.
      - Das Schlüsselwort ByVal müssen Sie erst einmal hinnehmen. Es steht vor jedem
        Argument einer Sub-Prozedur oder Funktion, aber nur bei deren Deklaration, nicht
        beim Aufruf.
      - Bei Sub-Prozeduren dürfen keine Klammern gesetzt werden, bei Funktionen sind
        sie aber erforderlich. Die MsgBox-Funktion wird wie eine Sub-Prozedur behandelt,
        da der Rückgabewert nicht verwendet wird. Die Rückgabewerte der InputBox-
        Funktion sowie der Funktion Lohn() werden dagegen benutzt und daher sind
        Argumentklammern erforderlich.

22
2.6 Gültigkeit von Variablen

2.6 Gültigkeit von Variablen
Entscheidend für die Verfügbarkeit oder Gültigkeit einer Variablen ist, wo diese Anwei-
sung innerhalb des Moduls steht. Visual Basic unterscheidet bei Code-Zeilen zwischen
zwei Ebenen, der Modul- und der Prozedurebene.
   - Die Modulebene beschreibt den Code, der auÿerhalb einer Prozedur steht. Das sind
     Anweisungen und Deklarationen von Variablen mit Bedeutung für den gesamten
     Modul oder das ganze Projekt. Deklarationen von Variablen für die Modulebene
     müssen zuerst aufgelistet werden, danach folgen die Prozeduren. Diese Art von
     Variablen werden meist globale Variablen genannt.
   - Die Prozedurebene beschreibt Anweisungen, die sich innerhalb einer Prozedur be-
     nden. Deklarationen werden üblicherweise zuerst aufgeführt, gefolgt von Zuwei-
     sungen und anderem ausführbaren Code. Diese Art von Variablen werden meist
     lokale Variablen genannt.
  Innerhalb der Modulebene werden Variablen durch die Schlüsselworte Public oder
Private deklariert. Die allgemeine Form lautet:
[Public][Private]         Variablenname [As Typ]
wobei die Typangabe optional ist, d.h. entfallen kann, wovon ich aber abrate.
  Die Deklaration über Public wird auf Modulebene verwendet, um öentliche Varia-
blen zu deklarieren und den dafür erforderlichen Speicher zu reservieren. Auf Variablen,
die mit der Public-Anweisung deklariert wurden, kann von allen Prozeduren in allen
Modulen aus allen Anwendungen zugegrien werden. Schreibt man allerdings die An-
weisung
Option Private Module
in der Modulebene, sind die Variablen nur innerhalb des zugehörigen Projekts öentlich.
   Variablen vom Typ Private stehen nur in dem Modul zur Verfügung, in dem sie de-
klariert wurden. Statt Private ist auch Dim erlaubt. Beide Anweisungen sind gleich-
wertig, ich bevorzuge wegen der besseren Lesbarkeit Private. Variablen, die damit
auf Modulebene deklariert wurden, stehen allen Prozeduren innerhalb des Moduls zur
Verfügung.
   Beim Schreiben des Codes beginnt man immer mit Variablen und Konstanten, die für
das gesamte Modul Gültigkeit haben sollen, erst dann folgen die Sub-Prozeduren und
Funktionen.
   Auf Prozedurebene werden Variablen durch das Schlüsselwort Dim deklariert, nicht
erlaubt sind hier Private oder oder Public. Solche Variablen sind nur innerhalb der
Prozedur gültig, in der sie deniert wurden. Variablen sollten innerhalb einer Prozedur
immer ganz oben vor allen anderen Anweisungen deklariert werden.
   Im Eingangsbeispiel sind die Variablen Grundgehalt und Zuwachs auÿerhalb der
Prozeduren, d.h. auf Modulebene deklariert und dürfen damit in jeder Prozedur des
Moduls verwendet werden, die Variable Grundgehalt sogar im ganzen Projekt.
   Die Variable alt ist nur innerhalb der Sub-Prozedur LohnTest() gültig.

                                                                                     23
2 Variablen, Datentypen und Operatoren

2.6.1 Lokale Variablen
Lokale Variable sind nur innerhalb der Prozedur gültig, in der sie deniert sind. Man
darf daher denselben Bezeichner in verschiedenen Prozeduren verwenden, aber die zu-
gehörigen Variablen haben nichts miteinander zu tun. Ich verdeutliche das an einem
Beispiel:
Option Explicit

Sub Sub1()
  Dim lok As Long
  lok = 2
  MsgBox "Hier Sub1! lok = " & lok
End Sub

Sub Sub2()
  Dim lok As Long
  lok = 3
  Sub1
  MsgBox "Hier Sub2! lok = " & lok
End Sub
Der Quellcode bendet sich im Modul Lokal. Jede der beiden Sub-Prozeduren kann
über die F5-Taste gestartet werden. Die Prozedur Sub1 wird die Meldung Hier Sub1!
lok = 2 ausgeben. Die Prozedur Sub2 ruft zunächst die Prozedur Sub1 auf mit der
bereits bekannten Meldung. Innerhalb von Sub1 erhält zwar die für diese Prozedur
gültige lokale Variable lok den Wert 2, aber dies hat keine Auswirkung auf die lokale
Variable lok der Prozedur Sub2, die somit ungerührt die Meldung Hier Sub2! lok =
3 veranlasst. Lokale Variable in unterschiedlichen Prozeduren haben nichts miteinander
zu tun, auch wenn der Bezeichner gleich ist!

2.6.2 Globale Variablen
Lokale Variable sind nur innerhalb der Prozedur gültig, in der sie deniert sind, globale
dagegen in allen Prozeduren des Moduls, ggf. sogar in allen Prozeduren des Projekts.
Globale Variable sollte man möglichst ganz vermeiden oder nur sehr sparsam einsetzen.
Auÿerdem sollte man globale Variable am Namen erkennen können. Globale Variable
werden nämlich von lokalen Variablen überdeckt, wenn diese denselben Bezeichner ha-
ben. Ich zeige auch dies an einem Beispiel:
Option Explicit
Public pub As Long

Sub InitPub()
  pub = 1
End Sub

24
2.7 Konstanten

Sub Pub1()
  InitPub
  MsgBox "Hier Pub1! pub = " & pub
End Sub

Sub Pub2()
  Dim pub As Long
  pub = 3
  InitPub
  MsgBox "Hier Pub2! pub = " & pub
  MsgBox "Hier Pub2! GlobLoc.pub = " & GlobLoc.pub
End Sub
Die erste Prozedur ruft zunächst InitPub auf, damit erhält die globale Variable pub
den Wert 1, der Meldungstext ist entsprechend: Hier Pub1! pub = 1. Die zweite
Prozedur hat eine lokale Variable pub, welche die globale Variable pub überdeckt, der
Meldungstext ist daher: Hier Pub2! pub = 3. Die globale Variable ist zwar überdeckt,
aber trotzdem vorhanden. Man kann sie dadurch ansprechen, dass dem Bezeichner der
Name des Moduls gefolgt von einem Punkt vorangestellt wird. Der Name meines Moduls
lautet GlobLoc, daher wird über GlobLoc.pub auf die globale Variable zugegrien.
Das letzte Meldungsfenster gibt also den Text Hier Pub2! GlobLoc.pub = 1 aus.

2.7 Konstanten
Konstante sind wie Variable benannte Elemente für feste, vordenierte Werte von Zah-
len oder Zeichenfolgen, die während der gesamten Programmausführung nicht geändert
werden können. Es gibt bereits unzählige von Visual Basic vordenierte Konstante, jedes
Projekt kann weitere Konstante denieren. Eine Konstante kann durch andere Konstan-
te über arithmetische oder logische Operatoren gebildet werden. Durch die Verwendung
von Konstanten anstelle der tatsächlichen Werte wird der Programmcode leichter les-
bar. Auÿerdem muss der Wert einer Konstanten nur einmal geändert werden, wenn dies
durch äuÿere Umstände nötig sein sollte.
   Die Deklaration von Konstanten muss auf Modulebene vor allen Prozeduren erfolgen!
Vor dem Bezeichner muss das Schlüsselwort Const stehen und nach dem Typ muss die
Wertzuweisung folgen. Davor darf mit Public oder Private die Gültigkeit festgelegt
werden. Wenn diese fehlt, wird Public angenommen. Die allgemeine Form ist also
[Public][Private] Const Bezeichner [As Typ] = Ausdruck
Dabei sind alle Datentypen zulässig. Wird der Typ nicht angegeben, ermittelt Visual
Basic einen zum Wert passenden Typ. Gültige Beispiele von Konstanten sehen Sie jetzt.
Private Const KurzPi = 3.14
Public Const LangPi As Double = KurzPi + 0.00159
Public Const GebDatum = "19.1.1971"

                                                                                    25
2 Variablen, Datentypen und Operatoren

Nur die Konstante LangPi habe ich mit Typ deklariert, die Typen der beiden anderen
Konstanten werden von Visual Basic selbst eingesetzt. Nach der Deklaration können die
Konstanten GebDatum und LangPi in allen Prozeduren des Projekts und KurzPi in
allen Prozeduren des Moduls benutzt werden, sofern sie typgerecht behandelt werden.
   Im Eingangsbeispiel ist die Konstante Zulage auf Modulebene vor den Prozeduren
deklariert und darf damit in jeder Prozedur des Moduls und wegen Public sogar des
ganzen Projekts verwendet werden.

2.8 Gültigkeit von Prozeduren
Prozeduren sind grundsätzlich in allen Modulen des Projekts, ja sogar in allen Mo-
dulen aller Anwendungen verfügbar, dazu ist anders als bei Variablen das Schlüssel-
wort Public nicht nötig, dürfte aber zur besseren Lesbarkeit vor dem Schlüsselwort
Sub bzw. Function stehen. Prozeduren können aber durch das vorangestellte Schlüs-
selwort Private auf die Verwendung innerhalb der Prozeduren des eigenen Moduls
eingeschränkt werden, wie etwa bei der Prozedur LohnTest() des Eingangsbeispiels,
In einem weiteren Modul namens Gueltigkeit habe ich die folgende Prozedur geschrie-
ben:
Option Explicit
Sub Ausgabe()
   InitDaten
   MsgBox "Grundgehalt: " & Grundgehalt _
   & vbNewLine & "Lohn im Alter 30: " & Lohn(30)
  ’Nicht erlaubt in einem anderen Modul
  ’MsgBox "Zuwachs = " & Zuwachs
  ’LohnTest
End Sub
Ich darf die Prozedur InitDaten() und die Variable Grundgehalt verwenden, da
der Gültigkeitsbereich über das eigene Modul Lohn hinausgeht. Die beiden auskom-
mentierten Anweisungen wiese der Interpreter ab, da die Variable Zuwachs und die
Prozedur LohnTest() in ihrer Gültigkeit auf das Modul Lohn beschränkt sind. Um
dies aufzuheben, müsste die Variable Zuwachs mit Public deklariert werden und vor
der Prozedur LohnTest() ist Private zu streichen oder durch Public zu erset-
zen.

2.9 Einfache Datentypen
Für jede Variable muss der Interpreter Speicherplatz anlegen. die Gröÿe dieses Spei-
cherplatzes hängt vom Datentyp der Variablen ab. Während der Laufzeit wehrt sich
der Interpreter gegen unzulässige Operationen, etwa wenn einer Variablen vom Typ
Double eine Zeichenfolge zugewiesen werden soll. Die wichtigsten Basistypen von Vi-
sual Basic stehen für Zahlen, logische Ausdrücke, Zeichenfolgen und Datumswerte Die

26
Sie können auch lesen