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

Documents pareils