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 Das Objekt „Tabelle1“ ............................................................................................... 7 Der Name eines Objekts (Name of object) ............................................................ 7 Eigenschaften (Properties) des Objektes „Tabelle1“ ............................................. 8 Die Methoden eines Objekts ................................................................................ 11 Der Eingabeknopf – ein „Objekt im Objekt“ ....................................................... 11 Übungen mit mehreren Steuerelemente ............................................................... 13 Eine neue Eigenschaft für ein Objekt definieren ................................................. 13 Programmstrukturen................................................................................................. 15 Verzweigungen..................................................................................................... 15 Die „If Anweisung“ ohne „else“ ...................................................................... 15 Die „If Anweisung“ mit „else“......................................................................... 15 Struktogramm und Flussdiagramm einer Verzweigung................................... 15 Die mehrstellige Verzweigung „if – elseif“ ..................................................... 16 Die Mehrfachverzweigung „Select Case“........................................................ 17 Beispiele zu Verzweigungen............................................................................ 17 Zählschleifen ........................................................................................................ 17 Die lokale Zählvariable -.................................................................................. 18 Die Option „STEP“ in einer Zählschleife ........................................................ 18 Übungen zu Zählschleifen................................................................................ 19 Gesteuerte Schleifen (Bedingter Schleifendurchlauf).......................................... 19 Kopfgesteuerte Schleifen ................................................................................. 19 Fußgesteuerte Schleifen ................................................................................... 19 Endlosschleife und N+1/2 Schleife .................................................................. 20 Die For - Each Schleife ........................................................................................ 20 Wichtige Objekte in EXCEL.................................................................................... 21 © Lothar Kerbl 5.4.2005 Seite 1 (1) 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 Bild 1. Vorbereitung zum Einfügen von Steuerelementen; beachte, dass auch die Symbolleiste „Visual Basic“ sichtbar ist. © Lothar Kerbl 5.4.2005 Seite 2 (2) 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 5.4.2005 Seite 3 (3) 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 Anweisungenen 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 5.4.2005 Seite 4 (4) 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 rufst Word auf und wechselst in die „VBA-Programmierumgebung:“ Bild 7. Aufruf des VB-Editors aus Word Du kannst in Word die Steuerelemente nicht direkt auf dein „Blatt“ platzieren, deshalb musst du „als Unterlage“ ein Fenster (Form) erstellen. 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 5.4.2005 Seite 5 (5) 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 Steuerelmente 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 5.4.2005 Seite 6 (6) 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.) 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. 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. © Lothar Kerbl 5.4.2005 Seite 7 (7) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA 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 Propertiy3“) 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 13. Der aktuellen Wertes der Eigenschaft „StandardWidth“ des Objekts „Tabelle1“wird angezeigt, 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. 3 Die möglichen Eigenschaften werden angezeigt Beachte, dass sowohl das Objekt selbst als auch die Eigenschaften „Namen“ haben. © Lothar Kerbl 5.4.2005 Seite 8 (8) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild Bei der Erstellung von Programmen werden die Namen der Objekteigenschaften angezeigt Der Editor4 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 Eigenschaften5 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 .. oder6 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. 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“) 4 Editor: Das ist das Textprogramm, mit dem du den Programmtext (Source Code) erstellst 5 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. 6 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. © Lothar Kerbl 5.4.2005 Seite 9 (9) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Beispiel: Ändere den Inhalt (Eigenschaft „Value“) des Objektes „Zelle A1 des Tabellenblattes“7 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.8 9. Was passiert, wenn du den Wert der Eigenschaft „Tabelle1.Name“ änderst9 ? 7 Die Bedeutung der Schreibweise „Tabelle1.Cells(1,1)“ als Name für das Objekt „Zelle A1“ wird noch genauer erklärt werden. 8 Natürlich kannst du dasselbe Ergebnis ohne Programmierung durch Eintrag einer Formel in der Zelle B3 erzielen 9 Beachte: Durch Änderung der Eigenschaft „Tabelle1.Name“ änderst du nicht die Bezeichnung, mit der du das Objekt in deinem Programm ansprichst. © Lothar Kerbl 5.4.2005 Seite 10 (10) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA 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 Objekte10 Methoden benötigen unter Umständen Argumente, durch die ihre Funktionsweise (genauer) definiert wird. Private Sub CommandButton1_Click() Tabelle1.Cells(1, 1).AddComment ("blablabla")11 End Sub oder12 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. 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. 10 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. 11 Der Kommentartext ist das Argument der Methode „AddComment“ 12 Siehe dazu die Bemerkung über die Verwendung des Namens für „das eigene Objekt“ © Lothar Kerbl 5.4.2005 Seite 11 (11) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Ein Beispiel für eine „Container-Beziehung“ hast du schon kennen gelernt. „Tabelle1.Cells(1,1)13“ 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 aufgelistet14. Bild 14. 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 15. Eigenschaften und Methoden des Objektes „Tabelle1.CommandButton1“ („Objekt im Objekt“) Private Sub CommandButton1_Click() Tabelle1.CommandButton1.Caption = "ok" End Sub natürlich funktioniert auch ... Private Sub CommandButton1_Click() CommandButton1.Caption = "ok" End Sub Hinweis: 13 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. © Lothar Kerbl 5.4.2005 “ angezeigt wird, wie die Seite 12 (12) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA 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 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 5.4.2005 Seite 13 (13) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Bild 16. Einfügen der selbstdefinierten Eigenschaft „a“ (Ganzzahl) in das Objekt „Tabelle1“15 Bild 17. Die „Oberfläche“ eines Programmes, das die selbsterstellte Eigenschaft „a“ verwendet Bild 18. Die selbstdefinierte Eigenschaft ist sogar in der Eingabehilfe sichtbar 15 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. © Lothar Kerbl 5.4.2005 Seite 14 (14) 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 5.4.2005 Seite 15 (15) 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,. 16 In den „nein“- Pfaden des Flussdiagrammes wird jeweils eine weitere Verzweigung eingefügt. Alle Pfade aus den Verzweigungen laufen in einem Vereinigungspunkt zusammen. 16 Beachte den Unterschied zur Programmiersprache „C“: In C werden in einer mehrstelligen Verzweigung alle Anweisungen ausgeführt, deren „Wächterbedingungen“ wahr sind. © Lothar Kerbl 5.4.2005 Seite 16 (16) 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 5.4.2005 Seite 17 (17) 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 5.4.2005 Seite 18 (18) 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 5.4.2005 Seite 19 (19) 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 SinnEndlosschleifen sind nur dann sinnvoll, wenn „irgendwo“ ein Aussprung möglich ist, und damit werden auch sie zu gesteuerten Schleifen.17 Dieser „Aussprung“ – also der Punkt, an dem die Entscheidung über eine Fortsetzung der Schleife zu treffen ist- kann "mitten im Schleifenrumpf" programmiert werden. („bedingtes Exit18“) ... 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. 17 Es gibt Sonderfälle, bei denen Endlossschleifen ohne programmierten Aussprung sinnvoll sind (z.B. interruptgesteuerte Programme in Mikrocontrolleranwendungen) 18 In früheren Versionen von VB genügte die Anweisung „Exit“ alleine (ohne „Do“) © Lothar Kerbl 5.4.2005 Seite 20 (20) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA Die For Each Schleife19 wird im Zusammenhang mit den Begriffen des „objektorientierten Programmierens“ genauer erklärt werden. Mit einer „For-Each Schleife“ kannst du alle Elemente einer „Collection“ bearbeiten. 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. 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“ Objekte können Objekte „enthalten“ („Objektbaum“) 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 19 20 Die „For Each-Schleife“ setzt voraus, dass du den Begriff „Collection“ kennst. In einem VB-Programm werden Objekte durch „set .... = new .... “ instantiiert. © Lothar Kerbl 5.4.2005 Seite 21 (21) htl-donaustadt Abteilung für Elektrotechnik Programmieren in EXCEL mit VBA ist gleichbedeutend mit ActiveCell Es gibt auch Namensteile, die auf der rechten Seite „defaultmäßig“ definiert sind Beispiel: Application.Name Es gibt für jedes Objekt eine „Standardeigenschaft“ 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: 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 Das Objekt „Anwendung“ (Ausgangspunkt aller EXCEL-Objekte) Die Eigenschaft „Name“ des Objkets „Application“ 21 „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. © Lothar Kerbl 5.4.2005 Seite 22 (22) htl-donaustadt Abteilung für Elektrotechnik 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 Programmieren in EXCEL mit VBA 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 5.4.2005 Seite 23 (23)