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