Excel aufmöbeln mit VBA - Dietrich Baumgarten "10. Oktober 2014
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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