htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Programmieren in EXCEL mit VBA Einführung in das Programmieren mit VBA Inhaltsverzeichnis Einleitung ................................................................................................................... 2 Dein erstes VBA Programm... .................................................................................... 2 Definiere ein Steuerelement... ................................................................................ 2 Verbinde ein Programm mit dem Steuerelement... ................................................ 3 Führe das Programm aus... ..................................................................................... 4 Einstieg ins Programmieren mit Word ....................................................................... 5 Programmieren ohne Steuerelemente ......................................................................... 7 Das Objekt „Tabelle1“ ............................................................................................... 8 Der Name eines Objekts (Name of object) ............................................................ 9 Eigenschaften (Properties) des Objektes „Tabelle1“ ............................................. 9 Die Methoden eines Objekts ................................................................................ 12 Der Eingabeknopf – ein „Objekt im Objekt“ ....................................................... 12 Übungen mit mehreren Steuerelemente ............................................................... 14 Eine neue Eigenschaft für ein Objekt definieren.................................................. 14 Programmstrukturen ................................................................................................. 17 Verzweigungen ..................................................................................................... 17 Zählschleifen ........................................................................................................ 19 Gesteuerte Schleifen (Bedingter Schleifendurchlauf) .......................................... 21 Die For - Each Schleife ........................................................................................ 22 Wichtige Objekte in EXCEL.................................................................................... 23 Der Makro-Recorder ................................................................................................ 26 Fehler suchen und beheben ...................................................................................... 27 „Syntaxfehler“ und „Laufzeitfehler“ .................................................................... 27 „Breakpoints“ setzen und „Einzelschritte“ ausführen .......................................... 27 Das „Direktfenster“ .............................................................................................. 27 © Lothar Kerbl 10.6.2005 Seite 1 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Einleitung Dieses Skriptum setzt voraus, dass du mit den Grundlagen von EXCEL vertraut bist. Was bedeuten die Begriffe „Zeile“, „Spalte“, „Zelle“, „Bereich“, „Tabelle“, wie werden sie bezeichnet ? Wie gibt man Texte, Zahlen, Daten in verschiedenen Formaten ein ? Wie funktioniert das automatische Ausfüllen ? Wie gibt man „Formeln“ ein ? Wie kann man Zellen „benennen“, welchen Vorteil haben „benannte“ Zellen bzw. Bereiche ? Welche „Funktionen“ hast du in Formeln EXCEL Tabellen verwendet ? Was sind „Argumente“ einer Funktion ? Was ist eine „Bedingte Formel“ („Wenn-Formel“) Dein erstes VBA Programm... Definiere ein Steuerelement... Steuerelement in einem Tabellenblatt einbauen.... Bild 1. Vorbereitung zum Einfügen von Steuerelementen; beachte, dass auch die Symbolleiste „Visual Basic“ sichtbar ist. © Lothar Kerbl 10.6.2005 Seite 2 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 2. Visual Basic Steuerelemente Bild 3. Einfügen eines „Steuerknopfes“ (Command Button) Verbinde ein Programm mit dem Steuerelement... Bild 4. Anbinden von Programmcode an einen „Eingabeknopf“ (Option „Code anzeigen“ im Kontextmenu1)...... 1 Das Kontextmenü eines „sichtbaren Objekts“ wird durch „Rechtsclick“ angezeigt © Lothar Kerbl 10.6.2005 Seite 3 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 5. .....und schon hast du den Einstieg in die Welt des Programmierens geschafft ! Das Programm (die Folge von Anweisungen, die beim „Anclicken“ des Steuerelements ausgeführt werden) musst du selbst schreiben. Dein erstes Programm besteht aus einer „Anweisung“. Es ist die Anweisung „MsgBox“ mit einem zugehörigen Argument2. Die Anweisungen eines Programmes werden von einer Überschrift und einem Kennzeichen für das Programmende eingerahmt. Führe das Programm aus... Um dein Programm auszuführen, musst du wieder zum Tabellenblatt wechseln (nicht vergessen: in EXCEL musst du den „Entwurfsmodus“ verlassen ). Klicke auf das „Steuerobjekt“ CommandButton1 und ..... Bild 6. Gratulation, wenn es bei dir auch so aussieht – du hast gerade dein erstes selbst geschriebenes Programm ausgeführt ! 2 Den Begriff „Argument“ kennst du bereits von den EXCEL-Formeln. © Lothar Kerbl 10.6.2005 Seite 4 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Einstieg ins Programmieren mit Word Deinen Einstieg in die Welt des Programmierens kannst du auch in Word versuchen. Du könntest in „Word“ die Steuerelemente auch direkt auf dein „Blatt“ platzieren, (Menupunkt „Ansicht“/“Symbolleisten“) wir wollen aber „als Unterlage“ ein Fenster (Form) erstellen. Du rufst Word auf und wechselst in die „VBA-Programmierumgebung:“ Bild 7. Aufruf des VB-Editors aus Word Hinweis: Du kannst auch in EXCEL in derselben Weise ein Fenster als Grundlage für deine Steuerelemente erstellen ! Bild 8. Erstellen eines Eingabefensters im Entwurfsmodus (in der VBA-Entwicklungsumgebung) Das Eingabefenster kannst du mit Steuerelementen bestücken. Als erstes Steuerelement platzierst du eine Befehlsschaltfläche („Eingabeknopf“) auf deinem Eingabefenster: © Lothar Kerbl 10.6.2005 Seite 5 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 9. Das Eingabefenster kann mit Steuerelementen „bestückt“ werden ... Bild 10. ... ein „Doppelklick“ (bzw. „Code anzeigen“) und du kannst die „Click-Methode“ deines Steuerelementes programmieren Wenn dein Eingabefenster fertig ist (alle vorgesehenen Steuerelemente sind platziert, die zugeordneten Methoden sind programmiert), dann kannst du dein Programm ausführen: Bild 11. Du kannst dein „Programm“ durch „Anclicken“ der Pfeiltaste starten... © Lothar Kerbl 10.6.2005 Seite 6 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 12. ... und das sollte so das aussehen (das „Hallo Fenster“ wird natürlich erst geöffnet, nachdem du durch „AncClicken“ des „CommandButton1“ die zugehörige „Click-Methode“ aufgerufen hast.) Wahrscheinlich fällt dir auf, dass dein selbsterstelltes Fenster „nicht ganz“ das gewohnte „Windows Feeling“ vermittelt: Du kannst nämlich nicht einfach durch Anklicken mit der Maus auf das dahinterliegende Textblatt umschalten und dort Text eingeben, solange das „UserForm1“ geöffnet ist. Das „UserForm1“ lässt nicht zu, dass es „beiseite“ geschoben und ein anderes Fenster (inklusive Desktop) „aktiviert“ wird. Dieses Verhalten kennst du schon von den Fenstern „MsgBox“. Fenster mit solchen Eigenschaften nennt man „modal“.3 (Eigenschaften „ShowModal = True“) Wenn du beim Entwurf von UserForm1 die Eigenschaft „ShowModal“ auf „False“ setzt, zeigt dein Fenster das „gewohnte Windows-Verhalten“. Programmieren ohne Steuerelemente Dein Programm kommt auch ohne sichtbare Steuerelemente aus. Die folgende Anleitung gilt für „Word“ und „EXCEL“. (Dargestellt ist die Programmierung in EXCEL) 3 Das Gegenstück dazu sind Fenster nach dem „MDI“-Standard (Multiple Document Interface) © Lothar Kerbl 10.6.2005 Seite 7 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 13. Ein „Modul“ ist ein Programmtext ohne Bindung an ein Steuerelement Bild 14. Erstelle den Programmtext, nachdem ein „Modul“ eingefügt wurde... Dieses Programm wird als „Makro“ bezeichnet und kann unter dem Namen „main“ aufgerufen werden (Menupunkt „Extras“/ „Makro“ / „Ausführen“) Das Objekt „Tabelle1“ Wir wollen nun Programme schreiben, die Aufgaben mit dem EXCEL Tabellenblatt erledigen. Wir werden dazu die Werte von Eigenschaften („Values of Properties“) von Objekten („objects“) verändern. Natürlich kannst du auch Aufgaben mit dem WORD-Text durch ein (von dir erstelltes) Programm ausführen. Word-Objekte werden in diesem Skriptum allerdings nicht beschrieben. Unabhängig davon, ob du VBA in einer „WORD-Umgebung“ oder in einer „EXCEL-Umgebung“ benutzt, kannst du viele Programme, die nicht auf die WORD- oder EXCEL-Objekte angewiesen sind, erstellen und dabei grundlegende Programmiererfahrung sammeln. © Lothar Kerbl 10.6.2005 Seite 8 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Der Name eines Objekts (Name of object) Das Programm, das du schreibst, muss irgendwie „mit dem EXCEL Tabellenblatt arbeiten“ können. Dazu musst du in der Lage sein, die „Objekte des Tabellenblattes“ zu bezeichnen. Dinge, mit denen Programme arbeiten, werden als „Objekte“ bezeichnet. Das angezeigte EXCEL-Tabellenblatt ist ein Objekt, es wird unter dem Namen „Tabelle1“ oder auch „ActiveSheet“ im Programmtext angesprochen. Eigenschaften (Properties) des Objektes „Tabelle1“ Das dargestellte EXCEL-Tabellenblatt hat eine Reihe von Eigenschaften. Diese Eigenschaften können in einem Programm verwendet (gelesen) oder neu eingestellt (beschrieben) werden. Objekte haben Eigenschaften („Properties“). Die Bezeichnung („Name of Propertiy4“) einer Eigenschaft wird durch Punktschreibweise nach dem Objektnamen angegeben. Die Eigenschaften eines Objektes können unterschiedliche Werte („Values of Property“)annehmen Beispiel: Zeige den Wert der Eigenschaft „StandardWidth“ des Objektes „Tabelle1“ an Private Sub CommandButton1_Click() MsgBox (Tabelle1.StandardWidth) End Sub Bild 15. Der aktuellen Wertes der Eigenschaft „StandardWidth“ des Objekts „Tabelle1“wird angezeigt, 4 Beachte, dass sowohl das Objekt selbst als auch seine Eigenschaften „Namen“ haben. © Lothar Kerbl 10.6.2005 Seite 9 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA wenn du das Programm durch Anclicken von „CommandButton1“ ausführst Wenn du das Programm schreibst, fällt dir sicher folgendes auf: Nach Eingabe des Punktes hinter „Tabelle1“ wird dir ein „Angebot“ für die weitere Texteingabe gemacht. Die möglichen Eigenschaften werden angezeigt Bild Bei der Erstellung von Programmen werden die Namen der Objekteigenschaften angezeigt Der Editor5 erkennt nämlich, dass „Tabelle1“ der Name eines Objektes ist, und dass du wahrscheinlich eine der Eigenschaften dieses Objektes in deinem Programm verwenden willst. Wie du an der Auswahl erkennst, gibt es sehr, sehr viele Eigenschaften6 des Tabellenblattes „Tabelle1“. Diese Eigenschaften haben mitunter recht eigenartige Namen. Kein Programmierer kann sich alle Eigenschaftsbezeichnungen von allen möglichen Objekten merken, und so stellt diese Auswahlliste eine unentbehrliche Hilfe bei der Programmerstellung dar. Beispiel: Ändere den Wert der Eigenschaft „StandardWidth“ des Objektes „Tabelle1“ entsprechend einer Eingabe über die Tastatur. Private Sub CommandButton1_Click() Tabelle1.StandardWidth = InputBox("Gib die Zellenbreite ein!") End Sub .. oder7 Private Sub CommandButton1_Click() StandardWidth = InputBox("Gib die Zellenbreite ein!") End Sub In diesem Beispiel hast du die Funktion InputBox verwendet. Damit kannst du einen Wert von der Tastatur einlesen und diesen Wert der Eigenschaft, die auf der linken Seite des „=“ Zeichens steht zuweisen. 5 Editor: Das ist das Textprogramm, mit dem du den Programmtext (Source Code) erstellst Eigenschaften („Properties“) sind durch das Symbol „ “ gekennzeichnet. Der „fliegende grüne Ziegel“ ( ) kennzeichnet eine „Methode“ des Objekts. „Methoden“ des Objekts werden im nächsten Kapitel behandelt. 7 Wenn als Zielobjekt „das eigene Objekt“ gemeint ist, kann dessen Name (hier „Tabelle1“) auch weggelassen werden. Den Namen des „eigenen“ Objekts, siehst du in der Kopfzeile im Editorfenster. 6 © Lothar Kerbl 10.6.2005 Seite 10 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Beachte, dass das „=“ Zeichen in diesem Fall nicht eine Gleichheit anzeigt sondern „eine Zuweisung („Assignment“) bewirkt“. Neben der Eigenschaft „StandardWidth“ hat das Objekt „Tabelle1“ auch die Eigenschaft „StandardHeight“. Diese Eigenschaft kannst du aber nur „abfragen“ und nicht verändern („read only“) Beispiel: Ändere den Inhalt (Eigenschaft „Value“) des Objektes „Zelle A1 des Tabellenblattes“8 Private Sub CommandButton1_Click() Tabelle1.Cells(1, 1).Value = InputBox("Gib einen Wert für das Feld A1 ein") MsgBox ("beachte den Inhalt der Zelle A1") End Sub Aufgabe: Wie musst du das Programm ändern, dass der Inhalt der Zelle A5, C1, C3,... geändert wird ? Kontrollfragen: 1. Was bedeutet „Argument“ beim Programmieren 2. Warum wurde bei der MsgBox das Argument (Tabelle1.StandardWidth) nicht unter Anführungszeichen („“) angegeben. Wann muss in der MsgBox das Argument unter Anführungszeichen angeben werden ? 3. Wozu dient die Angabe eines Textes in der InputBox Anweisung 4. Was geschieht, wenn ein nicht erwarteter Wert bei einer InputBox Anweisung eingegeben wird (z.B. bei der Frage nach der Spaltenbreite wird der Buchstabe „A“ eingegeben) 5. Was geschieht in dem folgenden Programm ? Private Sub CommandButton1_Click() Tabelle1.StandardWidth = Tabelle1.StandardHeight End Sub 6. Was geschieht, wenn du in einem Programm versuchst, die Zellenhöhe des Tabellenblattes zu verändern ? 7. Schreibe ein Programm, das in einer MsgBox den Inhalt der Zelle A2 ausgibt. 8. Schreibe ein Programm, das das Vierfache des Inhaltes der Zelle A1 in die Zelle B3 schreibt.9 Die Bedeutung der Schreibweise „Tabelle1.Cells(1,1)“ als Name für das Objekt „Zelle A1“ wird noch genauer erklärt werden. 9 Natürlich kannst du dasselbe Ergebnis ohne Programmierung durch Eintrag einer Formel in der Zelle B3 erzielen 8 © Lothar Kerbl 10.6.2005 Seite 11 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA 9. Was passiert, wenn du den Wert der Eigenschaft „Tabelle1.Name“ änderst10 ? Die Methoden eines Objekts Objekte haben Methoden (Methods) Eine Methode eines Objektes wird durch ein Ereignis (Event) ausgelöst. Anders formuliert: Objekte reagieren auf Ereignisse(Events) durch Ausführen ihrer Methoden (methods) Ein Ereignis kann auch als „Botschaft (Message) an ein Objekt“ interpretiert werden. Die Methoden von Objekten sind Programme. Diese Programme ... werten die Eigenschaften des eigenen Objekts aus. ... verändern die Werte der Eigenschaften des eigenen Objekts ... veranlassen andere Objekte, deren Methoden auszuführen („Sie erzeugen Ereignisse (create events) für andere Objekte“ bzw. „Senden Botschaften (send messages) an andere Objekte“) ... lesen und verändern die Eigenschaften anderer Objekte11 Methoden benötigen unter Umständen Argumente, durch die ihre Funktionsweise (genauer) definiert wird. Private Sub CommandButton1_Click() Tabelle1.Cells(1, 1).AddComment ("blablabla")12 End Sub oder13 Private Sub CommandButton1_Click() Cells(1, 1).AddComment ("blablabla") End Sub Der Eingabeknopf – ein „Objekt im Objekt“ Bisher wissen wir, dass Objekte Eigenschaften haben, denen ein Wert zugewiesen werden kann. Beachte: Durch Änderung der Eigenschaft „Tabelle1.Name“ änderst du nicht die Bezeichnung, mit der du das Objekt in deinem Programm ansprichst. 11 Einige Programmieransätze gehen davon aus, dass die Eigenschaften anderer Objekte nicht direkt gelesen oder verändert werden sollen. Im Sinne einer „Kapselung“ sollte das nur durch „Botschaften an das andere Objekt“ möglich sein. 12 Der Kommentartext ist das Argument der Methode „AddComment“ 13 Siehe dazu die Bemerkung über die Verwendung des Namens für „das eigene Objekt“ 10 © Lothar Kerbl 10.6.2005 Seite 12 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Objekte können neben Eigenschaften auch Objekte „enthalten“ (Das umfassende Objekt wird dabei auch als „Container“ bezeichnet). Die enthaltenen Objekte haben selbst wieder Eigenschaften. Ein enthaltenes Objekt wird durch die Punktschreibweise hinter das Containerobjekt geschrieben. Diese „Container-Beziehung“ ist in beliebiger Tiefe fortsetzbar. Ein Beispiel für eine „Container-Beziehung“ hast du schon kennen gelernt. „Tabelle1.Cells(1,1)14“ bezeichnet das Objekt Zelle EXCEL-Zelle„A1“ im Tabellenblatt „Tabelle1“. Auch der Eingabeknopf ist ein Objekt innerhalb des Objekts „Tabelle1“ Er hat den Namen Tabelle1.CommandButton1 Du siehst diesen Namen im „Angebot“ der Eigenschaften von Tabelle1 aufgelistet15. Bild 16. Das Objekt „CommandButton1“ wird wie eine „Eigenschaft“ des Objekts „Tabelle1“ angezeigt Die Eigenschaften des Eingabeknopfes CommandButton1 kannst du natürlich ebenfalls abfragen oder ändern. Bild 17. Eigenschaften und Methoden des Objektes „Tabelle1.CommandButton1“ („Objekt im Objekt“) Private Sub CommandButton1_Click() Tabelle1.CommandButton1.Caption = "ok" Vorläufig bleibt noch die Erklärung der Indexschreibweise „(1,1)“ offen. Die Schreibweise ist im Zusammenhang mit einer EXCEL-Eingabe wohl selbsterklärend, wir werden aber später bei der Erklärung von „Collections“ noch genauer darauf eingehen. 14 Beachte, dass ein „Objekt im Objekt“ durch dasselbe Symbol „ Eigenschaft eines Objekts. 15 © Lothar Kerbl 10.6.2005 “ angezeigt wird, wie die Seite 13 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA End Sub natürlich funktioniert auch ... Private Sub CommandButton1_Click() CommandButton1.Caption = "ok" End Sub Hinweis: Beachte, dass die Beschriftung „ok“ erst dann erscheint, wenn der Eingabeknopf „angeclickt“ wird, also genau dann, wenn das „ClickEreignis“ auftritt, das Steuerelement die „Click Botschaft“ erhält und darauf mit seiner „Click“-Methode reagiert. Übungen mit mehreren Steuerelemente Versuche nun, die Eigenschaften der Steuerelemente genauer zu verstehen. Du kannst natürlich auch mehrere Steuerelemente auf deinem Tabellenblatt platzieren. Versuche zum Beispieldurch einen „Knopfdruck“ .. ...denn Inhalt der Zelle C4 in ein „Textfeld“ zuschreiben. ... die aktuelle Uhrzeit in das EXCEL-Feld B2 zu schreiben ... die Farbe des Zellbereiches A3:C5 entsprechend der Farbe der Zelle A1 zu ändern ... einen zweiten Eingabeknopf darzustellen bzw. zu verbergen (Eigenschaft „visible“) ...den Eingabeknopf nach rechts wandern zu lassen .... Wie raegieren „Kontrollkästchen“ und „Optionsfelder“ ? Wie heißen die „Routinen“, die beim „Anklicken“ eines Kontrollkästchens bzw. eines Optionsfeldes ausgeführt werden ? Notiere dir Anmerkungen zu den wichtigsten Eigenschaften. Es ist praktisch unmöglich, alle Eigenschaften der Steuerelemente im Detail zu kennen, auch erfahrene Programmierer finden immer neue Möglichkeiten für den Einsatz der Eigenschaften der Objekte. Eine neue Eigenschaft für ein Objekt definieren Können wir Eigenschaften auch selbst anlegen ? Du musst da genau aufpassen: Ich meine damit nicht, den Wert einer Eigenschaft zu ändern, sondern überhaupt eine neue Eigenschaft für das Objekt zu definieren. Zu abstrakt ? – Vielleicht hilft ein Beispiel: Du möchtest den Eingabeknopf „verbessern“, indem du ihm mit einem „Gedächtnis“ ausstattest. Jedes „Anclicken“ soll registriert werden, die Anzahl der © Lothar Kerbl 10.6.2005 Seite 14 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA ausgeführten Clickvorgänge soll zu einer zusätzlichen „Eigenschaft“ des Tabellenblattes „Tabelle1“ werden. Damit verfügt dein Eingabeknopf über eine „Zählerfunktion“. Dieser Zähler funktioniert vorerst noch „im Verborgenen“. Du solltest dir also noch überlegen, wie du den Zählerwert („Wert einer Eigenschaft“) anzeigst, und wie du die registrierte Anzahl der Zählereignisse „zurücksetzen“ kannst . © Lothar Kerbl 10.6.2005 Seite 15 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 18. Einfügen der selbstdefinierten Eigenschaft „a“ (Ganzzahl) in das Objekt „Tabelle1“16 Bild 19. Die „Oberfläche“ eines Programmes, das die selbsterstellte Eigenschaft „a“ verwendet Bild 20. Die selbstdefinierte Eigenschaft ist sogar in der Eingabehilfe sichtbar Mit der Anweisung „Public“ definierst du eine Eigenschaft, die auch von außerhalb des Objektes sichtbar ist. Wenn du die Eigenschaft nur innerhalb des Objektes (d.h. von Methoden des eigenen Objektes) bearbeiten lassen willst, dann verwendest du die Anweisung „Dim“. In diesem Fall darfst du in den Anweisungen den Namen „a“ nur ohne vorangestellten Namen „Tabelle1“ verwenden. 16 © Lothar Kerbl 10.6.2005 Seite 16 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Programmstrukturen Verzweigungen Teile der "if-Anweisung" (Verzweigungsanweisung) Eine Bedingung wird ausgewertet, und abhängig vom Ergebnis wird einer der beiden "Zweige" (Anweisungen) ausgeführt. Eine Bedingung ist ein Ausdruck, der als Ergebnis entweder "wahr" oder "falsch" liefert. Die „If Anweisung“ ohne „else“ Liefert die Auswertung der Bedingung das Ergebnis "true", so werden die Anweisungen zwischen "then" und "end if" ausgeführt Liefert die Auswertung der Bedingung das Ergebnis „false“ wird sofort die auf "end if " folgende Anweisung ausgeführt. Die „If Anweisung“ mit „else“ Liefert die Auswertung der Bedingung das Ergebnis "true", so werden die Anweisungen zwischen "then" und "else" ausgeführt. Liefert die Auswertung der Bedingung das Ergebnis „false“ werden die Anweisungen zwischen "else" und "end if" ausgeführt. Struktogramm und Flussdiagramm einer Verzweigung Struktogramm: Die „äußere Form“ ist ein „Kasten“. Ein Kasten kann an jeder Stelle eingesetzt werden, an der eine „Anweisung“ steht. Flussdiagramm: Grundelemente eines Flussdiagrammes sind Anfangs- und Endpunkt Anweisungen Verzweigungen („ja“ / „nein“) (gerichtete) Linien Vereinigungspunkte Markierungen („Label“) © Lothar Kerbl 10.6.2005 Seite 17 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Beispiel Das Programm soll nach dem Anclicken des CommandButton1 den Wert in der Zelle A1 als Schulnote interpretieren und eine oder mehrere passende Bemerkung (abhängig von den Inhalten verschiedener EXCEL-Felder) ausgeben.... Das Einrücken von Text ist nicht notwendig, die Programmteile die im Falle „wahr“ bzw. „falsch“ ausgeführt werden, werden durch die „Schlüsselwörter“ geklammert: Zwischen If und then steht die Bedingung, die als Ergebnis „wahr“ oder „falsch“ liefert Zwischen Then und else stehen die Anweisungen, die bei „wahr“ ausgeführt werden. Zwischen Else und end if stehen die Anweisungen, die bei „falsch“ ausgeführt werden. Private Sub CommandButton1_Click() If (Tabelle1.Cells(1,1).Value < 4) Then msgBox "...das war schon ganz gut" Else msgBox "...du solltest dich mehr anstrengen !" msgBox " weil so geht das nicht weiter !" End if If (Tabelle1.Cells(1,1).Value = 5) Then msgBox("...das wahr wohl nichts!") End if End Sub Die mehrstellige Verzweigung „if – elseif“ If <Bedingung1> then <Anweisung1> ElseIf <Bedingung2> <Anweisung2> ElseIf <Bedingung3> <Anweisung3> ....... Else <Anweisung_n> End If Die erste Anweisung im Programmtext, deren zugehörige „Wächterbedingung“ wahr ist, wird ausgeführt,. 17 In den „nein“- Pfaden des Flussdiagrammes wird jeweils eine weitere Verzweigung eingefügt. Alle Pfade aus den Verzweigungen laufen in einem Vereinigungspunkt zusammen. Beachte den Unterschied zur Programmiersprache „C“: In C werden in einer mehrstelligen Verzweigung alle Anweisungen ausgeführt, deren „Wächterbedingungen“ wahr sind. 17 © Lothar Kerbl 10.6.2005 Seite 18 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Die Mehrfachverzweigung „Select Case“ Select Case-Anweisung Select Case <Testausdruck> Case <Ausdrucksliste1> <Anweisung1> Case <Ausdrucksliste2> <Anweisung2> .... Case Else <Anweisung_n> End Select Anstelle von Bedingungen ( mögliche Ergebnisse „ja/nein“) stehen die möglichen Ergebnisse eines <Ausdrucks> als „Wächter“ für die jeweiligen Anweisungen. Die Ergebnisse des <Ausdrucks> müssen „aufzählbar“ sein. Beispiele zu Verzweigungen Programmbeispiele für alle Arten von Verzweigungen, erstelle zuerst das Flussdiagramm (bzw. das Struktogramm) Zählschleifen Beispiel: du möchtest alle Zellen von A1 bis A20 mit einem Text ausfüllen. Natürlich kennst die „Automatisch Ausfüllen“ („Herunterziehen“) Funktion von EXCEL. Wir wollen aber das Ausfüllen programmgesteuert durchführen: Private Sub CommandButton1_Click Tabelle1.Cells(1,1)=“Hallo !“ Tabelle1.Cells(2,1)=“Hallo !“ Tabelle1.Cells(3,1)=“Hallo !“ Tabelle1.Cells(4,1)=“Hallo !“ Tabelle1.Cells(5,1)=“Hallo !“ Tabelle1.Cells(6,1)=“Hallo !“ Tabelle1.Cells(7,1)=“Hallo !“ Tabelle1.Cells(8,1)=“Hallo !“ Tabelle1.Cells(9,1)=“Hallo !“ Tabelle1.Cells(10,1)=“Hallo !“ Tabelle1.Cells(11,1)=“Hallo !“ Tabelle1.Cells(12,1)=“Hallo !“ Tabelle1.Cells(13,1)=“Hallo !“ Tabelle1.Cells(14,1)=“Hallo !“ Tabelle1.Cells(15,1)=“Hallo !“ Tabelle1.Cells(16,1)=“Hallo !“ Tabelle1.Cells(17,1)=“Hallo !“ Tabelle1.Cells(18,1)=“Hallo !“ Tabelle1.Cells(19,1)=“Hallo !“ Tabelle1.Cells(20,1)=“Hallo !“ End Sub .... Das muss doch einfacher gehen © Lothar Kerbl 10.6.2005 Seite 19 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Programmteile, die mehrmals hintereinander ausgeführt werden sollen, und von denen du spätestens unmittelbar vor der ersten Ausführung weißt, wie oft sie ausgeführt werden sollen, werden in eine Zählschleife „eingepackt“. Die Zählvariable (eine Ganzzahl) kann innerhalb der Zählschleife verwendet werden („lesender Zugriff“), sie sollte aber keinesfalls innerhalb der Zählschleife verändert werden. .... Dim Zaehler as integer For Zaehler = 1 to 20 do Tabelle1.Cells(Zaehler,1)=“Hallo !“ Next .... Eine Zählschleife steht zwischen For und Next Die Zählschleife besteht aus einer Steueranweisung und dem Schleifenrumpf. Der Textanfang des Schleifenrumpfes (=das Textende der Steueranweisung) ist in Visual Basic nicht besonders gekennzeichnet. Das Textende des Schleifenrumpfes (=das Ende der Programmtextes der Zählschleife) ist durch Next gekennzeichnet. Die Steueranweisung „wirkt“ auf eine Zählvariable, sie wird vor jedem Schleifendurchlauf ausgeführt. Die lokale Zählvariable Als Zählvariable muss eine Ganzzahlvariable verwendet werden. Am besten ist diese „möglichst als lokal Variable“ zu vereinbaren. Lokale Variable werden unmittelbar nach der Überschrift definiert. Lokale Variable „leben“ nur solange, wie die Routine, in der sie verwendet werden, ausgeführt wird. Mit lokalen Variablen ist es nicht möglich, Werte von einem Prozeduraufruf zum nächsten zu „retten“. Die Option „STEP“ in einer Zählschleife Oft ist es dabei vom Vorteil, wenn die Zählvariable nicht einfach durch Weiterzählen verändert wird. Durch die Option „STEP“ unmittelbar hinter der Steueranweisung kannst du die Zählvariable in „größeren Schritte“ verändern. Auch das „Herunterzählen“ durch Angabe eines negativen Wertes ist möglich. Sei vorsichtig mit der STEP-Option: Was macht das folgende Programm ? Private Sub CommandButton1_Click() Dim SchleifenZaehler As Integer For SchleifenZaehler = 1 To 10 Step 0 © Lothar Kerbl 10.6.2005 Seite 20 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA MsgBox ("Das ist der " + Str(SchleifenZaehler) + ". Durchlauf") Next End Sub Übungen zu Zählschleifen Füge die Zahlen (1,2,3,...20) in die Zellen C1,D1,E1,... ein Füge die Zahlen (102, 103,104,....118) in die Zellen F3,G4,H5,.... ein Füge die Zahlen (20,18,16,...0) in die Zellen G12,G11,G10,....ein Füge die Quadratzahlen (1,4,9,16,....,400) in die Zellen A1,B2,C1,D2,..... ein .....finde weitere „Einfügemuster“ Gesteuerte Schleifen (Bedingter Schleifendurchlauf) Bei vielen Schleifen steht vor dem ersten Durchlauf noch nicht fest, wie oft der Schleifenrumpf durchlaufen werden soll. In diesem Fall wird vor, nach oder während der Bearbeitung des Schleifenrumpfes eine Bedingung ausgewertet. Das Ergebnis dieser Bedingung entscheidet über: nochmaligen Schleifendurchlauf (Fortsetzung) oder Ausstieg aus der Schleife (Abbruch) Gesteuerte Schleifen können leicht zu Endlosschleifen werden, wenn die Bedingung nie zum Abbruch führt. Eine „Terminierungszusicherung“ solltest du in deinen Programmen für jede Schleife garantieren können. Kopfgesteuerte Schleifen Kopfgesteuerte Schleife mit Fortsetzungsbedingung Do while <Bedingung> <Anweisung(en)> Loop Kopfgesteuerte Schleife mit Abbruchbedingung Do until <Bedingung> <Anweisung(en)> Loop In einer kopfgesteuerten Schleife wird der Schleifenrumpf gegebenenfalls überhaupt nicht durchlaufen. Fußgesteuerte Schleifen Fußgesteuerte Schleife mit Fortsetzungsbedingung Do <Anweisung(en) Schleifenrumpf> © Lothar Kerbl 10.6.2005 Seite 21 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Loop while <Bedingung> Fußgesteuerte Schleife mit Abbruchbedingung Do <Anweisung(en) Schleifenrumpf> Loop until <Bedingung> In einer fußgesteuerten Schleife wird der Schleifenrumpf auf alle Fälle mindestens einmal durchlaufen. Endlosschleife und N+1/2 Schleife .... Do `keine Bedingung am Anfang der Schleife MsgBox („das geht ohne Ende so weiter....!“) MsgBox („hoffentlich kann man noch den Task-Manager aufrufen!“) Loop `keine Bedingung am Ende der Schleife ... Natürlich hat in einem „ordentlichen“ Programm eine Endlosschleife keinen Sinn. Endlosschleifen sind nur dann sinnvoll, wenn „irgendwo“ ein Aussprung möglich ist, und damit werden auch sie zu gesteuerten Schleifen.18 Dieser „Aussprung“ – also der Punkt, an dem die Entscheidung über eine Fortsetzung der Schleife zu treffen ist- kann "mitten im Schleifenrumpf" programmiert werden. („bedingtes Exit19“) ... Do Msgbox(„weißt du das Zauberwort ? Gib es ein :“) If Inputbox() = “danke” then Exit Do ‘Schleifensteuerung Msgbox(„das war falsch ... versuch es nochmals !“) Loop MsgBox („genau das ist es !“) ... Skizziere die Flussdiagramme der „Endlosschleife“ und der „n+1/2 Schleife“. Übungen zu Schleifen: zeichne zuerst das Flussdiagramm, formuliere die Aufgabenstellung in allen Schleifenvarianten. Finde die jeweils geeignetste Variante. Die For - Each Schleife Diese Schleife ist eine besondere Form der „Zählschleife“. 18 Es gibt Sonderfälle, bei denen Endlossschleifen ohne programmierten Aussprung sinnvoll sind (z.B. interruptgesteuerte Programme in Mikrocontrolleranwendungen) 19 In früheren Versionen von VB genügte die Anweisung „Exit“ alleine (ohne „Do“) © Lothar Kerbl 10.6.2005 Seite 22 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Die For Each Schleife dient dazu, alle Elemente einer „Collection“ nacheinander zu bearbeiten. Während in einer Zählschleife die „Laufvariable“ eine ganze Zahl sein muss, ist in einer For Each – Schleife die Laufvariable eine „Objektreferenz“, die in jedem Schleifendurchlauf auf ein anderes Objekt der Collection verweist. Der Typ der Laufvariablen kann entweder sein: Ein Verweis auf eine besondere Art von Objekten („Klasse“) Ein Verweis auf ein allgemeines Objekt („generisches Objekt“) Private Sub CommandButton1_Click() Dim bearbeiteteTabelle As Object Set bearbeiteteTabelle = CreateObject("Excel.sheet") For Each bearbeiteteTabelle In Excel.Sheets MsgBox (bearbeiteteTabelle.Name) Next Set bearbeiteteTabelle = Nothing End Sub Wichtige Objekte in EXCEL Die folgende Aufzählung von EXCEL-Objekten ist bei weitem nicht vollständig. Wenn du professionelle Anwendungen für EXCEL in VBA erstellen willst, kommst du nicht umhin, dir „EXCEL-VBA Literatur“ zu besorgen, bzw. im Internet in den entsprechenden Foren zu stöbern. Beachte auch, dass einige EXCEL-Objekte „vorhanden sind“. Von manchen Objekten ist aber nur der Bauplan (die „Klassendefinition“) angegeben. Entsprechende Objekte müssen vor ihrer Nuztung erst „instantiiert“ werden. Beispiel: Das Objekt „Application“ ist unter diesem Namen vorhanden (es wurde beim Aufruf von EXCEL „instantiiert“). Wenn du mit „mehreren Zellbereichen“ arbeiten willst, so kannst du dir selbst ein Objekt der Art („Klasse“) „Range“ erzeugen. Das geht durch ... ... Vereinbaren einer Objektvariable der Klasse „Range“ Dim MeinLoeschbereich as Range ... „Instantiieren“ eines entsprechenden Objektes – das erfolgt in VBA „implizit mit der Vereinbarung der Objektvariablen“ 20 ... Benutzen des Objekts MeinLoeschbereich(„a2:C6“).select MeinLoeschbereich.clear Objekte können in Objekten enthalten sein. 20 Objekte können Objekte „enthalten“ („Objektbaum“) In einem VB-Programm werden Objekte durch „set .... = new .... “ instantiiert. © Lothar Kerbl 10.6.2005 Seite 23 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA In diesem Fall sind die Objektnamen durch Punkte voneinander getrennt, die letzte (am weitesten rechts stehende) Bezeichnung kennzeichnet die Eigenschaft oder die Methode des „eigentlichen Objekts“ Beispiel: Application.ActiveCell. ...hier musst du noch genauer angeben, welche Eigenschaft des Objekts „ActiveCell“ du verwenden willst. (z.B. „Value“ – liefert den Inhalt der Zelle) Die EXCEL-Objekte sind baumförmig organsiert. Du musst aber nicht immer alle Namen des Stammes angeben. Für ein EXCEL-VBA – Programm ist der Namensteil „Application“ auf der linken Seite „defaultmäßig“ definiert. Beispiel: Application.ActiveCell ist gleichbedeutend mit ActiveCell Es gibt auch Namensteile, die auf der rechten Seite „defaultmäßig“ definiert sind Es gibt für jedes Objekt eine „Standardeigenschaft“ Beispiel: Application.Name ist gleichbedeutend mit Application Von der Verwendung dieser letztgenannten „Abkürzungsmöglichkeit“ rate ich dir ab, der Programmtext kann sonst recht verwirrend werden. Viele Objekte sind in einer „Auflistung“ (Collection) enthalten.21 Diese eingebetteten Objekte haben natürlich die ihnen zugeordneten Eigenschaften und Methoden. Die Collection selbst verfügt über eigene Eigenschaften und Methoden: Beispiel: In Application.Workbooks. sind alle geöffneten Dateien „enthalten“. Die Anzahl der Dateien kann durch eine Eigenschaft der Collection Collections sind „Objektcontainer“ Wichtige Eigenschaften und Methoden einer Collection: Count add delete ..... = Application.Workbooks.Count ermittelt (aber nicht verändert) werden. Auf ein Objekt, das in einer Collection enthalten ist, kannst du über einen Index (Ganzzahl) oder über einen Namen (Textstring) zugreifen. Application.Workbooks(1).<..Eigenschaften/Methoden..> Application.Workbooks(“Tabelle1“).<..Eigenschaften/Methoden...> Viele Objekte erreichst du über mehrere Namen: „Auflistungen“ (Collections) sind selbst Objekte, auf die du gewisse „Methoden“ anwenden kannst (diese Methoden sind vor allem: Hinzufügen und Wegnehmen eines Eintrags) Auf die Elemente einer Auflistung kannst du auf zwei Arten zugreifen: über den „Index“ (eine Ganzzahl in Klammern) oder über eine „Bezeichnung“ (Angabe eines Namens in Klammern). Auf alle aktuell vorhandenen Elemente einer Auflistung kannst du mit einer „for each“-Schleife nacheinander zugreifen. 21 © Lothar Kerbl 10.6.2005 Seite 24 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Beispiel: Application.Workbooks(1).Worksheets(1).name „erreichst“ du auch über Application.Sheets(1).name (zumindest wenn du nur eine Datei geöffnet hast) Application. Application.name Application.workbooks. Application.workbooks(1). Application.workbooks(1). worksheets. Application.workbooks(1). worksheets(1). Application.workbooks(1). worksheets(1).name Application.ActiveCell. ...oft benötigt werden: (Kurzform): Sheets(„Tabelle1“).Activate Range(„A1“).Select Sheets(„Tabelle1“).range(„A1“). select ActiveSheet. Selection. ActiveCell.Offset(i,j). ActiveSheet.Cells(i,j). Tabelle1.Cells(i,j). ActiveCell.value ActiveCell.Formula ActiveCell.Address ActiveCell.Column ActiveCell.Row ActiveCell.Comment. ActiveSheet.Pictures. ActiveCell.AddComment() © Lothar Kerbl Das Objekt „Anwendung“ (Ausgangspunkt aller EXCEL-Objekte) Die Eigenschaft „Name“ des Objkets „Application“ Die Auflistung aller Dateien Das Objekt „erste geöffnete Datei der Anwendung“ Die Auflistung (Collection) aller Tabellen der „ersten geöffneten Datei der Anwendung“ Das Objekt „erste Tabelle der ersten geöffneten Datei der Anwendung“ Die Eigenschaft „Name“ des Objekts „erstes Tabellenblatt in der ersten geöffneten Datei der Anwendung“ Das Objekt „aktivierte Zelle“ Methode zur Auswahl eines Tabellenblattes Methode zur Auswahl einer Zelle Methode zum Auswählen eines Tabellenblattes und einer Zelle Das Objekt „aktives Tabellenblatt“ Das Objekt „ausgeschnittener Bereich“ Das Objekt „Zelle mit definiertem Abstand zur aktiven Zelle“ Objekt „Zelle (i,j) im aktuellen Tabellenblatt Objekt „Zelle (i,j) im Blatt ‚Tabelle1’“ Eigenschaft „Wert in der Zelle“ Eigenschaft „Formel in der Zelle“ Eigenschaft „Adresse der Zelle“ (Text) Eigenschaft „Spalte der Zelle“ (Ganzzahl) Eigenschaft „Zeile der Zelle“ (Ganzzahl) Objekt „Kommentar der Zelle“ Auflistung der Bilder Methode für Aktive Zelle: „Einfügen eines Kommentars“; Argument: Kommentartext 10.6.2005 Seite 25 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Der Makro-Recorder Wahrscheinlich kannst du viele Teilaufgaben der von dir programmierten Anwendung ohne Probleme „interaktiv“ in EXCEL ausführen (beispielsweise das Einfärben einer Zelle). Um denselben Vorgang aber programmgesteuert auszuführen, müsstest du erst wissen, welche Eigenschaft der Zelle mit welchen Wert zu belegen ist. Natürlich kannst du in einer EXCEL-Dokumentation nachschlagen, aber oft führt folgender Weg schneller ans Ziel: 1. Du startest den Makro-Recorder („Extras“ -„Makro“ -„Aufzeichnen“ ... „ok“) 2. ... du führst die Befehle interaktiv in EXCEL aus ... Der Makro Recorder zeichnet „in der Programmiersprache VBA“ auf 3. ... du beendest die Aufzeichnung des Makros ... Bild 21. Schaltfläche zum Beenden der Makro Aufzeichnung 4. ... du öffnest mit „Extras“-„Makro“-„Makros...“–„Bearbeiten“ das neue Makro Sub Makro1() ' ' Makro1 Makro ' Makro am 10.06.2005 von Kerbl aufgezeichnet ' Range("E3").Select With Selection.Interior .ColorIndex = 40 .Pattern = xlSolid End With End Sub Bild 22. Ein „Makro“, das mit dem Makrorecorder erstellt wurde (Zelle E3 wird gelbbraun gefärbt)22 5. ... du „bearbeitest“ das entstandene Makro und fügst den Programmtext (eventuell modifiziert) in dein VBA-Programm ein „With“... „End With“ ist eine Kurzschreibweise, um nicht für jede Eigenschaft den gleich bleibenden Objektnamen (hier „Selection.Interior“ anschreiben zu müssen) 22 © Lothar Kerbl 10.6.2005 Seite 26 (27) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Fehler suchen und beheben „Syntaxfehler“ und „Laufzeitfehler“ Der „sprachsensitive“ Editor überwacht schon bei der Eingabe, ob das Programm den „VBA-Regeln“ entspricht. Wenn ein Programm „syntaktisch“ korrekt ist, so bedeutet das aber nicht, dass es auch richtig funktioniert. Viele „Laufzeitfehler“ eines Programmes kannst du zwar finden, indem du den Programmtext nochmals sorgfältig überprüfst („Code Walk Through“), meist bist du aber auf Methoden angewiesen, mit denen du den Ablauf des Programmes „unter Beobachtung“ verfolgen kannst. „Breakpoints“ setzen und „Einzelschritte“ ausführen Möglichkeiten zur Fehlerbehebung sind unter dem Menüpunkt „Debuggen“ (in der VBA-Entwicklungsumgebung) zusammengefasst. Du kannst in deinem Programm Unterbrechungspunkte setzen. Die Ausführung des Programmes wird an dieser Programmzeile angehalten. Nachdem du überprüft hast, ob das Programm „bis hierher“ korrekt funktioniert, kannst du den Programmablauf fortsetzen (eventuell bis zum nächsten „Breakpoint“) Du kannst dein Programm auch „Anweisung für Anweisung“ ausführen. Um einen Breakpoint zu setzen, klickst du in die graue Randleiste links neben dem Befehl Einzelschritte werden mit F8 ausgeführt Das „Direktfenster“ Wenn du eine EXCEL-Anwendung programmierst, kannst du viele Ergebnisse unmittelbar im Tabellenblatt oder in deinen Steuerelementen sehen. Der Inhalt von „nicht direkt sichtbaren“ Eigenschaften (z.B. Zählvariablen) kannst du bei angehaltenem Programmablauf im Direktfenster überprüfen und ändern. Bild 23. Das Direktfenster – Abfrage und Ändern von Werten © Lothar Kerbl 10.6.2005 Seite 27 (27)