Workshop 10: VBA-Programmierung mit MS Excel - dr
Transcription
Workshop 10: VBA-Programmierung mit MS Excel - dr
Workshop 10: VBA-Programmierung mit MS Excel 1 Programmieren eines Excel-Formulars .................................................................................. 1 1.1 Lehrmethode .................................................................................................................... 1 1.2 Szenario ........................................................................................................................... 2 1.3 Aufgabenstellung für den Programmierer ........................................................................ 2 1.4 Stammdaten ..................................................................................................................... 2 1.5 Formulargestaltung .......................................................................................................... 3 2 Das Formular erzeugen .......................................................................................................... 4 2.1 Formulargröße bestimmen............................................................................................... 5 2.2 Eigenschaften des Formulars .......................................................................................... 5 2.3 Formular anzeigen ........................................................................................................... 5 2.4 Formular ........................................................................................................................... 5 2.5 Wichtige Ereignisse eines Formulars .............................................................................. 5 3 Steuerelemente einfügen ........................................................................................................ 7 3.1 Verwendung der Steuerelemente .................................................................................... 7 3.2 Eigenschaften der Steuerelemente ................................................................................. 8 3.3 Steuerelemente verändern .............................................................................................. 9 3.4 Dem Kombinationsfeld Listenfeldeinträge zuordnen ....................................................... 9 3.5 Steuerelemente programmieren ...................................................................................... 9 4 Auf Ereignisse reagieren ......................................................................................................... 9 4.1 Den Abbrechenschalter programmieren .......................................................................... 9 4.2 Die Verknüpfung des Wertes von Drehfeld und Textfeld ................................................ 9 4.3 Gesamtpreis berechnen und ausgeben ........................................................................ 10 4.4 Kontrollkästchen für die Rechungsadresse programmieren ......................................... 12 5 Steuerelemente im Tabellenblatt .......................................................................................... 12 6 Grundlagen der Fehlerbehandlung ....................................................................................... 13 7 Anhang: Schnellübersicht zum VBA-Editor .......................................................................... 15 8 Übungen ................................................................................................................................ 15 8.1 Fallunterscheidung in Prozedur Berechnen ändern ...................................................... 15 8.2 Hilfetext für drei Controls in die UserForm einbauen .................................................... 16 8.3 Darstellung von drei Controls in der UserForm ändern ................................................. 16 1 Programmieren eines Excel-Formulars In dieser Lektion lernen Sie benutzerdefinierte Formulare kennen, was Steuerelemente wie Drehfelder, Textfelder, Optionsschaltflächen und Kombinationsfelder bedeuten, wie diese Steuerelemente mit Prozeduren verknüpft werden. 1.1 Lehrmethode Das isolierte Pauken von Befehlswörtern einer Programmiersprache führt zu nichts. Das Programmieren lernt man am besten an vielen praktischen Beispielen. Dort können die Sprachelemente im logischen Zusammenhang kennengelernt werden. © 2011, Dr. Volker Thormählen Seite 1 von 16 Workshop 10: VBA-Programmierung mit MS Excel Im Folgenden wird eine funktionsfähige Excel-Lösung zunächst mit allen Einzelheiten beschrieben. Im Rahmen des dazugehörigen Excel-Workshops wird die Lösung vorgestellt die Funktionsweise erläutert. der Quellcode analysiert Im Text erkennen Sie bestimmte Programmelemente an der Formatierung: Arial, GROSSBUCHSTABEN Times New Roman, fett Arial, kursiv Courier New verweisen auf Menüpunkte kennzeichnet alle vom Programm vorgegebenen Namen kennzeichnet vom Anwender vergebene Namen kennzeichnet VBA-Quellcode 1.2 Szenario Ein Reisekaufmann vermittelt u. a. Angebote eines Vergnügungsparks. Als Werkzeug für die Berechnung des Gesamtpreises ausgewählter Leistungen wird Excel eingesetzt, allerdings ohne Bildschirmformulare. Deshalb entstehen gar nicht selten Fehler, die beispielsweise auf Folgendem beruhen: Basisdaten werden versehentlich gelöscht oder überschrieben, weil direkt mit den Excel-Tabellenblättern gearbeitet wird. Die Berechnung des Gesamtpreises fehlerhaft ist, obwohl die Basisdaten in Ordnung sind. Unzulässige Bestellmengen akzeptiert werden, weil dafür keine Prüfungen auf Plausibilität vorgenommen werden. Um in Zukunft solche Pannen zu vermeiden, entschließt sich der Kleinunternehmer, mit dem Excel-Chaos ein für allemal aufräumen. Von einem Geschäftsfreund hat er erfahren, dass Excel eine integrierte Entwicklungsumgebung besitzt, die u.a. die Erstellung von komfortablen Eingabe-Formularen (sogen. UserForm) ermöglicht . Deshalb beauftragt er einen ihm empfohlenen Programmierer mit sehr guten VBA-Kenntnissen 1 , seine Anwendungen komfortabler und sicherer zu gestalten. 1.3 Aufgabenstellung für den Programmierer Ein Formular für eine einfache Reisebüro-Anwendung mit Excel soll entwickelt werden. Im Mittelpunkt steht dabei die Vermittlung von Leistungen eines Vergnügungsparks durch das Reisebüro. Bei der Auftragserfassung sollen folgende Optionen wählbar sein: ob ein Hotel mit gebucht wird oder nicht die Art des Eintritts, nämlich 1. Buchung aller Attraktionen von vornherein 2. Eintritt und Verzehrbon 3. Nur Eintritt die Anzahl der Personen die Anzahl der gebuchten Tage Außerdem soll es möglich sein, die Rechnungsadresse des Bestellers zu erfassen. 1.4 Stammdaten Die Stammdaten für die geplante Anwendung sind in einem Excel-Tabellenblatt namens Basisdaten enthalten. Den festen Inhalt dieses Tabellenblatts zeigt Abb.1: 1 VBA bedeutet Visual Basic for Applications und stellt im Kern die gemeinsame Programmiersprache für alle Komponenten der Office-Suite von Microsoft dar. Für die Erstellung und Bearbeitung von VB-Code wird eine integrierte Entwicklungsumgebung mitgeliefert, der Visual Basic-Editor. Kurz: VB-Editor. © 2011, Dr. Volker Thormählen Seite 2 von 16 Workshop 10: VBA-Programmierung mit MS Excel Abb. 1: Tabellenblatt Basisdaten Die im Tabellenblatt Basisdaten enthaltene Befehlsschaltfläche Kalkulieren dient dazu, ein Eingabeformular aufzurufen. Die im Eingabeformular enthaltene Programmier-Logik sorgt dafür, dass die im obigen Tabellenblatt erkennbaren Ziel-Zellen2 gefüllt werden einschließlich des jeweils dazugehörigen Gesamtpreises. In Abhängigkeit der verschiedenen Optionen verändert sich der Gesamtpreis einer Bestellung. 1.5 Formulargestaltung Zwecks Übersichtlichkeit besteht das gewünschte Formular aus zwei Teilbereichen. Der obere Bereich ist immer sichtbar und dient der Erfassung der bereits beschriebenen Wahlmöglichkeiten. Der untere Bereich ist nur auf Anforderung sichtbar und lässt sich mittels Kontrollkästchen3 wieder ausblenden. Abb. 2 zeigt den Entwurf für eine UserForm mit den darauf gelegten Steuerelementen Namen dieser Steuerelemente Präfixen4 für diese Namen. 2 Die Ziel-Zellen sind die eingerahmten leeren Zellen. Definition in Tab. 2. 4 Die gewählten Präfixe beruhen auf einer verbreiteten Konvention der weltweiten Excel-Community. Sie erleichtert die Lesbarkeit und Pflege umfangreicher Excel-Programme erheblich. 3 © 2011, Dr. Volker Thormählen Seite 3 von 16 Workshop 10: VBA-Programmierung mit MS Excel Abb. 2: Formular frmBestellung Quelle: In Anlehnung an: Andreas Klein, Stefanie Friedrich, Excel 2003 Programmierung mit Visual Basic, 1. Auflage: 2005 (http://www.merkwerk.de/files/exvba.pdf) 2 Das Formular erzeugen Um eine UserForm zu erstellen wechseln Sie zunächst in die Entwicklungsumgebung (beispielsweise mit der Tastenkombination Alt + F11). Ihnen wird eine leere UserForm angezeigt, auf der Sie nun die oben beschriebenen Steuerelemente anordnen können. Der TabIndex5 der Steuerelemente richtet sich nach der Reihenfolge ihrer Erstellung. 5 Vgl. dazu Tab. 3 © 2011, Dr. Volker Thormählen Seite 4 von 16 Workshop 10: VBA-Programmierung mit MS Excel Die UserForm kann weitgehend frei benannt werden. Hier wird sie frmBestellung genannt. 2.1 Formulargröße bestimmen Die Größe des Formulars wird entweder über das zugehörige Eigenschaftenfenster bestimmt, oder indem der Maus-Cursor auf den Rand des Formulars gestellt wird und an diesem gezogen wird. 2.2 Eigenschaften des Formulars Mit der Funktionstaste F4 oder der Schaltfläche Eigenschaften wird das Eigenschaftenfenster aktiviert. Hier kann u. a. festgelegt werden: Name des Formulars (engl. Name) Bezeichnung des Formulars (engl. Caption) Größe Hintergrundfarbe Position und einiges mehr 2.3 Formular anzeigen Um das jeweilige Formular anzuzeigen, wird die Methode Show verwendet. Von der Schaltfläche cmdAuswahlAnzeigen, die auf den Tabellenblatt Basisdaten liegt, wird das Formular frmBestellung wie folgt aufgerufen: Sub cmdAuswahlAnzeigen() frmBestellung.Show End Sub 2.4 Formular schließen Es gibt zwei Möglichkeiten, ein Formular zu schließen: die Methode Hide oder die Anweisung Unload. Hide macht das Formular unsichtbar, aber alle Einstellungen bleiben im Speicher erhalten. Wird das Formular mit Show erneut angezeigt, erscheint es genau so, wie es vorher aussah. Die Anweisung Unload schließt das Formular und entfernt es aus dem Speicher. Dabei werden auch die Variablen gelöscht, die zu einer Prozedur des Formulars gehören. Im vorliegenden Beispiel erfolgt das Schließen des Formulars frmBestellung mit folgender Prozedur: Private Sub cmdAbbrechen_Click() ' Bei Betätigung der Befehlsschaltfläche "Abbrechen" ' das aktuelle Formular schließen und entladen Unload frmBestellung ' hier würde 'Unload Me' genügen End Sub 2.5 Wichtige Ereignisse eines Formulars Die wichtigsten Ereignisse eines Formulars sind Initialize und Terminate. Initialize tritt ein, wenn das Formular geladen wird, also vor dem ersten Anzeigen. Terminate wird ausgelöst, wenn das Formular geschlossen wird. Dabei kann das Formular sowohl über das Kreuz in der Titelleiste als auch mit der Anweisung Unload geschlossen werden. Das Ereignis, das bei jedem Start des Formulars als Erstes ausgeführt wird, heißt Initialize. Im vorliegenden Beispiel ist die Prozedur Initialize wie folgt aufgebaut: © 2011, Dr. Volker Thormählen Seite 5 von 16 Workshop 10: VBA-Programmierung mit MS Excel Private Sub UserForm_Initialize() ' Diese Prozedur wird von Excel zu allererst ausgeführt. ' Hier werden u. a. Standardwerte gesetzt. ' Konstante setzen. 1 Punkt ist etwa 0,35 mm (1/72 Zoll) groß. Const conAbstand As Integer = 20 ' Punkte intGanz = Me.Height ' Gesamte Formularhöhe als ganzzahliger Wert ' Beginn der unteren Formularhälfte bestimmen With Me!chkAdresse ' Mit Kontrollkästchen für Rechnungsadresse intHalb = .Top + .Height + conAbstand End With ' Ergebnisse im Direktfenster ausgeben Debug.Print "Halbe Formularhöhe ermittelt mit chkAdresse: " & _ intHalb & vbNewLine & _ "Halbe Formularhöhe ermittelt mit Funktion 'HalbeHoehe': " & _ (HalbeHoehe + conAbstand) With frmBestellung ' mit aktuellem Formular ... .Height = intHalb ' Formularhöhe setzen .Caption = "Bestellung" With !spnPers ' mit Feld Anzahl Personen ... .Value = 2 ' Startwert setzen .Min = 1 ' Minimalwert setzen .Max = 10 ' Maximalwert setzen End With With !spnTage .Value = 1 .Min = 1 .Max = 14 End With ' ' ' ' mit Feld für Anzahl Tage ... Startwert setzen Minimalwert setzen Maximalwert setzen With !cboAuswahl ' mit Kombinationsfeld ... ' Datenherkunft bestimmen mit Arbeitsblatt und Zellbereich .RowSource = "Basisdaten!A14:A16" ' 1. Eintrag markieren .ListIndex = 0 End With ' Andere Startwerte setzen !chkAdresse.Value = False !optJa = True End With End Sub Beim Starten des Programms sollen in der UserForm bestimmte Werte voreingestellt werden. Zum Beispiel soll die Anzahl der Personen snpPers standardmäßig auf 2 gesetzt sein (siehe oben im Quellcode). Wenn eine Programmzeile mit einen Hochkomma beginnt, dann handelt es sich um einen Kommentar, der die Verständlichkeit und Pflege des Quellcodes verbessern soll. Verständlichkeit und Lesbarkeit werden auch dadurch gefördert, indem die Programmzeilen im Quellcode (wie oben ersichtlich) systematisch eingerückt werden. Feste Konventionen gibt es dafür nicht. Der Programmierer muss sich eigene Regeln setzen und konsequent einhalten, mit anderen Worten, für seinen Programmierstil ist jeder selbst verantwortlich. © 2011, Dr. Volker Thormählen Seite 6 von 16 Workshop 10: VBA-Programmierung mit MS Excel 3 Steuerelemente einfügen In diesem Abschnitt wird beschrieben, wie ausgewählte Steuerelemente auf dem Formular angeordnet und weiter bearbeitet werden können. Der in Abb. 2 gezeigte Formularentwurf enthält folgende 26 Steuerelemente (engl. Controls): Steuerelement Anzahl Befehlsschaltflächen 2 Bezeichnungsfelder 8 Drehfelder 2 Kombinationsfelder 1 Kontrollkästchen 1 Optionsfelder 2 Rahmen 3 Textfelder 7 Summe Controls 26 Tab 1: Anzahl Steuerelemente im Benutzerformular 3.1 Verwendung der Steuerelemente Die in Tab. 1 genannten Steuerelemente werden im Allgemeinen wie folgt verwendet: Steuerelement Kürzel Verwendung Befehlsschaltfläche cmd Werden meistens dafür verwendet, bestimmte Aktionen auszulösen. Typisches Beispiel: Programme starten Bezeichnungsfeld lbl Damit kann Text angezeigt werden. Ein Bezeichnungsfeld ist ein reines Ausgabefeld, der Anwender kann darin nichts ändern. Drehfeld spn Durch Klicken auf eines der Dreiecke im Drehfeld kann ein Wert verkleinert oder vergrößert werden Kombinationsfeld cbo Ist eine Mischung aus Eingabefeld und Listenfeld. Listenfelder erlauben die Auswahl eines oder mehrerer vorgegebener Einträge. Kontrollkästchen chk Sie erlauben die Auswahl zweier Zustände wie wahr/falsch, ja/nein oder an/aus. Optionsfeld opt Optionsfelder erlauben die Auswahl zweier Zustände, allerdings werden häufig mehrere Optionsfelder zu einer sogen. Optionsgruppe zusammengefasst. Innerhalb einer Optionsgruppe kann nur ein Optionsfeld aktiv sein. Rahmen fra Sind ein rein optisches Element. Damit kann man z. B. die Gruppen der Optionsfelder hervorheben. Textfeld txt Darin lassen sich beliebige Texte anzeigen oder erfassen. Ebenso können Formeln eingefügt werden. Tab. 2: Verwendung der Steuerelemente im Benutzerformular Ist das Formular markiert, befindet sich daneben das Fenster Werkzeugsammlung: © 2011, Dr. Volker Thormählen Seite 7 von 16 Workshop 10: VBA-Programmierung mit MS Excel Abb. 3: Werkzeugsammlung zur Auswahl von Steuerelementen 3.2 Eigenschaften der Steuerelemente Jedes Steuerelement hat verschiedene Eigenschaften, die man im jeweiligen Eigenschaftenfenster einstellen kann. Dazu gehören unter anderem die Farbe, Schriftart, Größe und der Name eines Objektes. Beispielsweise beinhaltet Abb. 4 einen Ausschnitt des Eigenschaftsfensters für eine Befehlsschaltfläche. Ihr Name ist cmdBestellen, ihre Beschriftung (siehe Eigenschaft Caption) lautet Bestellen. Abb. 4: Eigenschaftenfenster zu cmdBestellen © 2011, Dr. Volker Thormählen Seite 8 von 16 Workshop 10: VBA-Programmierung mit MS Excel Es gibt einige Eigenschaften, die für fast alle Steuerelemente gleichermaßen gelten, siehe Tab. 3. Eigenschaft Bedeutung BackColor ControltipText Enabled Height Left Name TabIndex Tag Top Visible Width bestimmt die Farbe des Hintergrunds eines Steuerelements definiert den optionalen Hilfetext zu einem Steuerelement legt fest, ob das Steuerelement ausgewählt werden kann oder nicht gibt die Höhe eines Steuerelements an legt die Position des linken Rands eines Steuerelements fest legt den Namen fest, der im Quellcode verwendet wird, um auf das Steuerelement zuzugreifen definiert die Reihenfolge der Auswahl mittels der Tab-Taste. ist vorgesehen für optionale Zusatzinformationen legt die Position des oberen Rands eines Steuerelements fest legt fest, ob das Steuerelement sichtbar oder unsichtbar ist definiert die Breite eines Steuerelements Tab .3: Allgemeingültige Eigenschaften von Steuerelementen 3.3 Steuerelemente verändern Wenn ein Steuerelement nachträglich in Größe und Position verändert werden soll, muss es zuerst markiert werden. Das ausgewählte Objekt wird mit einem Rahmen und mit Markierungspunkten versehen. Am Rahmen können Sie die Position, an den Markierungspunkten die Größe des Objekts verändern. Schriftarten, Farben und weitere Eigenschaften können Sie für jedes einzelne Steuerelement im Eigenschaftenfenster einstellen. 3.4 Dem Kombinationsfeld Listenfeldeinträge zuordnen Beim Klick auf den Pfeil des Kombinationsfeldes sollen die drei möglichen Optionen (Alle Attraktionen, Eintritt und Verzehrbon, Nur Eintritt ) erscheinen. Die Auswahlmöglichkeiten werden über die Eigenschaft RowSource des Kombinationsfeldes zugeordnet. Dort wird angegeben, in welchem Tabellenblatt und in welchen Zellenbereich die entsprechenden Einträge (hier Optionstexte) zu finden sind. 3.5 Steuerelemente programmieren Mit einem Doppelklick auf die Steuerelemente des Formulars im VBA-Editor gelangt man in das Codefenster. Der Code wird im entsprechenden Formular abgelegt. 4 Auf Ereignisse reagieren Es gibt verschiedene Ereignisse, auf die das Programm reagieren soll. Ereignisse können Mausklicks, Mausbewegungen oder das Betätigen von Tasten sein. 4.1 Den Abbrechenschalter programmieren Der Befehl Unload Me schließt ein Formular. Private Sub cmdAbbrechen_Click() Unload Me End Sub 4.2 Die Verknüpfung des Wertes von Drehfeld und Textfeld Jedes Steuerelement hat verschiedene Eigenschaften. Die gewünschte Eigenschaft wird im Quellccode direkt nach dem Objektnamen angegeben. Werte werden in der Eigenschaft Value abgelegt. © 2011, Dr. Volker Thormählen Seite 9 von 16 Workshop 10: VBA-Programmierung mit MS Excel Private Sub spnPers_Change() txtPers.Value = spnPers.Value End Sub Hinweis: Mit der Tastenkombination Strg + Leertaste kann man den angefangenen Text einer Variablen oder einer Eigenschaft vom VBA-Editor vervollständigen lassen. So lassen sich Schreibfehler vermeiden und gleichzeitig das Vorhandensein des jeweiligen Objekts prüfen. 4.3 Gesamtpreis berechnen und ausgeben Bei Betätigen der Schaltfläche Bestellen soll der Gesamtpreis berechnet werden. Die Prozedur Bestellen ruft die Prozedur Berechnen auf. Private Sub cmdBestellen_Click() ' Die Befehlsschaltfläche 'Bestellen' wurde angeklickt Call Berechnen ' Gesamtpreis berechnen in der Prozedur 'Berechnen' End Sub Die Prozedur Berechnen stelle den Kern der Anwendung dar. Sie soll prüfen, welche Optionen gewählt wurden und welcher Gesamtpreis sich daraus ergibt. Aufgrund der Einstellung Option Explicit des VBA-Editors6 müssen alle Variablen vor ihrer Verwendung im Quellcode ausdrücklich deklariert werden. Hier erfolgt die Deklaration aller Variablen im Kopf der Prozedur. Sub Berechnen() ' Die Prozedur berechnet den Gesamtpreis ' Variablen deklarieren: ' Weil "Option Explicit" in diesem Beispiel vorgegeben ist, ' müssen die benutzen Variablen ausdrücklich deklariert werden. ' Die gewählten Präfixe (cur, int) der Variablennamen ' geben deren Datentyp (Currency, Integer) an Dim curHotel, curAuswahl, curGesamt As Currency Dim intAuswahl, intPersonen, intTage As Integer ' Möglichen Laufzeitfehler auffangen mit ... On Error GoTo Programmfehler Call ZielZellenLeeren ' Ziel-Zellen leeren ' Der Hotelpreis hängt ab von einer Ja-Nein-Entscheidung If optJa.Value = True Then ' Wenn ja, ... curHotel = Range("C2") ' dann Hotelpreis zwischenspeichern Else ' Wenn nein, ... curHotel = 0 ' dann ist der Hotelpreis null End If Range("C20") = IIf(curHotel = 0, "nein", "ja") ' Die Variable intAuswahl ergibt sich aus dem ListIndex von cboAuswahl intAuswahl = cboAuswahl.ListIndex ' ListIndex ist nullbasiert! ' Den jeweiligen Fall der Auswahl bearbeiten: Select Case intAuswahl Case 0 ' 1. Fall: Alle Attraktionen curAuswahl = Range("C3") ' Preis aus Zelle C3 übernehmen Range("C14").Value = "X" ' Zelle C14 ankreuzen Case 1 ' 2. Fall: Eintritt und Verzehrbon curAuswahl = Range("C4") ' Preis aus Zelle C4 übernehmen 6 Rufen Sie den Menüpunkt EXTRAS OPTIONEN auf, um das Dialogfeld OPTIONEN zu öffnen. Im Register EDITOR kann gesetzt werden, dass Variablendefinition erforderlich ist. © 2011, Dr. Volker Thormählen Seite 10 von 16 Workshop 10: VBA-Programmierung mit MS Excel Range("C15").Value = "X" Case 2 curAuswahl = Range("C5") Range("C16").Value = "X" End Select ' ' ' ' Zelle C15 ankreuzen 3. Fall: Nur Eintritt Preis aus Zelle C5 übernehmen Zelle C16 ankreuzen ' Die Anzahl der Tage ist gleich dem Wert von spnTage intTage = spnTage.Value Range("C18") = intTage ' Die Anzahl der Personen ist gleich dem Wert von spnPers intPersonen = spnPers.Value Range("C19") = intPersonen ' Der Gesamtpreis ergibt sich aus (Hotel+Auswahl)*AnzahlPersonen*AnzahlTage curGesamt = (curHotel + curAuswahl) * intPersonen * intTage ' Der bisherige Gesamtpreis "curGesamt" wird zur Sicherheit ' mit dem Rückgabewert der Funktion "GesamtPreis" verglichen. If curGesamt <> Gesamtpreis(curHotel, curAuswahl, intPersonen, intTage) Then GoTo Formelfehler End If 'Gesamtpreis in Zelle C22 einsetzen Range("C22").Value = curGesamt ' Wenn Vorname und Nachname erfasst wurden, dann ... If Not IsNull(txtVorname) And Not IsNull(txtNachname) Then ' Die Zellen C7 bis C9 der Excel-Tabelle mit der Rechnungsadresse füllen ' In Zelle C7 den Vor- und Nachnamen einsetzen Range("C7") = txtVorname & " " & txtNachname ' In Zelle C8 die Strasse einsetzen Range("C8") = txtStrasse ' In Zelle C9 die Plz und den Ort einsetzen, ' mit andereren Sprachelementen. Range("C9").Select Selection = txtPostleitzahl & " " & txtOrt Else ' Zellen C7 bis C9 nicht aktualisieren End If GoTo Ausgang Formelfehler: MsgBox Prompt:="Ein Rechenfehler ist aufgetreten!" & vbCrLf & _ "Die Prozedur wird abgebochen!", _ Buttons:=vbExclamation + vbOKOnly, _ Title:="Formelfehler" ' Wegen Programmabbruch werden die Ziel-Zellen zurückgesetzt. Call ZielZellenLeeren Ausgang: Exit Sub ' Prozedur verlassen Programmfehler: MsgBox Prompt:="Fehler # " & Err.Number & ": " & Err.Description, _ Buttons:=vbCritical, _ Title:="Berechnen" Resume Ausgang End Sub Der Gesamtpreis wird in Zelle C22 ausgegeben, siehe Quellcode! Die Anzahl der Personen wird in Zelle C19 geschrieben (siehe Quellcode). Wenn Hotel gewählt wird, soll in Zelle C20 „ja“ stehen, sonst „nein“ (siehe Quellcode). Bei der Auswahl anderer Optionen werden Kreuze in die dafür vorgesehenen Zellen gesetzt. © 2011, Dr. Volker Thormählen Seite 11 von 16 Workshop 10: VBA-Programmierung mit MS Excel 4.4 Kontrollkästchen für die Rechungsadresse programmieren Die fünf Textfelder der Rechnungsadresse sollen ein- und ausblendbar sein, je nachdem, ob eine Adresse erfasst werden soll oder nicht. Dazu kann ein Kontrollkästchen verwendet werden. Diese CheckBox soll beim Klick-Ereignis den gesamten Rahmen Rechnungsadresse ausblenden bzw. wieder einblenden. Ist der Rahmen Rechnungsadresse ein- bzw. ausgeblendet, soll das Formular entsprechend vergrößert bzw. verkleinert werden. Das bewirkt folgende Ereignis-Prozedur: Private Sub chkAdresse_Click() ' Formularhöhe mit einfacher If-Abfrage einstellen ' in Abhängigkeit von der CheckBox für die Rechungsadresse If chkAdresse.Value = True Then frmBestellung.Height = intGanz ' ganzes Formular anzeigen Else frmBestellung.Height = intHalb ' nur den oberen Teil des Formulars zeigen End If End Sub Die Initialisierung für diesen Vorgang erfolgt typischerweise in der Prozedur Initialize. Dort lauten die entsprechenden Anweisungen wie folgt: intGanz = Me.Height ' Gesamte Formularhöhe als ganzzahliger Wert ' Beginn der unteren Formularhälfte bestimmen With Me!chkAdresse ' Mit Kontrollkästchen für Rechnungsadresse intHalb = .Top + .Height + conAbstand End With 5 Steuerelemente im Tabellenblatt Ausgehend von der Normalansicht des Tabellenblatts kann über den Menüpfad ENTWICKLERTOOLS - EINFÜGEN auf die sogen. Formularsteuerelemente zugegriffen werden: Dort wählt man ein Steuerelement aus und fügt es an der gewünschten Stelle in die ExcelTabelle ein. Die folgende Abbildung zeigt eine auf diese Weise eingefügte Befehlsschaltfläche mit der Bezeichnung (Caption) Mach was. Mittels rechter Maustaste lässt sich dieser Befehlsschaltfläche ein passendes Makro zuweisen. © 2011, Dr. Volker Thormählen Seite 12 von 16 Workshop 10: VBA-Programmierung mit MS Excel 6 Grundlagen der Fehlerbehandlung In diesem Abschnitt lernen Sie wie Sie Fehler mit einer Fehlerroutine abfangen können. In der Regel müssen Fehler vom Programmierer abgefangen werden, so dass ungültige Eingaben gar nicht erst vorkommen können. Als letzte Sicherung kann man zusätzlich eine Fehlerroutine einbauen. Diese ist im Prinzip immer folgendermaßen aufgebaut: Sub Fehler() On Error GoTo Sprungmarke Anweisungen der Prozedur ausführen Exit Sub Sprungmarke: MsgBox (Err.Description) End Sub Mit dem Befehl On Error Goto Sprungmarke wird die eigene Fehlerbehandlung eingeleitet. Tritt ein Laufzeitfehler auf, verzweigt das Programm zur Sprungmarke und arbeitet die dort aufgeführten Befehle ab. Die drei Befehle Resume, Resume Sprungmarke und Resume Next werden eingesetzt, um nach einem Laufzeitfehler den Programmfluss weiter abzuarbeiten. Abb. 5 veranschaulicht die Folgen der Fehlerbehandlung mit den Resume-Befehlen: Abb. 4: Fehlerbehandlung mit Resume-Befehlen Dementsprechend ist in die Prozedur Berechnen folgende Logik zur Fehlerbehandlung eingebaut: © 2011, Dr. Volker Thormählen Seite 13 von 16 Workshop 10: VBA-Programmierung mit MS Excel Formelfehler: MsgBox Prompt:="Ein Rechenfehler ist aufgetreten!" & vbCrLf & _ "Die Prozedur wird abgebochen!", _ Buttons:=vbExclamation + vbOKOnly, _ Title:="Rechenfehler" ' Wegen Programmabbruch werden die Ziel-Zellen zurückgesetzt. Call ZielZellenLeeren Ausgang: Exit Sub ' Prozedur verlassen Programmfehler: MsgBox Prompt:="Fehler # " & Err.Number & ": " & Err.Description, _ Buttons:=vbCritical, _ Title:="Berechnen" Resume Ausgang End Sub In dieser Beispiel kann auf Programmfehler und Formelfehler (siehe oben) spezifisch reagiert werden. Der Befehl Resume Ausgang, der sich unter der Sprungmarke Programmfehler befindet, bewirkt, dass die Prozedur trotz Laufzeitfehler über den normalen Ausgang verlassen wird. Soll beim Auftreten eines Laufzeitfehlers direkt mit der Programmzeile weitergearbeitet werden , die auf die fehlerhafte Zeile folgt, wird folgender Befehl verwendet: On Error Resume Next Dieser Befehl hat die gleiche Gültigkeit und Lebensdauer wie die Prozedur oder Funktion, in der er verwendet wird. Um die eigene Fehlerbehandlung innerhalb einer Prozedur oder Funktion wieder anzuschalten, wird folgender Befehl eingesetzt: On Error GoTo 0 Die Sprungmarke 0 ist eine Visual Basic-interne Adresse. Nach Ausführung dieses Befehls erhält das Visual Basic die Kontrolle über die Fehlerbehandlung zurück. Jeder Fehler wird von VBA in einem Err-Objekt abgelegt, dessen Eigenschaften in Programm abgerufen bzw. dessen Methoden im Programm verwendet werden können. Die wichtigsten Eigenschaften und Methoden des Fehlerobjekts Err sind in Tab. 4 aufgeführt: Eigenschaft/Methode Beschreibung Number Description Source Raise Clear Gibt die Nummer des Fehlers zurück Gibt die eine Fehlerbeschreibung zurück Gibt den Namen der Anwendung zurück, die den Fehler ausgelöst hat Erzeugt einen Fehler Setzt das Fehlerobjekt zurück Tab. 4: Eigenschaften und Methoden des Err-Objekts Tipp: Klicken Sie auf die Schaltfläche MICROSOFT OFFICE und anschließend auf EXCEL-OPTIONEN. Klicken Sie auf die Kategorie FORMELN. Aktivieren Sie unter FEHLERÜBERPRÜFUNG das Kontrollkästchen FEHLERÜBERPRÜFUNG IM HINTERGRUND AKTIVIEREN. Damit wird die eigene Fehlerbehandlung ausgeschaltet, d. h., © 2011, Dr. Volker Thormählen Seite 14 von 16 Workshop 10: VBA-Programmierung mit MS Excel Visual Basic behandelt jeden Fehler selbst. Allerdings ist diese Option nur während des Testens einer Anwendung sinnvoll. Später sollte sie jedoch wieder deaktiviert werden. 7 Anhang: Schnellübersicht zum VBA-Editor Sie möchten … Den VBA-Editor starten ENTWICKLERTOOLS den Projekt-Explorer öffnen ANSICHT PROJEKT-EXPLORER oder Strg + R oder ein Code-Fenster öffnen ANSICHT CODE oder F7 oder das Eigenschaftsfenster öffnen ANSICHT-EIGENSCHAFTSFENSTER oder F4 oder Symbolleisten anpassen oder neue erzeugen die Grundeinstellungen des VBA-Editors ändern Kontextmenüs des VBA-Editors anpassen ANSICHT SYMBOLLISTEN ANPASSEN … EXTRAS OPTIONEN ANSICHT SYMBOLLEISTEN ANAPSSEN, Register Symbolleisten, Kontrollfeld KONTEXTMENÜ aktivieren, Befehl aus dem Dialogfenster in das Kontextmenü ziehen 8 Übungen 8.1 Fallunterscheidung in Prozedur Berechnen ändern Ersetzen Sie die Fallunterscheidung Select Case intAuswahl … End Select durch folgenden IF … Else … End If Block: If intAuswahl = 0 Then ' 1. Fall: Alle Attraktionen ' Anweisungen für Fall 1 ElseIf intAuswahl = 1 Then ' 2. Fall: Eintritt und Verzehrbon ' Anweisung für Fall 2 ElseIf intAuswahl = 2 Then ' 3. Fall: Nur Eintritt ' Anweisungen für Fall 3 Else ' unvorhergesehene Auswahl GoTo FallFehler End If ' Neue Sprungmarke FallFehler: ' Meldung ausgeben GoTo Ausgang © 2011, Dr. Volker Thormählen Seite 15 von 16 Workshop 10: VBA-Programmierung mit MS Excel 8.2 Hilfetext für drei Controls in die UserForm einbauen Ändern Sie die ControltipText Eigenschaften folgender Controls: TypeName CommandButton CommandButton ComboBox Name cmdBestellen cmdAbbrechen cboAuswahl ControltipText (InfoText) Gesamtpreis berechnen Prozedur abbrechen Wählen Sie bitte die Art der Eintrittskarte! 8.3 Darstellung von drei Controls in der UserForm ändern Ändern Sie die SpecialEffect Eigenschaft folgender Controls: TypeName Frame Frame Frame Name fraHotel fraAuswahl fraAdresse © 2011, Dr. Volker Thormählen Alte Darst. (graviert) fmSpecialEffectEtched fmSpecialEffectEtched fmSpecialEffectEtched Seite 16 von 16 Neue Darst. (erhöht) fmSpecialEffectRaised fmSpecialEffectRaised fmSpecialEffectRaised