visual basic - Fachbereich Bauingenieurwesen

Transcrição

visual basic - Fachbereich Bauingenieurwesen
FACHBEREICH BAUINGENIEURWESEN
VBA Programmierung mit Excel
Kurzanleitung zum Arbeiten mit
VISUAL BASIC
FÜR APPLIKATIONEN
Select Case eulerfall
Case 1
sk = 2 * laenge
Case 2
sk = laenge
Case 3
sk = laenge / Sqr(2)
Case 4
sk = 0.5 * laenge
Case Else
MsgBox "Falsche Eingabe für Eulerfall " & eulerfall
Exit Sub
End Select
areaMin = 1E+30
iMem = 1000
sig = 1E+30
omegaMem = 0
For i = 1 To nHolz
area = breiteVH(i) * hoeheVH(i)
lambda = sk * 100 / min(breiteVH(i), hoeheVH(i)) * Sqr(12)
If lambda <= 150# Then
index1 = Int(lambda / 10) + 1
index2 = index1 + 1
Detlef Rothe
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Inhaltsverzeichnis
1
Einleitung ....................................................................................................................................... 3
2
Sprachbeschreibung VBA ............................................................................................................ 6
2.1
Anweisung ............................................................................................................................... 6
2.2
Variablen und Konstanten ....................................................................................................... 6
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.3
Zuweisung ......................................................................................................................................... 7
Kommentarzeilen............................................................................................................................... 7
Datentypen (Zusammenfassung)....................................................................................................... 8
Arithmetische Operatoren.................................................................................................................. 8
Verkettungsoperator &....................................................................................................................... 9
Verzweigungen ........................................................................................................................ 9
2.3.1
2.3.2
2.3.3
2.3.4
2.4
If...Then...Else-Anweisung................................................................................................................. 9
Vergleichsoperatoren....................................................................................................................... 10
Logische Operatoren ....................................................................................................................... 10
Select Case–Anweisung.................................................................................................................. 11
Schleifen ................................................................................................................................ 12
2.4.1
2.4.2
2.5
For...Next-Anweisung ...................................................................................................................... 12
Do…Loop–Anweisung ..................................................................................................................... 12
Datenfelder ............................................................................................................................ 13
2.5.1
2.5.2
2.6
Statische Datenfelder ...................................................................................................................... 13
Dynamische Datenfelder ................................................................................................................. 14
Prozeduren ............................................................................................................................ 15
2.6.1
2.6.2
2.6.3
Sub–Anweisung............................................................................................................................... 16
Function–Anweisung ....................................................................................................................... 17
Übergabeparameter......................................................................................................................... 17
2.7
Module ................................................................................................................................... 18
2.8
Benutzerdefinierter Datentyp................................................................................................. 18
2.9
Objekte .................................................................................................................................. 20
2.9.1
2.9.2
2.9.3
2.9.4
2.9.5
2.9.6
2.10
Einleitung......................................................................................................................................... 20
Erläuterungsbeispiel ........................................................................................................................ 20
Objekt-Hierarchie in Excel ............................................................................................................... 22
With-Anweisung............................................................................................................................... 22
Range-Objekt................................................................................................................................... 23
WorksheetFunction-Objekt .............................................................................................................. 24
Nützliche Funktionen ............................................................................................................. 24
2.10.1
2.10.2
3
InputBox ...................................................................................................................................... 24
MsgBox ....................................................................................................................................... 25
Steuerelemente und Userform-Fenster..................................................................................... 25
3.1
Einfügen einer Schaltfläche zum Starten von Prozeduren.................................................... 26
3.2
Kombinationsfeld ................................................................................................................... 27
3.3
Benutzerformulare ................................................................................................................. 28
4
Literatur ........................................................................................................................................ 29
5
Anhang ......................................................................................................................................... 29
5.1
Schlüsselwörter ..................................................................................................................... 29
5.2
Symbole im Objektkatalog und im Code-Fenster.................................................................. 30
5.3
Abkürzungen für Datentypen................................................................................................. 30
5.4
Shortcuts in VBA ................................................................................................................... 30
Rothe
2/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
1 Einleitung
Visual Basic für Applikationen (VBA) ist Bestandteil aller Microsoft Office Programme sowie
vieler Applikationen anderer Hersteller wie AutoCAD von Autodesk. Mit VBA können Sie die
Funktionalität von z.B. Excel erweitern und Ihren eigenen Bedürfnissen anpassen. Dadurch
können Sie immer wiederkehrende Vorgänge automatisieren und so Ihre Zeit für kreativere
Arbeiten nutzen.
Visual Basic für Applikationen ist eine Programmiersprache, die sogar objektorientierte
Programmentwicklung (OOP) ermöglicht.
Diese Kurzanleitung zum Arbeiten mit VBA setzt voraus, dass Sie den Stoff von EDV
Anwendungen im Bauwesen I beherrschen, besonders das Arbeiten mit MS Excel.
Damit Sie direkt auf den VBA-Editor zugreifen können, sollten Sie folgende Einstellung
aktivieren: Ansicht / Symbolleisten/ Visual Basic
Rothe
3/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Zur Einführung soll eine kleine eigene Funktion geschrieben werden, die von einer Zahl das
Quadrat berechnet. Diese Funktion soll „quadrat“ heißen.
In dem folgenden Beispiel steht in der Eingabezelle „B7“ die Zahl 3. In der Ergebniszelle „C7“
soll das Quadrat von 3, also 3*3 = 9 stehen. Dazu soll die selbst geschriebene Funktion
quadrat verwendet werden.
Um die Funktion zu schreiben, klicken Sie auf das Symbol Visual Basic Editor
erscheint ein neues zusätzliches Fenster:
. Es
Diese Fenster enthält drei Unterfenster:
Projekt Explorer:
Klicken Sie auf das Projekt: VBAProjekt und drücken dann die rechte Maustaste und wählen
Einfügen / Modul. Es wird ein neues Modul mit dem Namen Modul1 erzeugt. Alternativ
können sie auch in der Menüleiste Einfügen / Modul wählen.
Rothe
4/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Code Fenster:
In das Code Fenster schreiben Sie die drei neuen Zeilen aus dem obigen Bild. Sie können
sich die Arbeit etwas erleichtern, wenn Sie in der Menüleiste auf Einfügen / Prozedur klicken.
Es erscheint dann folgender Dialog, den Sie wie gezeigt ausfüllen:
Eigenschaftsfenster
Dieses Fenster enthält Eigenschaften über Funktionen des aktuellen Moduls. Diese können
geändert werden.
Durch Klicken auf das ganz links stehende Excel-Symbol
in die Excel-Tabelle zurückkehren.
in der Symbolleiste können Sie
Da Sie die eigene Funktion als public (öffentlich) definiert haben, können Sie sie wie jede
andere Excel-Funktion mit Hilfe des Funktionsassistenten benutzen:
Damit haben Sie Ihre erste eigene Funktion geschrieben!
Rothe
5/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2 Sprachbeschreibung VBA
2.1 Anweisung
Eine Anweisung ist eine syntaktisch vollständige Einheit, die eine Aktion, Deklaration oder
Definition ausdrückt. Eine Anweisung belegt normalerweise eine einzelne Zeile. Mehrere
Anweisungen in einer Zeile können durch Doppelpunkte (:) getrennt werden. Das
Zeilenfortsetzungszeichen (_) wird verwendet, um eine Anweisung in der folgenden Zeile
fortzuführen.
Beispiele für Anweisungen
Dim a As Integer, b As Integer
a=1:b=2
If a > b Then
Text = “Das Haus ist grün” & _
“ und der Sommer ist schön“
Deklaration von 2 Variablen
2 Anweisungen in einer Zeile
If-Anweisung
Anweisung, die über 2 Zeilen geht
2.2 Variablen und Konstanten
Variablen dienen zum Speichern und Lesen von Daten, die im Kernspeicher des Rechners
gehalten werden. Der Wert, der unter einem Variablennamen gespeichert wird, kann beliebig
oft geändert oder gelesen werden. Der Wert von Konstanten dagegen kann nur beim
Programmstart gesetzt werden und kann danach nicht mehr geändert werden. Allerdings
kann er beliebig oft gelesen werden. Bevor eine Variable benutzt wird, sollte sie im
Deklarationsteil der Prozedur deklariert werden. Dies ist in Visual Basic für Applikationen
nicht zwingend erforderlich, sollte aber, um zum Beispiel Tippfehler zu vermeiden, immer
gemacht werden.
Außerdem sollte, wenn auch nicht zwingend erforderlich, der Datentyp der Variablen
angegeben werden. Der Datentyp gibt an, wie der Inhalt der Speicherzelle zu interpretieren
ist. Bitte bedenken Sie, dass alle Daten im Kernspeicher als Bits (0/1) vorliegen und man an
diesen nicht erkennen kann, ob es sich z.B. um eine Ganzzahl, eine Dezimalzahl oder eine
Zeichenfolge handelt. Deshalb sollte neben dem Variablennamen auch der Datentyp
angegeben werden. VBA bietet als Besonderheit den Datentyp Variant an, der immer dann
verwendet wird, wenn kein Datentyp angegeben wird. Bei diesem Datentyp wird zur Laufzeit
aufgrund der Verwendung der Variablen eine sinnvolle Annahme über den Datentyp
getroffen. Bezahlt wird dieser Komfort durch einen höheren Speicherbedarf (mindestens 16
Bytes) und mehr Rechenaufwand, der bei heutigen Rechnerleistungen allerdings meist
vernachlässigbar ist.
Variablennamen können aus bis zu 255 Zeichen des Alphabets einschließlich Umlauten und
Unterstrich bestehen. Sonderzeichen (!, @, &, $, #) und Leerzeichen sind unzulässig. Es
wird nicht zwischen Groß- und Kleinbuchstaben unterschieden. Das erste Zeichen muss ein
Buchstabe sein.
Beispiele
a1b1
1a
Max. Moment
Das_Haus_ist_grün
If
Zulässig
Unzulässig, da erstes Zeichen eine Ziffer
Unzulässig, da Leerzeichen. Außerdem ist der Punkt in diesem
Zusammenhang unzulässig (siehe Objekte)
Zulässig
Unzulässig, da if ein Schlüsselwort der Sprache ist
Damit eine Variablendeklaration immer erzwungen wird, sollte am Anfang jedes Moduls die
Anweisung Option Explicit eingefügt werden. Sie können dies als Voreinstellung wählen, in
Rothe
6/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
dem Sie im VBA-Menü Extras/Optionen auswählen und in dem erscheinenden Dialog die
Option Variablendeklaration erforderlich markieren.
Syntax
Dim Variablenname [As Datentyp]
Beispiele
Variable:
Dim Moment As Double
Dim titel As String
Dim i As Integer, j As Long, k As Byte, m As Integer
Konstante:
Const Pi = 3.14159265358979
Hinweis: Wenn Sie die Datentypen von Variablen vorgeben wollen, so müssen Sie es
explicit für jede Variable in einer Dim-Anweisung machen.
2.2.1 Zuweisung
Eine Zuweisungs-Anweisung weist einen Wert oder einen Ausdruck einer Variablen oder
Konstanten zu. Zuweisungs-Anweisungen enthalten immer ein Gleichheitszeichen (=). Der
Ausdruck rechts des Gleichheitszeichens wird zuerst ausgewertet und dann der Variablen
auf der linken Seite zugewiesen. Deshalb müssen alle Variablen auf der rechten Seite des
Gleichheitszeichen Werte in vorhergehenden Zuweisungen zugewiesen bekommen haben!
Nachdem Variablen einen Wert erhalten haben, gelten sie als definiert.
Hinweis: Durch eine Deklaration mit der Dim-Anweisung erhalten Ganz- und Dezimalzahlen
standardmäßig den Wert 0 zugewiesen und sind damit definiert.
Beispiele
a=1
b = (1+5) / 3
a=b+c
’ Der Variablen a wird der Wert 1 zugewiesen
’ Das Ergebnis des Ausdrucks (=2) wird b zugewiesen
’ a erhält die Summe aus b und c
2.2.2 Kommentarzeilen
Um die Lesbarkeit eines Programms zu verbessern, können Kommentare in den
Programmcode eingefügt werden, die von dem VBA-Interpreter ignoriert werden.
Kommentare dienen zur Erläuterung und machen das Programm verständlich. Ohne
Kommentare sind Programme wertlos. Dies gilt nicht nur für andere Programmierer, die
Ihren Code lesen wollen, sondern auch für Sie, wenn Sie Ihren eigenen Code nach längerer
Zeit wieder verstehen wollen. Erfahrungsgemäß werden immer zu wenige Kommentare
eingefügt.
Kommentare zur Dokumentation können überall eingefügt werden und beginnen mit
Apostroph (’) oder Rem (=remark) und gelten für den Rest der Zeile.
Beispiele
Rem Diese Funktion berechnet den Mittelwert von
Rem beliebig vielen Messwerten
a=a+1
Rothe
' Erhöhung von a um eins
7/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.2.3 Datentypen (Zusammenfassung)
Die folgende Tabelle enthält die von Visual Basic unterstützten Datentypen sowie deren
Speicherbedarf und Wertebereiche.
Datentyp
Byte
Boolean
Integer
Long
(lange Ganzzahl)
Single
(Gleitkommazahl mit
einfacher Genauigkeit)
Double
(Gleitkommazahl mit
doppelter Genauigkeit)
Speicherbedarf
1 Byte
2 Bytes
2 Bytes
4 Bytes
Wertebereich
0 bis 255
True oder False
-32.768 bis 32.767
-2.147.483.648 bis 2.147.483.647
4 Bytes
-3,402823E38 bis -1,401298E-45 für negative
Werte; 1,401298E-45 bis 3,402823E38 für
positive Werte.
-1,79769313486231E308 bis
-4,94065645841247E-324 für negative Werte;
4,94065645841247E-324 bis
1,79769313486232E308 für positive Werte.
-922.337.203.685.477,5808 bis
922.337.203.685.477,5807
+/-79.228.162.514.264.337.593.543.950.335
ohne Dezimalzeichen;
+/-7,9228162514264337593543950335 mit 28
Nachkommastellen; die kleinste Zahl ungleich
Null ist
+/-0,0000000000000000000000000001.
1. Januar 100 bis 31. Dezember 9999.
Beliebiger Verweis auf ein Objekt vom Typ
Object.
0 bis ca. 2 Milliarden.
8 Bytes
Currency
(skalierte Ganzzahl)
Decimal
8 Bytes
Date
Object
8 Bytes
4 Bytes
String
(variable Länge)
String
(feste Länge)
Variant
(mit Zahlen)
Variant
(mit Zeichen)
Benutzerdefiniert
(mit Type)
10 Bytes plus
Zeichenfolgenlänge
Zeichenfolgenlänge
14 Bytes
1 bis ca. 65.400
16 Bytes
Numerische Werte im Bereich des Datentyps
Double.
Wie bei String mit variabler Länge.
22 Bytes plus
Zeichenfolgenlänge
Zahl ist von Elementen
abhängig
Der Bereich für jedes Element entspricht dem
Bereich des zugehörigen Datentyps.
2.2.4 Arithmetische Operatoren
Zum Rechnen mit Ganz- und Dezimalzahlen stehen folgende Operatoren zur Verfügung:
Operator
^
*
/
\
Mod
+
-
Beschreibung
Potenzierung
Multiplikation
Division
ganzzahlige Division
Modulo (Rest einer ganzzahligen Division)
Addition
Subtraktion
Beispiel
7^3
(= 343)
3*5
(= 15)
0.45 / 0.9
(= 0.5)
7\5
(= 1)
14 Mod 5
(= 4)
3+4
(= 7)
3–4
(= -1)
Wie in der Mathematik üblich, gilt:
Rothe
8/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
•
•
•
EDV Anwendungen im Bauwesen II
Klammern haben höchste Priorität
Potenzierung geht vor Punktrechnung
Punktrechnung geht vor Strichrechnung
2.2.5 Verkettungsoperator &
Zeichenfolgen werden mit dem &-Operator verknüpft.
Syntax
Ergebnis = Ausdruck1 & Ausdruck2 [& Ausdruckn]
Beispiel
Dim text As String
text = "Hello" & " world"
' text erhält die Zeichenfolge "Hello world"
Alternativ:
Dim text As String, text1 As String, text2 As String
text1 = "Hello"
text2 = " world"
text = text1 & text2 ' text erhält die Zeichenfolge "Hello world"
Es können auch Zahlen direkt als Ausdruck verwendet werden. VBA führt in diesem Fall eine
automatische Typumwandlung in eine Zeichenfolge durch.
Dim text As String
Dim i As Integer
i = 40
text = "i = " & i
' text enthält die Zeichenfolge "i = 40"
2.3 Verzweigungen
2.3.1 If...Then...Else-Anweisung
Die If...Then...ElseIf...Else-Anweisung ermöglicht aufgrund von Bedingungen zu verzweigen
und damit nur ausgewählte Anweisungen auszuführen. Die Bedingung ist ein logischer
Ausdruck, der wahr oder falsch ergeben kann.
Syntax
Einfache Bedingung :
If Bedingung Then [Anweisungen]
Wenn – sonst – Bedingung
If Bedingung Then
[Anweisungen]
[Else
[elseAnweisungen]
End If
Bei mehreren Bedingungen können Sie die Block-Syntax verwenden:
Rothe
9/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
If Bedingung1 Then
[Anweisungen]
[ElseIf Bedingung2 Then
[elseifAnweisungen] ...
...
[ElseIf Bedingung-n Then
[elseifAnweisungen] ...
[Else
[elseAnweisungen]]
End If
Bemerkungen
Die einzeilige Variante (erste Syntax) bietet sich bei einfachen, kurzen Tests an. Um die
Lesbarkeit zu verbessern, sollten die Anweisungen wie in den unten gezeigten Beispielen
um 2 oder 3 Leerzeichen eingerückt werden.
Beispiele:
B=…
A = ...
If A = 0 Then
C=1
D=3
Else
B = B+3
End If
a= ... : b = 6
If a < 0 Then b=b+1
i=…
If i < 0 Then
MsgBox “i < 0 “
ElseIf i = 0 Then
MsgBox “i = 0”
Else
MsgBox “i> 0“
End If
2.3.2 Vergleichsoperatoren
Operator
< (Kleiner als)
<= (Kleiner oder gleich)
> (Größer als)
>= (Größer oder gleich)
= (Gleich)
<> (Ungleich)
True, wenn
Ausdruck1 < Ausdruck2
Ausdruck1 <= Ausdruck2
Ausdruck1 > Ausdruck2
Ausdruck1 >= Ausdruck2
Ausdruck1 = Ausdruck2
Ausdruck1 <> Ausdruck2
False, wenn
Ausdruck1 >= Ausdruck2
Ausdruck1 > Ausdruck2
Ausdruck1 <= Ausdruck2
Ausdruck1 < Ausdruck2
Ausdruck1 <> Ausdruck2
Ausdruck1 = Ausdruck2
2.3.3 Logische Operatoren
Mit logischen Operatoren werden zwei logische Ausdrücke verknüpft.
Operator
And
Beschreibung
Logisches UND
Or
Not
Logisches ODER
Logische Negation
Beispiel
Dim b As Boolean
b = 1<5 AND 7>6 (=true)
b = 1<5 OR 6>7
(=true)
b = true
b = NOT b
(=false)
Wenn Ausdrücke Operatoren aus mehreren Kategorien enthalten, werden zunächst die
arithmetischen Operatoren, dann die Vergleichsoperatoren und zuletzt die logischen
Operatoren ausgewertet. Die Vergleichsoperatoren haben alle dieselbe Priorität und werden
daher von links nach rechts in der Reihenfolge ihres Auftretens ausgewertet.
Rothe
10/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.3.4 Select Case–Anweisung
Verwenden Sie die Select Case-Anweisung als Alternative zu ElseIf in If...Then...ElseAnweisungen, wenn Sie einen Ausdruck mit mehreren unterschiedlichen Werten
vergleichen.
Syntax
Select Case Testausdruck
[Case Ausdrucksliste-n
[Anweisungen-n]] ...
[Case Else
[elseAnw]]
End Select
Bemerkungen
Wenn Testausdruck mit irgendeinem der Case-Ausdrücke in der Ausdrucksliste
übereinstimmt, werden die Anweisungen dieses Case-Abschnitts bis zum nächsten CaseAbschnitt ausgeführt. Anschließend setzt das Programm die Ausführung mit der Anweisung
im Anschluß an End Select fort. Wenn der Testausdruck mit Ausdruckslisten in mehreren
Case-Abschnitten übereinstimmt, werden nur die Anweisungen der ersten Übereinstimmung
ausgeführt.
Die elseAnw-Anweisungen im Case Else-Abschnitt werden ausgeführt, wenn keine
Übereinstimmung zwischen Testausdruck und einer Ausdrucksliste in einer der anderen
Case-Abschnitte gefunden wird. Die Case Else-Anweisung ist optional, sollte aber in keinem
Select Case-Block fehlen, damit unvorhergesehene Werte von Testausdruck verarbeitet
werden können. Wenn keine Case Else-Anweisung angeben ist und keine CaseAusdrucksliste mit Testausdruck übereinstimmt, setzt das Programm die Ausführung mit der
Anweisung im Anschluß an End Select fort.
Sie können in jedem Case-Abschnitt mehrere Ausdrücke oder Bereiche verwenden, wie zum
Beispiel in der folgenden Zeile:
Case 1 To 4, 7, 9, Is > 12
Der Fall Is > 12 wird dann ausgeführt, wenn der Ausdruck einen Wert größer 12 ergibt. Is ist
hier ein Schlüsselwort.
Beispiel:
Select Case eulerfall
Case 1
sk = 2 * laenge
Case 2
sk = laenge
Case 3
sk = laenge / Sqr(2)
Case 4
sk = 0.5 * laenge
Case Else
MsgBox "Falsche Eingabe für Eulerfall " & eulerfall
Exit Sub
End Select
Rothe
11/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.4 Schleifen
2.4.1 For...Next-Anweisung
Die For … Next-Schleife wird verwendet, wenn Anweisungen eine festgelegte Anzahl von
Malen wiederholt werden sollen. Hierzu wird zu Beginn eine Laufvariable initialisiert und
solange nach jedem Durchgang mit einer Schrittweite erhöht bzw. erniedrigt bis ein Endwert
erreicht wird.
Syntax
For Zähler = Anfang To Ende [Step Schrittweite]
[Anweisungen]
[Exit For]
[Anweisungen]
Next [Zähler]
Bemerkungen
Innerhalb einer Schleife kann eine beliebige Anzahl von Exit For-Anweisungen an beliebiger
Stelle als alternative Möglichkeit zum Verlassen der Schleife verwendet werden. Sie
überträgt die Steuerung an die unmittelbar auf Next folgende Anweisung. Um die Lesbarkeit
zu verbessern, sollten die Anweisungen wie in dem unten gezeigten Beispiel um 2 oder 3
Leerzeichen eingerückt werden.
Beispiel:
Dim i As Integer
For i = 1 To 5 Step 2
MsgBox "i = " & i
Next i
’ i erhält die Werte 1, 3 und 5
2.4.2 Do…Loop–Anweisung
Die While-Schleife wird, solange die Bedingung erfüllt ist, wiederholt. Dagegen wir die UntilSchleife solange wiederholt, bis die Bedingung erfüllt ist. Beide Schleifenarten werden
bevorzugt verwendet, wenn die Anzahl der Schleifendurchläufe zu Anfang der Schleife noch
nicht bekannt ist. Dies tritt zum Beispiel bei Iterationen auf. Die Anweisungen der nichtabweisenden Schleife werden mindestens einmal ausgeführt, da die Überprüfung erst am
Ende der Schleife stattfindet.
Syntax
Rothe
Abweisende Schleife
Nicht-Abweisende Schleife
Do [{While | Until} Bedingung]
[Anweisungen]
[Exit Do]
[Anweisungen]
Loop
Do
[Anweisungen]
[Exit Do]
[Anweisungen]
Loop [{While | Until} Bedingung]
12/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Beispiele:
Dim i As Integer
Dim i As Integer
i = InputBox("i=")
i=1
Do While i > 0
i=i-1
MsgBox "i= " & i
Loop
Do
i=i+1
Dim i As Integer, j As Integer
Dim abbruch As Boolean
j=5
i=1
abbruch = False
Loop Until i > 10
Do
i=i+1
If i = j Then abbruch = True
Loop Until abbruch
2.5 Datenfelder
2.5.1 Statische Datenfelder
Ein Datenfeld (Array) besteht aus mehreren Variablen, die den selben Datentyp besitzen und
unter dem gleichen Namen angesprochen werden. Arrays eignen sich besonders zum
Speichern von Vektoren, Matrizen, Listen und Tabellen. Der Zugriff auf die einzelnen
Elemente (Zellen) erfolgt über Indizes. Es wird zwischen ein- und mehrdimensionalen Arrays
unterschieden. Listen und Vektoren sind eindimensionale Arrays, die nur einen Index
benötigen. Für Matrizen und Tabellen (zweidimensionale Arrays) werden 2 Indizes benötigt.
Der erste Index gibt die Zeilennummer, der zweite die Spaltennummer an.
VBA unterstützt bis zu 60 Dimensionen, allerdings sind bereits 4-dimensionale Arrays
unübersichtlich und glücklicherweise selten erforderlich.
Standardmäßig hat in VBA das erste Element in einem Array den Index 0. Man kann aber
durch die Anweisung Option Base 1 zu Beginn eines Moduls die Indizierung mit 1 beginnen
lassen, was im Normalfall praktischer ist, da mathematische Formeln gewöhnlich mit dem
Index 1 beginnen.
Die folgende Zusammenstellung zeigt die Elementindizierung bei Vektoren mit 4 Elementen
und Matrizen mit 4 Zeilen und 4 Spalten in Abhängigkeit von der Startindizierung.
Vektoren
Base 0
0
1 
 
2
 
3
Matrizen
Base 1
Elementindex
Dim vec(3) As Double
1 
2
 
3
 
4
Option Base 1
Dim vec(4) As Double
Base 0
0,0
1,0

2,0

3,0
0,1
1,1
2,1
3,1
0,2
1,2
2,2
3,2
Base 1
0,3
1,3 
2,3

3,3
Dim mat(3, 3) As Double
1,1
2,1

3,1

4,1
1,2 1,3 1,4 
2,2 2,3 2,4
3,2 3,3 3,4 

4,2 4,3 4,4
Option Base 1
Dim mat(4, 4) As Double
In VBA wird bei der Dimensionierung von Datenfeldern der größte Index eines Elementes
angegeben, nicht die Anzahl der Zeilen oder Spalten! Zur Vereinfachung bei speziellen
Anwendungsfällen können auch der erste und letzte Index angegeben werden.
Beispiele
Rothe
13/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Deklaration
Dim Kraft(3) As Double
Dim Liste(-1 To 5) As Variant
Dim Tabelle(4,5) As Integer
Dim Spezial(-2 To 5, 4 To 6 )
(7 Elemente)
(Matrix mit 8 Zeilen und 3 Spalten = 24 Elementen)
Wertzuweisung
Kraft(2) = 1.5 * Kraft(1)
A = Liste(-1)
Tabelle(4,5) = 2
Spezial(-2,4) = ”Hallo“
Besonders effektiv ist die Verwendung von Arrays in Verbindung mit Schleifen und
ganzzahligen Variablen zur Indizierung:
Const n = 10
Dim i As Integer
Dim dfeld(0 To n) As Long
dfeld(0) = 2
For i = 1 To n
dfeld(i) = dfeld(i - 1) * 3
Next i
2.5.2 Dynamische Datenfelder
Im Gegensatz zu statischen Arrays kann die Anzahl der Elemente eines dynamischen Arrays
während der Laufzeit des Programms geändert werden. Dies ist häufig erforderlich, wenn zu
Beginn des Programmlaufs die Länge von Eingabedatensätzen noch nicht bekannt ist. Es
wird auch hier im Deklarationsteil der Prozedur das Datenfeld deklariert, aber nicht die
Größe angegeben:
Dim Arrayname() As Datentyp
Zu einem späteren Zeitpunkt, nachdem die Größe des Arrays bekannt ist, wird die
Dimensionierung durchgeführt:
Vektor:
ReDim [Preserve] Arrayname([MinIndex To] MaxIndex)
Matrix:
ReDim [Preserve] Arrayname([MinIndex1 To] MaxIndex1,[MinIndex2 To] MaxIndex2)
Diese Neudimensionierung kann mehrmals wiederholt werden. Allerdings gehen dabei die
alten Werte der Elemente verloren, wenn nicht das Schlüsselwort Preserve verwendet wird.
Bei einer wiederholten Neudimensionierung mit Preserve kann nur MaxIndex in der letzten
Spalte verändert werden. Untere und obere Indexgrenzen und mehrdimensionale
Datenfelder werden analog den statischen Datenfeldern behandelt.
Mit der Erase-Anweisung können nicht mehr benötigte Arrays gelöscht werden. Der belegte
Speicherplatz im RAM (Kernspeicher) wird freigegeben.
Rothe
14/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Beispiel
Option Base 1
…..
Dim i As Integer, n As Integer
Dim dfeld() As Long
n = InputBox("max. Elementindex = ")
ReDim dfeld(n)
For i = 1 To n
dfeld(i) = i * 3
Next i
n = InputBox("neuer max. Elementindex = ")
ReDim dfeld(n)
For i = 1 To n
dfeld(i) = i * 2
Next i
...
Erase dfeld()
´ Datenfeld wird gelöscht und Speicher freigegeben
2.6 Prozeduren
Eines der Grundkonzepte aller Programmiersprachen ist die Möglichkeit, ein Programm in
mehrere Unterprogramme (Prozeduren) aufzuteilen. Diese Unterprogramme haben je nach
Programmiersprache unterschiedliche Namen wie subroutine, function und procedure. In
Visual Basic für Applikationen gibt es so genannte „sub“-Prozeduren und „Function“Prozeduren.
Diese Prozeduren ermöglichen das Zusammenfassen von Programmanweisungen, die in
einem logischen und abgeschlossenen Zusammenhang stehen und über eine definierte
Schnittstelle (Argumentliste) mit dem aufrufenden Programmteil kommunizieren. Die
Erfahrung hat gezeigt, dass kleinere Unterprogramme leichter zu pflegen und testen sind als
große Monsterprogramme. Deshalb sollten Sie bei der Programmplanung immer überlegen,
wie Sie das Projekt in kleine abgeschlossene Prozeduren aufteilen können.
Der wesentliche Unterschied zwischen den beiden Prozeduren in VBA besteht darin, dass
die „Function“-Prozedur nur einen Wert an den aufrufenden Programmteil oder die ExcelTabellenzelle zurückgeben kann. Die sub-Prozedur ist die allgemeine Form und ermöglicht
zum Beispiel das Schreiben in beliebig viele Zellen in einem Tabellenblatt. Sub-Prozeduren
werden mit der call-Anweisung aufgerufen.
Rothe
15/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.6.1 Sub–Anweisung
Syntax
[Private | Public] [Static] Sub NameDerProzedur [(ArgumentListe)]
[Anweisungen]
[Exit Sub]
[Anweisungen]
End Sub
Hinweise
Mit den optionalen Modifizierern Private, Public und Static werden Eigenschaften der subProzedur bestimmt.
Teil
Public
Privat
Static
Beschreibung
Auf die Sub-Prozedur kann von allen anderen Prozeduren in allen Modulen
zugegriffen werden.
Auf die Sub-Prozedur kann nur durch andere Prozeduren aus dem Modul
zugegriffen werden, in dem sie deklariert wurde.
Die lokalen Variablen der Sub-Prozedur bleiben zwischen Aufrufen erhalten.
Das Attribut Static wirkt sich nicht auf Variablen aus, die außerhalb der SubProzedur deklariert wurden, auch wenn sie in der Prozedur verwendet werden.
Mit Hilfe der Exit Sub-Anweisung kann die Prozedur vorzeitig verlassen werden.
Beispiel
Definition der sub-Prozedur writeToActiveWorksheet():
Public Sub writeToActiveWorksheet(row As Long, col As Long, wert As Variant)
If wert = "" Then Exit Sub
' Wenn Variable wert leer ist,
’dann braucht nix gemacht zu werden
Cells(row, col).value = wert
End Sub
Aufruf der sub-Prozedur writeToActiveWorksheet():
Dim str
...
str = "Guten Tag"
Call writeToActiveWorksheet(2, 1, str)
Rothe
16/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.6.2 Function–Anweisung
Von einer Funktion wird an den aufrufenden Programmteil über den Namen der Funktion
genau ein Wert zurückgeliefert.
Syntax
[Public | Private] [Static] Function NameDerFunktion [(ArgumentListe)] [As Typ]
[Anweisungen]
[NameDerFunktion = Ausdruck]
[Exit Function]
[Anweisungen]
[NameDerFunktion = Ausdruck]
End Function
Hinweis
Die optionalen Modifizierer Private, Public und Static sind in der sub-Prozedur beschrieben.
Beispiel
Definition der Funktion min():
Public Function min(a As Long, b As Long) As Long
’ Funktion min liefert den kleineren Wert der zwei Argumente a und b als Ergebnis zurück
If (a <= b) Then
min = a
Else
min = b
End If
End Function
Anwendung der Funktion min():
...Dim c As Long, d As Long, e As Long
...
c=2:d=3
e = min( c, d )
...
2.6.3 Übergabeparameter
Einer Prozedur können in der Übergabeliste (Argumentliste) einzelne Variablen, Datenfelder
und Objekte übergeben werden. Werden mehrere Parameter übergeben, so werden diese
durch Kommata getrennt. Der Datentyp sollte in der Parameterliste mit angegeben werden.
Die Wertübergabe wurde eingeführt, da bei der traditionellen Referenzübergabe immer
wieder unangenehme Fehler (Seiteneffekte) in anderen Programmteilen auftraten, wenn
versehentlich Werte von Übergabevariablen in Prozeduren geändert wurden, die eigentlich
nach der ursprünglichen Planung nicht geändert werden sollten. Verwenden Sie also die
Wertübergabe, wenn ein Übergabeparameter von der Prozedur nicht geändert werden darf.
Referenzübergabe
Standardmäßig werden in VBA Referenzen auf die Variablen in der Parameterliste
übergeben. Referenz bedeutet, dass die Adresse der Variablen im Speicher übergeben wird.
Dies hat zur Folge, dass eine Wertänderung einer Übergabevariablen in der Prozedur auch
Rothe
17/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
im aufrufenden Programm erhalten bleibt. Prozedur und aufrufendes Programm rechnen
also mit der gleichen Speicherstelle im Kernspeicher!
Mit dem Schlüsselwert ByRef (=by reference) vor dem Variablennamen wird eine
Referenzübergabe erzwungen.
Wertübergabe
Bei der Wertübergabe wird ein Kopie der Übergabevariablen an die Prozedur übergeben.
Diese Kopie liegt in einem neuen Speicherbereich (Stack) und enthält bei der Übergabe den
Wert der Originalvariablen. Änderungen des Wertes innerhalb der Prozedur gehen beim
Verlassen verloren, d.h. im aufrufenden Programm bleibt der ursprüngliche Wert der
Variablen erhalten.
Mit dem Schlüsselwert ByVal (=by value) vor dem Variablennamen wird eine Wertübergabe
erzwungen.
Beispiel
Private sub bsp( ByVal alpha As Double, ByRef ergebnis As Double )
’ Umrechnung ins Bogenmaß, aufrufendes Programm erfährt davon nichts
alpha = alpha * 3.1416 / 180
’ Variable ergebnis erhält neuen Wert, der auch im aufrufendes Programm erhalten bleibt
ergebnis = alpha
End Sub
2.7 Module
Prozeduren, die in einem logischen Zusammenhang stehen, können in einem Modul
zusammengefasst werden. Dadurch kann ein Programm besser strukturiert und leichter
gepflegt werden. Außerdem kann durch die Modifizierer Public und Private der Zugriff auf
Prozeduren gesteuert werden. Wenn eine Prozedur als Private deklariert wird, können nur
Prozeduren des Moduls diese verwenden. Sinnvoll ist dies zum Beispiel für Hilfsfunktionen,
deren Verwendung außerhalb des Moduls zu Fehlern führen kann.
Weiterhin können in einem Modul globale Variablen definiert werden, die nur in diesem
Modul verwendet werden können. Man spart sich dadurch häufig den umständlichen
Datentransfer von einer Prozedur zur nächsten über Parameterlisten. Globale Variablen
werden außerhalb von Prozeduren definiert, normalerweise am Anfang eines Moduls.
Das Modul-Konzept ermöglicht eine einfache Art der Kapselung (OOP-Konzept), wenn
Moduln in mehreren Projekten genutzt werden sollen.
Sie können neue Moduln in ein VBA-Projekt einfügen, in dem Sie in der VBA-Menüleiste auf
Einfügen/Modul klicken.
2.8 Benutzerdefinierter Datentyp
Mit der Type-Anweisung können Sie einen eigenen Datentyp definieren, der aus
Einzelvariablen und Datenfeldern mit Standarddatentypen besteht. Typischerweise
verwendet man benutzerdefinierte Datentypen, wenn mehrere Variablen in einem logischen
Zusammenhang stehen und unter einem gemeinsamen „Gruppen“-Namen angesprochen
werden sollen. Dadurch kann die Lesbarkeit des Programms verbessert und die Fehlerrate
durch falsche Verwendung von Variablen verringert werden. Das im folgenden angegebene
Beispiel definiert zwei benutzerdefinierte Datentypen Kunde und Lieferant. Beide Typen
haben Elemente gleichen Namens, die aber unterschiedliche Speicherstellen darstellen.
Nachdem ein neuer Datentyp definiert ist, kann er wie jeder Standarddatentyp in einer DimAnweisung verwendet werden. Die Type-Anweisung beschreibt nur einen neuen Datentyp,
reserviert aber keinen Speicherplatz im Kernspeicher des Rechners. Erst die Dim-Anweisung
im Deklarationsteil des Programms tut dies. Die im Deklarationsteil verwendeten
Variablennamen müssen sich vom gewählten Typnamen unterscheiden. In Anweisungen
und Zuweisungen werden die Variablennamen von den Elementnamen durch einen Punkt
Rothe
18/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
getrennt. Ein benutzerdefinierter Datentyp kann andere benutzerdefinierte Datentypen in
seiner Elementliste enthalten.
Syntax
[Private | Public] Type VarName
Elementname [([Indizes])] As Typ
[Elementname [([Indizes])] As Typ]
...
End Type
Beispiel
Option Base 1
’ Benutzerdefinierte Datentypen definieren
Type Kunde
Vorname As String
Nachname As String
Wohnort As String
PLZ As Long
TelNr As String
End Type
Type Lieferant
Vorname As String
Nachname As String
Wohnort As String
PLZ As Long
TelNr As String
End Type
Public Sub Beispiel()
‘ Deklarationsteil
Dim i As Long
Dim kunde1 As Kunde
Dim kd(10) As Kunde
Dim liefer(5) As Lieferant
’ dem Kunden kunde1 Eigenschaften zuweisen
kunde1.Nachname = "Müller"
kunde1.Vorname = "Xaver"
kunde1.Wohnort = "München"
kunde1.PLZ = 34221
kunde1.TelNr = "089-1234567"
’ in Tabellenblatt 1 ausgeben
Cells(1, 1) = kunde1.Nachname
Cells(1, 2) = kunde1.Vorname
Cells(1, 3) = kunde1.PLZ
Cells(1, 4) = kunde1.Wohnort
Cells(1, 5) = kunde1.TelNr
’ eine Liste von 10 Kunden mit Nachnamen belegen und ausgeben
For i = 1 To 10
kd(i).Nachname = "Müller_" & i
Cells(1 + i, 1) = kd(i).Nachname
Next i
’ eine Liste von 5 Lieferanten mit Nachnamen belegen
’ und in Tabellenblatt 2 ausgeben
Rothe
19/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
For i = 1 To 5
liefer(i).Nachname = "Meister&Co._" & i
Tabelle2.Cells(i, 1) = liefer(i).Nachname
Next i
End Sub
2.9 Objekte
2.9.1 Einleitung
Visual Basic für Applikationen (VBA) unterstützt das objektorientierte Programmierkonzept,
das seit Mitte der achtziger Jahre eine große Popularität in der Softwareentwicklung erfährt.
Alle neuen modernen Programmiersprachen wie Java und C++ unterstützen dieses Konzept.
VBA ist allerdings keine vollständige objektorientierte Programmiersprache (OOP), da sie
nicht alle Features unterstützt. Für die Programmierung von Excel-Anwendungen ist der
Funktionsumfang aber völlig ausreichend.
Im vorherigen Kapitel hatten Sie den benutzerdefinierten Datentyp kennengelernt. Objekte
sind eine Fortsetzung dieses Gruppierungsgedankens von Variablen. Objekte enthalten aber
nicht nur Daten sondern auch Funktionen und Prozeduren, die im Zusammenhang mit den
Daten stehen und zum Lesen, Schreiben und Rechnen verwendet werden.
In der objektorientierten Programmierung werden viele neue Begriffe eingeführt. So heißen
Funktionen oder Prozeduren ganz allgemein Methoden. Mit dem Wort Eigenschaft wird
zum Beispiel die Farbe einer Zelle oder die Schriftart der Zeichen in einer Zelle beschrieben.
Programmtechnisch verbirgt sich hinter einer Eigenschaft meist eine Zahl. Das heißt, dass
zum Beispiel die Eigenschaft „rote Farbe“ in einer Variablen unter dem Namen Color
gespeichert wird, die bei „roter Farbe“ den Wert 3 hat.
2.9.2 Erläuterungsbeispiel
Als Objekte können konkrete oder abstrakte Gegenstände aufgefasst werden. Ein Tragwerk
kann zum Beispiel als ein Objekt betrachtet werden. Ein Objekt besteht meist aus weiteren
Objekten. Ein Bauingenieur unterteilt ein Tragwerk je nach Betrachtungsweise in Decken,
Dach, Stützen, Fundamente etc, die wieder als Objekte aufgefasst werden können. Aber
auch diese Elemente können weiter aufgeteilt werden. So besteht ein Dach aus Pfetten,
Sparren und Pfosten etc.. Jedes Objekt hat Eigenschaften. Bei einem Sparren mit
rechteckigem Querschnitt sind das zum Beispiel die Abmessungen Breite, Höhe und Länge,
das Material und die Festigkeiten. Das Volumen kann mit einer Methode berechnet werden,
in dem die Breite mit der Höhe und der Länge multipliziert wird. Auch die vorhandenen
Spannungen können mit Methoden berechnet werden. Alle diese beschriebenen Objekte
bestehen in einer Beziehung zueinander, die hierarchisch dargestellt werden kann.
Rothe
20/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
1.Ebene
Tragwerk
Decken
Decke KG
Stützen
Decke EG
Dach
Sparren
Pfetten
2.Ebene
Pfosten
Breite
Höhe
Länge
Material
Festigkeit
3.Ebene
Eigenschaften
Um die Breite des zweiten Sparrens anzusprechen, wird folgende Syntax vereinbart. Der
Punkt wird als Trennzeichen vereinbart.
Tragwerk.Dach.Sparren(2).Breite
Es wäre müßig, für jedes Tragwerk eine neue Hierarchie zu entwickeln, da fast jedes
Gebäude ein Dach, Stützen und Decken hat. Effektiver ist es, wenn man eine allgemeine
Beschreibung festlegt, die für viele Tragwerke benutzt werden kann. Diese Beschreibung
erfolgt mit Hilfe von Klassen. Zum Beispiel werden die Decken zu einer Klasse
zusammengefasst. Dabei kann unterschieden werden zwischen Deckenarten, Aufbau,
Materialen und Abmessungen etc. Die Klasse der Decken kann wiederum aufgeteilt werden
in Klassen für Stahlbeton- und Holzdecken mit eigenen speziellen Eigenschaften.
Ein konkretes Tragwerks-Objekt wird dann über die Klasse erzeugt. Das Objekt hat dann alle
Eigenschaften und Methoden, die in der Klasse beschrieben wurden. Die Objekte werden
auch als Instanz ihrer Klasse bezeichnet.
Um die Breite des zweiten Sparrens eines realen Gebäudes mit Namen A12 anzusprechen,
würde man jetzt schreiben:
A12.Dach.Sparren(2).Breite
Und sollte es auch ein weiteres Tragwerk A11 mit mindestens 2 Sparren geben:
A11.Dach.Sparren(2).Breite
Die Breiten der Sparren in den beiden Tragwerken können natürlich unterschiedlich sein, da
die Eigenschaften (Daten) eigene Speicherplätze verwenden.
Jedes Objekt gehört einer Klasse an. Klassen werden in einer hierarchischen Beziehung
aufgebaut. Unterklassen können Eigenschaften und Methoden von übergeordneten Klassen
übernehmen. Man bezeichnet dies als Vererbung. Zum Beispiel kann man der Klasse
Decken die Eigenschaft Dicke zuordnen, da jede Decke eine Deckendicke hat. Diese
Eigenschaft können alle abgeleiteten Deckenarten übernehmen, so dass diese keine eigene
Eigenschaft Deckendicke benötigen. Man kann dadurch die Größe von Unterklassen
reduzieren und Fehler vermeiden.
Rothe
21/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
2.9.3 Objekt-Hierarchie in Excel
Das oberste Objekt in der Hierarchie ist die Application. Es gibt immer nur ein ApplicationObjekt, da es von dem ausführbaren Programm excel.exe unter Windows nur eine Instanz
geben kann. Das Programm excel.exe kann aber mehrere xls-Dateien (Arbeitsmappe,
workbook) gleichzeitig geöffnet haben. Deshalb gibt es in der unter Application-Objekt
liegenden Ebene die Workbooks-Objekte, deren Anzahl von den aktuell geöffneten xlsDateien abhängt. In der nächst tiefer gelegenen Ebene befinden sich die worksheetsObjekte, deren Anzahl von den vorhandenen Tabellenblättern pro Arbeitsmappe abhängt.
Jedes der genannten Objekte enthält weitere Objekte, Eigenschaften und Methoden.
Das unten gezeigte Bild zeigt eine mögliche Objekt-Hierarchie in Excel bei 2 geöffneten
Arbeitsmappen und jeweils 2 vorhandenen Tabellenblättern.
Application
Workbooks(1)
Worksheets(1)
Cells
Rows
Activate
Select
Columns
Range
Worksheetfunction
StatusBar, Name, etc.
Worksheets(2)
Workbooks(2)
Worksheets(1)
Cells
Rows
Activate
Select
Columns
Range
Cells
Rows
Activate
Select
Columns
Range
Worksheets(2)
Cells
Rows
Activate
Select
Columns
Range
Um das erste Tabellenblatt der zweiten Arbeitsmappe zu aktivieren, können Sie die ActivateMethode verwenden:
Application.Workbooks(2).Worksheets(1).Activate
Da die Adressierung von Objekten mittels Indizes schlecht lesbar und auch fehleranfällig ist,
gibt es zusätzlich die Möglichkeit den Namen der Arbeitsmappe oder des Tabellenblattes
anzugeben:
Application.Workbooks(“test.xls“).Worksheets(“Tabelle1“).Activate
Das Application-Objekt enthält weitere Objekte wie das Worksheetfunction-Objekt, das alle
Excel-Tabellenfunktionen enthält. Die StatusBar-Eigenschaft ermöglicht das Schreiben einer
Zeichenfolge in die Statuszeile in der unteren linken Ecke des Anwendungsfensters.
Application.StatusBar = “Bin gerade am Rechnen, das kann dauern“
In vielen Fällen, besonders beim Schreiben und Lesen von Zellwerten, kann die lange
Angabe der Application-, Workbooks- und Worksheets-Objekte entfallen. Es wird dann das
gerade aktive Tabellenblatt verwendet. Siehe hierzu auch das Range-Objekt.
2.9.4 With-Anweisung
Mit der With-Anweisung kann eine Reihe von Anweisungen für ein bestimmtes Objekt
ausführt werden, ohne dass der Namen des Objekts mehrmals angeben werden muss.
Rothe
22/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Dies verbessert die Lesbarkeit besonders bei langen Namen, die aus mehreren Objekten
zusammengesetzt sind. Die With-Anweisung kann geschachtelt werden.
Syntax
With Objekt
[Anweisungen]
End With
Beispiel
With Worksheets("Tabelle1").Range("A1:C10")
.Value = 30
.Interior.Color = RGB(255, 255, 0) ' gelber Hintergrund
With .Font
.Name = "Arial"
.Bold = True
.Size = 8
.Color = RGB(0, 0, 200)
' blaue Zeichen
End With
End With
2.9.5 Range-Objekt
Mit dem Range-Objekt (Range=Bereich) können Sie komfortabel auf einzelne Zellen oder
Zellbereiche in Tabellenblättern zugreifen. Dabei können Sie sowohl Werte in Zellen
schreiben als auch lesen oder die Eigenschaften (Farbe etc.) der Zellen ändern. Es gibt eine
große Anzahl von Methoden und Eigenschaften, die zu dem Range-Objekt gehören. Einige
wichtige sollen hier vorgestellt werden.
Beispiele
Die folgende Anweisung schreibt die Zahl 3 in die Zelle „A3“ und die darauf folgende
Anweisung selektiert die Zelle „A2“ im aktuellen Tabellenblatt.
Range("A3").Value = 3
Range("A2").Select
' Zelle A3 erhält den Wert 3 zugewiesen
' Zelle A2 wird selektiert
In dem nächsten Beispiel wird in den Zellbereich A1, A2, und
A3 der Wert 4 geschrieben:
Range("A1:A3").Value = 4
Mit der folgenden Anweisung wird das Tabellenblatt „Tabelle2“ als aktives Blatt gesetzt. Alle
folgenden Anweisungen mit Range verwenden dann „Tabelle2“.
Worksheets("Tabelle2").Activate
' Tabelle2 ist jetzt aktives Blatt
Alternative zu Range kann auch die Cells-Methode verwendet werden, die anstelle von
Zellnamen eine Adressierung wie bei Matrizen mit Zeilen und Spalten verwendet.
’ Schriftgröße von Zelle in Zeile 5 und Spalte 3 der Tabelle 1 wird auf Größe 14 gesetzt
Worksheets(”Tabelle1“).Cells(5,3).Font.Size = 14
Besonders interessant ist die Anwendung des Range-Objekts im Zusammenhang mit
Funktionen. Das folgende Beispiel zeigt die Funktion MySum, die die Summe aus mehreren
untereinander stehenden Zellwerten berechnet (ähnlich wie die Excel-Funktion SUMME() )
Rothe
23/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Die Count-Eigenschaft gibt einen Long-Wert zurück, der die Anzahl der Elemente in der
angegebenen Auflistung angibt.
Public Function MySum(r As Range)
Dim i As Long, n As Long
n = r.Rows.Count ' Anzahl der markierten Zellen
MySum = 0
For i = 1 To n
MySum = MySum + r.Cells(i, 1)
Next i
End Function
2.9.6 WorksheetFunction-Objekt
In dem Worksheetfunction-Objekt sind alle Microsoft Excel-Funktionen enthalten, die Sie aus
dem Funktionsassistenten in Excel kennen. Diese Funktionen können Sie auch in Ihren
eigenen Visual Basic Programmen verwenden. Sie dürfen nur die englischen Namen der
Funktionen verwenden.
In VBA ist die Konstante π nicht definiert, wohl aber enthält das Worksheetfunction-Objekt
die Eigenschaft Pi:
Dim myPi As Double
myPi = Application.Worksheetfunction.Pi
2.10 Nützliche Funktionen
2.10.1
InputBox
Diese Funktion öffnet ein Dialogfenster mit einem
Textfeld, in das eine Zeichenfolge eingeben werden
kann. Die Funktion gibt einen Wert vom Typ string
zurück. Wenn der Datentyp der Variablen, die den
Rückgabewert der InputBox erhält, von einem
anderen Datentyp als string ist, wird eine Typumwandlung durchgeführt (siehe Beispiel).
Syntax
InputBox(prompt[, title] [, default] [, xpos] [, ypos])
Beispiele:
Dim i As Integer
Dim str As String
i = InputBox("Geben Sie eine Ganzzahl ein")
str = InputBox("Geben Sie eine Zeichenfolge ein")
Hinweise
Mit dem zweiten Parameter title wird der Text in der Titelleiste der InputBox bestimmt. Der
dritte Parameter default ermöglicht einen Voreinstellungswert in das Textfeld zu schreiben.
Rothe
24/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
2.10.2
EDV Anwendungen im Bauwesen II
MsgBox
Die Funktion MsgBox (Messagebox) öffnet ein Fenster, um dem Anwender besondere
Hinweise zum Programmablauf zu geben. Üblicherweise wird diese Funktion verwendet,
wenn Fehler aufgetreten sind oder Zwischenwerte ausgegeben werden sollen.
Syntax
MsgBox(prompt[, buttons] [, title])
Hinweise
Mit dem Parameter buttons kann das Erscheinungsbild des Fensters verändert werden.
Folgende Parameter sind möglich:
vbOKOnly
vbYesNo
vbYesNoCancel
vbCritical
Zeigt nur die Schaltfläche OK an
Zeigt die Schaltflächen Ja und Nein an
Zeigt zusätzlich zu Ja und Nein die Schaltfläche Abbrechen an
Zeigt die Meldung mit dem Stop-Symbol an
Mit dem dritten Parameter title wird der Text in der Titelleiste der MsgBox bestimmt.
Beispiel
MsgBox "unerwarteter Fehler", vbCritical, "Programmierfehler"
3 Steuerelemente und Userform-Fenster
Steuerelemente (Schaltflächen) können sowohl auf Tabellenblättern als auch auf UserformFenstern (Formulare, Dialoge) platziert werden.
Bild
Deutsche Bezeichnung
Englische Bezeichnung
Befehlsschaltfläche
CommandButton
Bezeichnungsfeld
Label
Textfeld
TextBox
Kombinationsfeld
ComboBox
Kontrollkästchen
CheckBox
Optionsfeld
OptionButton
Rahmen
Frame
Einige Steuerelemente
Rothe
25/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
3.1 Einfügen einer Schaltfläche zum Starten von Prozeduren
Mit einer Befehlsschaltfläche, die an einer beliebigen Stelle auf dem Tabellenblatt platziert
werden kann, können Sie auf einfache Weise „sub“-Prozeduren starten. Dazu müssen sie
wechseln. Danach klicken Sie auf das Symbol
zuerst in den Entwurfsmodus
Steuerelement-Toolbox
. Es erscheint dann eine verschiebbare Symbolleiste, aus der Sie
die Befehlsschaltfläche durch Anklicken auswählen. Mit der Maus bewegen Sie das nun
erscheinende Fadenkreuz an die Stelle, an der sich die Schaltfläche befinden soll, und
ziehen sie bei gedrückter linker Maustaste diagonal auf.
Danach klicken Sie mit der rechten Maustaste auf die Schaltfläche und wählen aus dem
erscheinenden Kontextmenü Eigenschaften aus. In dem
Eigenschaftsdialog ändern Sie die Beschriftung (Caption) der
Schaltfläche von CommandButton1 zu Rechnen. Danach ändert
sich der Text auf der Befehlsschaltfläche.
Als nächstes müssen Sie der Befehlsschaltfläche eine „sub“Prozedur zuordnen, die nach dem Anklicken ausgeführt wird.
Dazu klicken Sie wieder mit der rechten Maustaste auf die
Schaltfläche und wählen Code anzeigen aus. Es wird das Visual
Basic Editor Fenster geöffnet. In dem Code Fenster steht ein
„sub“-Prozedur Gerüst mit Namen CommandButton1_Click(), in
das Sie beliebigen Basic Code einfügen können. Diese Prozedur
wird immer dann ausgeführt, wenn Sie die Befehlsschaltfläche
auf dem Tabellenblatt anklicken.
Private Sub CommandButton1_Click()
End Sub
Rothe
26/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
3.2 Kombinationsfeld
Das Kombinationsfeld besteht aus einem Textfeld und einer Listbox
und bietet sich zur Eingabe an, wenn im Normalfall nur bestimmte
Werte eingegeben werden sollen. Beim Anklicken öffnet sich das
Listenfeld, aus dem eine Option ausgewählt werden kann. Alternativ
kann in dem Textfeld aber auch ein Wert
eingetippt werden.
Wie beim Erstellen einer Schaltfläche
müssen sie zuerst in den Entwurfsmodus
wechseln und auf das Symbol
Steuerelement-Toolbox
klicken. In der
Toolbox wählen Sie das Kombinationsfeld aus und bestimmen mit dem
erscheinenden Fadenkreuz die Lage und Abmessungen auf dem
Tabellenblatt. Damit das Listenfeld mit auszuwählenden Werten gefüllt
werden kann, sind mehrere Schritte erforderlich. Die einfachste Lösung
wird hier beschrieben: Die zur Auswahl stehenden Werte schreiben Sie
in einen Zellbereich Ihrer Wahl, z.B. in ein neues Tabellenblatt, welches
nur für Hilfswerte benutzt wird. Dann öffnen Sie das
Eigenschaftsfenster des Kombinationsfeldes und tragen den Bereich in
die Zeile ListFillRange ein, z.B. Tabelle2!A1:A4 .
Den gewählten Eintrag können sie mit folgender Anweisung in Ihrem
VBA-Programm einlesen:
Dim eulerfall As Integer
eulerfall = ComboBox1.Value
' eulerfall erhält Wert des selektierten Eintrags in der Listbox
Weitere Beispiele
Dim i
ComboBox1.ListIndex = 0
i = ComboBox1.ListIndex
' wählt ersten Eintrag in Listbox aus. Achtung: Index beginnt mit 0
' i erhält die Indexnummer des selektierten Eintrags in der Listbox
Hinweise
Die Beispieldatei „Kombinationsfeld.xls“ enthält zwei Varianten zum Arbeiten mit
Kombinationsfeldern. Die ersten Variante benutzt die Schaltfläche „Rechnen“, um eine
Berechnung zu starten. Nach dem Anklicken der Schaltfläche wird die Prozedur
CBRechnen_Click() im Modul „Tabelle1“ aufgerufen.
Die zweite Version benutzt die Funktion TestComboBox(i) im Modul „Funktionen“. Diese
Funktion wird im Tabellenblatt „Tabelle1“ in Zelle „C9“ verwendet. Die Verwendung von
Kombinationsfeldern in Tabellenblättern stellt ein Problem dar, da eine Änderung der
Auswahl keine automatische Neuberechnung des Tabellenblattes startet. Deshalb muss eine
Neuberechnung erzwungen werden. Sie erreichen dies dadurch, dass Sie das
Kombinationsfeld mit einer Zelle verknüpfen. Dazu tragen sie im Ereignisfenster des
Kombinationsfeldes in der Zeile LinkedCell eine Zelladresse ein (im Beispiel „C4“). Diese
Zelladresse wird auch als Übergabeparameter für die Funktion TestComboBox(i) verwendet.
Da TestComboBox jetzt von Zelle „C4“ abhängig ist, wird bei einer Änderung im
Kombinationsfeld eine Neuberechnung ausgeführt.
Eine Übersicht über die zur Verfügung stehenden Methoden, die im Zusammenhang mit dem
Kombinationsfeld verwendet werden können, finden sie in den beiden Listboxen oberhalb
des Codefensters.
Zugehörige
Methoden
Vorhandene
Objekte
Rothe
27/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
3.3 Benutzerformulare
Um ein neues Benutzerformular (Dialog) zu erstellen, wählen Sie im VBA-Editor in der
Menüleiste Einfügen/Userform. Es wird ein neues Fenster mit einem Dialog und ein Fenster
Werkzeugsammlung mit verschiedenen Steuerelementen geöffnet. Mit der Funktionstaste F4
öffnen Sie zusätzlich das Eigenschaftsfenster. Ändern sie zuerst im Eigenschaftsfenster den
Namen und die Caption des Dialogs (Userform) von Userform1 zu zum Beispiel
Eingabedialog.
Caption
TextBoxVorname
CB_OK
Wie in Kapitel 3.1: Einfügen einer Schaltfläche zum Starten von Prozeduren beschrieben,
können Sie nun einzelne Steuerelemente auf der Dialogfläche platzieren. Damit Sie später
die einzelnen Steuerelemente auswerten und verändern können, sollten Sie im
Eigenschaftsfenster diesen einen selbsterklärenden Namen geben. Zum Beispiel ist der
Name TextBoxVorname leichter zuzuordnen als TextBox1, wenn in das Textfeld der
Vorname einzugeben ist.
Jeder Dialog sollte mindestens einen OK-Button (Befehlsschaltfläche) haben. Durch diese
Schaltfläche wird der Dialog beendet und die Eingabefelder zuvor ausgelesen. Zeichnen Sie
zuerst den Button, ändern dann den Namen (z.B. CB_OK) und klicken zweimal auf den
Button. Es wird dann das Codefenster geöffnet und die Prozedur CB_OK_Click() angezeigt,
die immer ausgeführt wird, wenn die Schaltfläche angeklickt wird. Die Prozedur wird dazu
benutzt, die Eingabefelder auszulesen und dann den Dialog zu schließen. Der Dialog wird
durch die Anweisung Unload Name_des_Dialogs geschlossen.
Dim text As String
Private Sub CB_OK_Click()
text = TextBoxVorname
' Eingabe aus Textfeld mit Namen TextBoxVorname sichern
Unload Eingabedialog
' Dialog schliessen
End Sub
Die Variable text muss natürlich außerhalb der Prozedur CB_OK_Click() deklariert sein,
damit sie in anderen Prozeduren weiter verwendet werden kann.
Der Dialog wird mit der Methode show durch folgende Anweisung geöffnet:
Eingabedialog.Show
Rothe
28/30
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
Die Dateien Formular.xls und Userform.xls enthalten Beispiele für die Anwendung von
Dialogen. In der Datei Formular.xls werden die Dialoge mit Hilfe von Schaltflächen im
Tabellenblatt geöffnet. In der Datei Userform.xls werden die Dialoge durch einen neuen
Eintrag Kunden in der Menüleiste gestartet. Diese Form macht einen sehr professionellen
Eindruck, ist allerdings vergleichsweise aufwendig zu implementieren, näheres hierzu in [2].
4 Literatur
[1]
[2]
[3]
[4]
[5]
[7]
[8]
[9]
[10]
[11]
René Martin: Workshop VBA, Addison-Wesley, 2000
Reinke Solutions Team: Microsoft Excel 2000 – Das Handbuch, Microsoft Press, 2000
Matthew Harris: Visual Basic for Applications in 21 Tagen, SAMS, 1998
Michael Kofler: Excel 2000 programmieren, Anwendungen erstellen mit Visual Basic für
Applikationen, Addison-Wesley, 2000
Benno Brudermanns, Ernst Tiemeyer: Excel 2000 für Profis. Programmieren mit VBA,
Rowohlt TB-Verlag, rororo Computer, 2000
Bernd Held: Excel-VBA-Programmierung - Kompendium . VBA-Lösungen für die Praxis,
Markt+Technik, 2001
Bernd Held: Excel-VBA-Programmierung - Kompendium . VBA-Antworten für die Praxis,
Markt+Technik, 2000
Bernd Held: Excel-VBA, Schritt für Schritt zum Profi, Markt+Technik, 2004
Friedrich, Christian: VBA mit Excel, Galileo Computing, 2004
Friedrich, Christian: Einstieg in VBA mit Excel, Galileo Computing, 2005
5 Anhang
5.1 Schlüsselwörter
Folgende Wörter haben in VBA besondere Bedeutung und können nicht als Variablen- oder
Funktionsnamen verwendet werden.
As
Base
Binary
Boolean
ByRef
Byte
ByVal
Call
Case
Const
Currency
Date
Decimal
Dim
Do
Double
Else
Rothe
Empty
End
Error
Exit
False
For
Friend
Function
Get
Input
If
Integer
Is
Len
Let
Lock
Long
Loop
Me
Mid
New
Next
Nothing
Null
Object
On
Option
ParamArray
Print
Private
Property
Public
ReDim
Resume
29/30
Seek
Select
Set
Single
Static
Step
String
Sub
Then
Time
To
True
Type
Until
Variant
While
WithEvents
V. 1.1
Hochschule Darmstadt
VBA
FACHBEREICH BAUINGENIEURWESEN
EDV Anwendungen im Bauwesen II
5.2 Symbole im Objektkatalog und im Code-Fenster
Der Objektkatalog und das Code-Fenster enthalten mehrere Symbole zur Darstellung von
Klassen und Elementen. In der folgenden Tabelle finden Sie eine Liste der Symbole und
deren Bedeutung.
Symbol:
Bedeutung:
Symbol:
Eigenschaft
Standardeigenschaft
Methode
Standardmethode
Ereignis
Konstante
Modul
Bedeutung:
Klasse
Benutzerdefinierter Typ
Global
Bibliothek
Projekt
Integrierte Schlüsselwörter und Typen
Aufzählung (Enum)
5.3 Abkürzungen für Datentypen
Die Deklaration des Datentyps einer Variablen mit der Dim_Anweisung kann alternativ zu As
Datentyp auch durch ein reserviertes Sonderzeichen erfolgen.
Zeichen
%
&
!
#
@
$
Datentyp
Integer
Long
Single
Double
Currency
String
Beispiel
Dim var%
Dim var&
Dim var!
Dim var#
Dim var@
Dim var$
5.4 Shortcuts in VBA
Shortcut
Beschreibung
Shortcut
Beschreibung
F1
F2
VBA-Hilfe
Objektkatalog anzeigen
F7
F8
F3
Weitersuchen
F9
F4
Anzeigen des
Eigenschaftsfensters
Fortsetzen der Ausführung einer
Anwendung
STRG+PAUSE
Wechseln zwischen CodeBereichen bei geteiltem Fenster
STRG+
UMSCHALT+F9
Code-Fenster anzeigen
Zeilenweises Ausführen von
Code (Einzelschritt)
Setzen oder Löschen eines
Haltepunkts
Unterbrechen der Ausführung
einer Visual Basic-Anwendung
Zeilenweises Ausführen von
Anweisungen, ohne
Prozeduraufrufe zu verwenden
Alle Haltepunkte löschen
F5
F6
Rothe
UMSCHALT+F8
30/30
V. 1.1