Objektorientierung mit VBA Visual Basic for Applications Klassen und Objekte Übungen Christoph Oberweis 2007 Agenda C.O. VBA und Objekte Daten- u. Grundstrukturen in VBA Modelle und Modellbildung Klassen – Objekte - Beziehungen Übungen COM Quellen 2 Agenda VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. VBA und Objekte Daten- u. Grundstrukturen in VBA Modelle und Modellbildung Klassen – Objekte - Beziehungen Übungen COM Quellen 3 VBA … VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. … ist eine Programmiersprache … ist in die Office-Anwendungen integriert … erlaubt das Arbeiten mit Objekten … kann als Schnittstelle zu Office, aber auch zu Windows - Ressourcen insgesamt benutzt werden 4 Wo versteckt sich VBA? Wechsel mit <Alt> <F11> von der Office Anwendung in das VBA – Programmiersystem VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Zurück zur Office Anwendung: Hier klicken Quellen C.O. 5 Zunächst ein „warming up“ VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung Einfache Ausgabe - Anweisung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 1. Schritt: Excel aufrufen 2. Schritt: Mit <Alt> <F11> in die Programmierumgebung wechseln 3. Schritt: „Diese Arbeitsmappe“ anklicken (Das wird später anders gemacht!) 4. Schritt: Falls jetzt schon Programmcode erscheint, diesen löschen 5. Schritt: Obiges Programm eingeben 6. Schritt: Mit <F5> Programm starten 7. Schritt: Programm testen, gegebenenfalls korrigieren 8. Schritt: Mit <Alt><F11> zurück zu Excel 6 Weitere Möglichkeiten VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Auch hier kann das Programm gestartet werden: ein Klick genügt! … und wenn es mal abgestürzt ist: hier klicken. Quellen Und wer es ganz genau wissen will: F8 ist der Einzelschritt-Mode zum Debugen. C.O. 7 Objekte: Intuitiver Zugang in Word VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Hier klicken! C.O. 8 Überall Objekte! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 9 „Application“ ist der Boss! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Drücke F1, und das Objekt verrät seine „Geheimnisse“ C.O. 10 Was das Objekt so hat und kann VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 11 Eigenschaften und Methoden Ausgabe - Anweisung Punkt - Operator: Trennt den Objekt - Namen von der Eigenschaft oder der Methode VBA & Objekte Daten&Grundstrukturen Eigenschaft, hier:Benutzername Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Methode, jetzt wird gedruckt (Drucker bitte einschalten) C.O. 12 Leichter Zugriff! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung Objekt_bezeichner.Methode_1 Objekt_bezeichner.Eigenschaft_1 KlassenObjekteBeziehungen Übungen COM Quellen C.O. Beachte die Ähnlichkeit hinsichtlich des Zugriff auf Record – Komponenten! 13 EXCEL - Objekte Mit Hilfe von VBA-Programmen können EXCEL –Tabellenblätter, Arbeitsmappen, einzelne Zellen oder Zellbereiche verändert werden. VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Wichtige Objekte: Wichtige Objekteigenschaften: Application (Das gesamte EXCEL-Fenster) Caption (Beschriftung der Objekte) Workbook (eine Arbeitsmappe) Name Worksheet (das einzelne Arbeitsblatt) Selection (das markierte Objekt) Range (Zellenbereich oder einzelne Zelle) Value (Wert/Inhalt, z. B. einer Zelle) Übungen COM Quellen C.O. 14 Die „Quadratur“ mit VBA Wichtige Objektmethoden: Select (Zelle auswählen) Clear (löschen) VBA & Objekte Cells (Zugriff auf spezielle Zellen, Cells erwartet eine Zeilen- und Spaltenindex) Daten&Grundstrukturen Close (Applications - Objekt oder Arbeitsmappe schließen) Modelle und Modellierung Schleifenprogrammierung, Füllen einer EXCEL-Tabelle: KlassenObjekteBeziehungen Übungen COM Quellen C.O. Option Explicit Sub quadate() Dim x As Integer Dim i As Integer x = 1 i = -5 Workbooks("Mappe1").Worksheets("Tabelle1").Select Do While i < 6 Cells(x, 1).Select ActiveCell.Value = i Cells(x, 2).Select ActiveCell.Value = i * i x = x + 1 i = i + 1 Loop End Sub quadrate x := 1, i := -5 Tabelle1 auswählen Solange i < 6 Zelle auswählen i in Zelle übertragen Nachbarzelle auswählen i * i in Zelle übertragen Spaltenzähler (=x) und i erhöhen 15 Deklaration von Variablen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Option Explicit Dim net As Double Dim x As Integer Deklaration ist zwingend (kann abgestellt werden) Deklaration zweier Variablen mit Typenangabe 16 Arrays VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen Sub selsort() Dim Z(10) As Integer Dim I As Integer Dim K As Integer Dim H As Integer ………… COM Z(I) = InputBox("Wert: ", I) Quellen ………… C.O. 17 Verbund - Variablen Option Explicit Type record_1 VBA & Objekte Anum As Integer Daten&Grundstrukturen Abez As String Modelle und Modellierung Apreis As Double KlassenObjekteBeziehungen Übungen COM Quellen C.O. End Type Sub datensatz() Dim Artikelsatz As record_1 Artikelsatz.Anum = InputBox("Artikelnummer: ") 18 Files Open "Artikeldatei" For Output As #1 VBA & Objekte Daten&Grundstrukturen …… Write #1, Artikeltabelle(I).A_nummer, Artikeltabelle(I).A_bezeichnung, Artikeltabelle(I).A_preis Modelle und Modellierung KlassenObjekteBeziehungen Open "Artikeldatei" For Input As #1 Übungen COM Quellen C.O. …… Input #1, Artikeltabelle(I).A_nummer, Artikeltabelle(I).A_bezeichnung, Artikeltabelle(I).A_preis 19 Abfragen Option Explicit VBA & Objekte Sub rabatt_1() Daten&Grundstrukturen Dim net As Double Modelle und Modellierung Const rab = 3 Dim brut As Double Const mwst = 19 KlassenObjekteBeziehungen net = InputBox("Nettobetrag: ") Übungen brut = ((net * mwst) / 100) + net COM MsgBox ("Rechnungsbetrag BRUTTO " & brut) If net > 99.99 Then net = net - (net * rab / 100) Quellen End Sub C.O. 20 If … Else If jahre > 5 Then VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen rueck = beitrag_j * 0.09 Else rueck = beitrag_j * 0.04 End If Übungen COM Quellen Hinweis: Zeilengliederung muss so sein! Ansonsten bei Fortsetzungszeile: In der vorhergehenden Zeile das Zeichen ´_´! C.O. 21 Schleifen Option Explicit VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen Sub durchschnitt_1() Dim tage As Integer Dim anzahl As Double Dim summe As Double Dim schnitt Dim z As Integer tage = InputBox("Anzahl Tage: ") z = 1 summe = 0 Do While z <= tage anzahl = InputBox("Anzahl Besucher: ", anzahl) summe = anzahl + summe z = z + 1 Loop COM Quellen C.O. schnitt = summe / tage MsgBox ("Durchschnitt: " & schnitt) End Sub 22 For - Schleife VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM For i = 1 To j z = (k * p) / 100 t = r - z k = k - t aus = aus & Format(i, "00 ") & Format(z, "0000000.00 ") _ & Format(t, "0000000.00 ") & Format(k, "0000000.00") & vbCrLf Next i Formatierung numerischer Werte (vgl. Prg.: Tilgungsplan) Quellen C.O. 23 Modelle und Modellierung Wirkliche Welt: Autohaus VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Modell: Idealisierte Darstellung (Abbildung) der realen Welt zur Veranschaulichung bestimmter Sachverhalte/Eigenschaften/Prozesse, Vereinfachung der Realität 24 Diesen da ... VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 25 ... picken wir uns mal raus… VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 26 …und untersuchen ihn genauer! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 27 „Objektive“ Tatsachen! Kfz Hersteller= „Daihatsu“ Typ= „Terios“ ……… Hubraum= 1495 ……… Farbe= „metallic silber“ ……. VKPreis= 17800,00 VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen „konkretes“ individuelles Fahrzeug „abstrakte“ Darstellung Beachte: Zu jedem Fahrzeug gehört eine Herstellerangabe eine Typenangabe usw. (Gemeinsamkeit); diese Attribute haben je nach Kfz einen unterschiedlichen Inhalt. C.O. 28 Produktion am Fließband VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Schablone, nach diesem „Bauplan“ können (fast) unendlich viele Fahrzeuge gebaut werden. Allerdings benötigt dieser Plan exakte Angaben zu den Details des Fahrzeugs. 29 Produktion am Fließband Kfz Hersteller: Text Typ: Text ……… Hubraum: Ganzzahl ……… Farbe: Text ……. VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Schablone, nach diesem „Bauplan“ können (fast) unendlich viele Fahrzeuge gebaut werden. Allerdings benötigt dieser Plan exakte Angaben zu den Details des Fahrzeugs. So könnte der Bauplan formuliert sein: Attribute: Variablen mit Typenangabe als Informationen zu den Eigenschaften des Fahrzeugs (Vorstufe einer Klasse). 30 Klasse: Fertig! Notation in UML (Unified Modeling Language) Kfz VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Hersteller: Text Typ: Text ……… Hubraum: Ganzzahl ……… Farbe: Text ……. VKPreis: Währung Erfassung() Ändern() Löschen() Drucken() …………… Klassenname Attribute Methoden 31 Von der Klasse … „Abstrakter“ Bauplan Kfz VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Hersteller: Text Typ: Text ……… Hubraum: Ganzzahl ……… Farbe: Text ……. VKPreis: Währung Erfassung() Ändern() Löschen() Drucken() …………… 32 ... zum Objekt „Konkretes“ individuelles Fahrzeug :Kfz VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Hersteller= „Daihatsu“ Typ= „Terios“ ……… Hubraum= 1495 ……… Farbe= „metallic silber“ ……. VKPreis= 17800,00 Erfassung() Ändern() Löschen() Drucken() …………… 33 Die erste eigene Klasse VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Die Klasse besitzt drei Attribute und zwei Methoden. Damit lässt sich in der Realität selbstverständlich kein Fahrzeug hinreichend modellieren – es geht jetzt zunächst darum, die Klasse und ein dazu passendes Testprogramm in VBA zu implementieren. Quellen C.O. 34 Klasse erfassen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Hier den Menüpunkt „Klassenmodul“ anwählen … 35 Klasse erfassen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. … und die neue Klasse anlegen. 36 Klasse erfassen VBA & Objekte Daten&Grundstrukturen Doppelklick auf „Klasse“... Modelle und Modellierung KlassenObjekteBeziehungen Übungen ... und Name ändern (Kfz)! COM Quellen C.O. 37 Klasse erfassen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 38 Klasse: Erläuterungen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 39 Klasse: Erläuterungen Private Hersteller VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Das Attribut „Hersteller“ darf nur von „Verarbeitungsschritten“ der eigenen Klasse manipuliert werden (Kapselung). Das Gegenstück wäre „Public“, wenn die Attribute allerdings dann „von überall“ verändert werden können, ist das Einrichten einer Klasse eigentlich unsinnig. Sub erfassen(her, ty, hub) Sub kennzeichnet eine Methode der Klasse, in den Klammern stehen Platzhalter (Variablen) für die Daten, die von außen (vom Testprogramm) dem Objekt übermittelt werden. Die Verarbeitungsschritte stehen zwischen Sub und End Sub. Hersteller = her Das Attribut „Hersteller“ erhält den Wert, der in Her von außen an das Attribut übermittelt wurde. Function ErmittleTyp() Der im Objekt gespeicherte Wert für den Autotyp soll an das Testprogramm zurückgeliefert werden. C.O. 40 Das Testprogramm VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 41 Das Testprogramm VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung Noch besser: Fachkonzept unter „Module“ codieren. KlassenObjekteBeziehungen Übungen COM Quellen C.O. 42 Erläuterungen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 43 Erläuterungen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Das Testprogramm setzt hier die Werte der Attribute. In der Praxis wäre die Quelle dieser Daten z. B. eine Datenbank. Ein Programm, welches die Daten zunächst setzt und dann unmittelbar danach wieder abfragt, ist aus der Sicht der Praxis „unsinnig“. Es wäre eher so, dass ein Programm für die Erfassung der Daten zuständig ist und ein anders für die Weiterverarbeitung. Das wird auch später so vorgeführt – jetzt geht es zunächst einmal nur darum, den „Mechanismus“ zu begreifen. Daher wurde auch die Bezeichnung „Testprogramm“ gewählt! 44 Programmtest VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Es klappt: C.O. 45 Beziehungen zwischen Klassen/Objekten Überlegung: Wie ist nun der Zusammenhang zwischen dem Testprogramm und dem Objekt „Kfz“ (Fachkonzept) zu modellieren? VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 46 Beziehungen zwischen Klassen/Objekten Überlegung: Wie ist nun der Zusammenhang zwischen dem Testprogramm und dem Objekt „Kfz“ (Fachkonzept) zu modellieren? VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Assoziation zwischen Klassen Quellen C.O. 47 Beziehungen zwischen Klassen/Objekten Überlegung: Wie ist nun der Zusammenhang zwischen dem Testprogramm und dem Objekt „Kfz“ (Fachkonzept) zu modellieren? VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Assoziation zwischen Klassen Quellen Eine Methode der Klasse nutzen: Auto1.erfassen a, b, c C.O. 48 Jetzt wird gerechnet! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Aufgabe: Für den Autoteilezubehörshop ist eine ähnliche Klasse wie bei dem vorherigen Beispiel festzulegen. Die Verkaufspreisberechnung funktioniert folgendermaßen: Der VK Preis (netto) ergibt sich aus dem Einkaufspreis multipliziert mit dem Kalkulationsfaktor (Prozentzahl). 49 Tipp Die Klasse: VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Option Explicit Private Artikelnummer As Integer Private Bezeichnung As String Private EK_Preis As Double Private K_Faktor As Double Sub erfassen(EkP As Double) Artikelnummer = 1234 Bezeichnung = "Sitzschoner" K_Faktor = 50 EK_Preis = EkP End Sub Function Ausgeben_Bezeichnung() Ausgeben_Bezeichnung = Bezeichnung End Function Function Ermitteln_VK_Preis() Ermitteln_VK_Preis = (EK_Preis * K_Faktor / 100) + EK_Preis End Function 50 Testprogramm VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Sub Testprg() Dim Autoz As Kfz_Zubehoer Dim bez As String Dim EP As Double Dim VkP As Double Set Autoz = New Kfz_Zubehoer EP = InputBox("Bitte Einkaufspreis eingeben: ") Autoz.erfassen EP MsgBox (Autoz.Ausgeben_Bezeichnung) MsgBox (Autoz.Ermitteln_VK_Preis) Set Auto1 = Nothing End Sub Quellen C.O. 51 Eigenschaftsprozeduren Die letzte Klassendefinition zeigt, dass es offensichtlich zwei „Sorten“ von Methoden gibt. Die eine „Sorte“ ist letztlich nur dafür da, den Objekteigen schaften Werte zuzuweisen oder diese Werte abzurufen: VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Sub erfassen(EkP As Double) ……………… Function Ausgeben_Bezeichnung() ……………… Die zweite „Sorte“ führt kompliziertere Dinge durch, hier die Berechnung eines neuen Wertes aus zwei Eigenschaften/Attributen der Klasse: Übungen COM Quellen C.O. Function Ermitteln_VK_Preis() Ermitteln_VK_Preis = (EK_Preis * K_Faktor / 100) + EK_Preis End Function 52 Eigenschaftsprozeduren VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Es erscheint sicher sinnvoll, diesen Unterschied in der Implementierung zu Ausdruck zu bringen. Dies erfolgt mit den Eigenschaftsprozeduren Property Let Property Get (Wert setzen) (Wert auslesen). Hierbei handelt es sich um eine Alternative zu den bisherigen Möglichkeiten, Attributwerte zu setzen oder zu lesen. Angesprochen ist also nur die erste „Sorte“ Methoden, für „Function Ermitteln_VK_Preis()“ bleibt alles so, wie bisher. 53 Eigenschaftsprozeduren VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Option Explicit Private mBezeichnung As String Private mEK_Preis As Double Private mK_Faktor As Double Public Property Let Artikelbezeichnung(Bez As String) mBezeichnung = Bez End Property Public Property Let Einkaufspreis(EkP As Double) mEK_Preis = EkP End Property Public Property Let K_Faktor(KF As Double) mK_Faktor = KF End Property Public Property Get Artikelbezeichnung() As String Artikelbezeichnung = mBezeichnung End Property Function Ermitteln_VK_Preis() Ermitteln_VK_Preis = (mEK_Preis * mK_Faktor / 100)+EK_Preis End Function 54 Das Testprogramm VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 55 Rabattberechnung VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. 56 Tilgungsplan VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Es ist ein Programm zu erstellen, welchen den Tilgungsplan eines Kredits ausgibt (Annuitätentilgung). Nach der Eingabe der Kredithöhe, des Zinssatzes, der jährlichen Rückzahlung und der Laufzeit soll eine Tabelle mit folgenden Angaben ausgegeben werden: Jahr Zins (in Euro) Tilgung Restkredit Wird eine Laufzeit < 1 oder größer 15 eingegeben, wird standardmäßig eine Laufzeit von 15 Jahren angenommen. Quellen C.O. 57 Exkurs: API Das Component Object Model (COM) muss im Zusammenhang mit dem Begriff API gesehen werden. VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM API (Abk. für "application programming interface") ist eine Schnittstelle für die Programmierung von Anwendungsprogrammen. Beispiele: - funktionsorientierte (z. B. Dynamic Link Library, DLL) - dateiorientierte (z. B. Gerätedateien unter UNIX) - objektorientierte (z. B. ActiveX-DLLs) - protokollorientierte (z. B. FTP) u.a. Quellen Viele Programmierer verwenden die allgemeine Abkürzung API zur Bezeichnung der speziellen Windows - API (auch WinAPI) => Verwirrung! C.O. 58 Windows - API • Systembibliotheken von Windows VBA & Objekte • Bereitstellung von Windows – Funktionen in VBA Daten&Grundstrukturen • Bietet damit eine beträchtliche Erweiterung des Sprache Modelle und Modellierung • Auf Bibliotheken verteilt KlassenObjekteBeziehungen Die wichtigsten Bibliotheken sind: Übungen COM Quellen Kernal32.dll (z. B. Funktion im I/O – Bereich, Dateisystem …) User32.dll (z. B.: Mauszeiger, Menüs …) GDI32.dll (z. B.: Grafik, Farbe …) C.O. 59 Windows - API VBA & Objekte Daten&Grundstrukturen Aufgabe: Modelle und Modellierung Es ist der Ordner des Windows-Systemverzeichnisses zu ermitteln. KlassenObjekteBeziehungen Hilfe: Aufruf der API – Funktion „GetWindowsDirectory“ Übungen Hinweis: Zur Kontrolle wurde das C-Laufwerk umbenannt. COM Quellen C.O. 60 Lösung Quellcode: Als Modul anlegen! VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Public Declare Lib "kernel32" ByVal lpBuffer ByVal nSize As Function GetWindowsDirectory _ Alias "GetWindowsDirectoryA" ( _ As String, _ Long) As Long Option Explicit Public Function GetWinDir() As String Dim strWinOrdner As String * 255 Dim lngLaenge As Long 'API-Funktion aufrufen: lngLaenge = GetWindowsDirectory(strWinOrdner, _ Len(strWinOrdner)) GetWinDir = Left(strWinOrdner, lngLaenge) End Function Wie zu erkennen ist, muss hinsichtlich der Parameter sehr „systemnah“ gearbeitet werden. …As string * 255: Zeichenkette mit fester Länge, Grund: Diese API ist in C programmiert. Testprozedur Sub Test_GetWinDir() MsgBox "Windows-Ordner: " & GetWinDir End Sub 61 Test VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Weitere Beispiele und Erklärungen, s. A. JANKA (Quellen) Quellen C.O. 62 Component Object Model VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Das Component Object Model (COM) erlaubt (u. a.) den objektorientierten Zugriff auf Computerdienste mit VBS/VBA. COM ist damit eine spezielle API. In diesem Zusammenhang ist unter Komponente eine compilierte Programmdatei zu verstehen, welche i. d. R. mehrere Klassen enthält. Damit werden die entsprechenden Objekte (z. B. unter VBS, aber auch unter C++, C#, Java oder VB) erzeugt, mit denen z. B. der Zugriff auf Funktionen des Betriebssystems Windows realisiert werden kann. Die folgenden Beispiele orientieren sich an D. JOHLEN (s. Quellen). C.O. 63 Das Dateisystem als Komponente VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen FileSystemObject File Drives Name DatelastModified parentFolder getFile(pfad):File moveFile(quellPfad, zielPfad) …………….. moveFile(zielPfad) …………….. Stark vereinfachte Klassenmodelle der COM – Komponente, die für das Dateisystem zuständig ist. COM Quellen C.O. Beispiel eines Anwendungsfalls: Eine Datei soll von einem Verzeichnis in ein anderes verschoben werden. Konkret: Die Datei „test1.txt“ im Verzeichnis c:\vz1\ soll in das Verzeichnis c:\vz2\ verschoben werden. 64 Das Dateisystem als Komponente VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen Z1 Z2 Z3 Z4 Set FSObjekt = CreateObject("Scripting.FileSystemObject") Set Datei = FSObjekt.getFile("h:\SE\test1.txt") Datei.move "h:\SX\" MsgBox "Dateien umkopiert!„ Z1: Erzeugung des Objektes „FSObjekt“ mit der Methode CreateObject. Als Schnittstellenparameter muss die Klasse „FileSystemObject“ aus dem Paket „Scripting“ angegeben werden. Z2: Erzeugen des Objektes „Datei“ durch das Senden der Nachricht „getFile“. Z3: Senden der Nachricht „move“ (inkl. Parameter) an das Objekt „Datei“. COM Quellen C.O. Sowohl für das Modellieren als auch für die Erklärung eines Programms ist diese verbale Ausdrucksweise „ungeschickt“. UML kennt neben den Klassendiagrammen noch viele weitere Modellierungstechniken. Eine Möglichkeite wird nun vorgestellt. 65 Sequenzdiagramm Beispiel: Zubehörshop des Autohauses Erklärung: VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen Das Sequenzdiagramm dient (u. a.) der Darstellung, wie Objekte Nachrichten austauschen. Es werden zeitliche Aspekt berücksichtigt. C.O. 66 Unser Beispiel Sequenzdiagramm für den Anwendungsfall „Datei verschieben“ VBA & Objekte (new) FileSystemObject Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen FSObjekt: getFile(…) Durch getFile wurde ein neues Objekt erzeugt! Datei: File Übungen COM move(…) Quellen Folge: Datei ist verschoben! C.O. 67 Wer hat wann zugegriffen? Nochmals zurück zur Klasse „File“: VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. File Name DatelastModified parentFolder moveFile(zielPfad) …………….. Aufgabe: Auf das Attribut DatelastModified kann direkt (ohne Methode) zugegriffen werden. Erstellen Sie bitte ein Programm, welches das Datum der letzten Änderung einer beliebigen Datei in einem beliebigen Verzeichnis ermittelt und ausgibt (das entsprechende Sequenzdiagramm bitte nicht vergessen). 68 Lösung der Aufgabe VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Set FSObjekt = CreateObject("Scripting.FileSystemObject") Set Ordner = FSObjekt.getFolder("c:\SE\") Set Dateien = Ordner.files Set Datei = Dateien.item("test1.txt") MsgBox "Datum des letzten Zugriffs: " & Datei.dateLastModified Übungen COM Quellen C.O. 69 Ein Tool zur Projektverwaltung Modelle und Modellierung Ein Programm erstellt eine HTML – Seite, in der alle Dateien eines Projekt-Verzeichnisses und das Datum des letzten Zugriffs angezeigt werden. KlassenObjekteBeziehungen Aufgabe: Beschreiben Sie bitte die notwendigen Lösungsschritte verbal. VBA & Objekte Daten&Grundstrukturen Übungen COM Quellen C.O. Tipp: Benötigt wird ein Dateisystem, ein Ordner mit Container, eine HTML – Datei, eine Schleife zum Lesen und Schreiben in die Datei… 70 Lösung: Verbal 1. Dateisystemobjekt erzeugen VBA & Objekte 2. Auf den Ordner zugreifen Daten&Grundstrukturen 3. Auf den Dateicontainer zugreifen Modelle und Modellierung 4. HTML - Datei anlegen KlassenObjekteBeziehungen 5. Eröffnungstags in HTML – Datei schreiben Übungen 6. Relevante Dateien im Dateicontainer suchen und schreiben (Schleife!) COM Quellen 7. Endtags schreiben 8. Datei schließen C.O. 71 Lösung: VBA - Code VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen COM Quellen C.O. Sub htme() 'Dateisystemobjekt erzeugen. Set projektFSO = CreateObject("Scripting.FileSystemObject") 'Auf den Quellordner zugreifen. Set projektOrdner = projektFSO.getFolder("c:\Projekt_VBA") 'Auf den Dateicontainer des Quellordners zugreifen. Set projektDateien = projektOrdner.Files 'Neue index.html Datei anlegen Set projektHTML = projektFSO.CreateTextFile("c:\Projekt_VBAindex.html") 'HTML Eröffnungstags projektHTML.writeLine projektHTML.writeLine projektHTML.writeLine projektHTML.writeLine "<HTML>" "<h1> Projektordner " & projektOrdner.Name & "</h1>" "<hr>" "<BODY>" For Each datei In projektDateien projektHTML.writeLine "<P> <A href=" & datei.Name & ">" & datei.Name & " </A> , zuletzt geändert: " & datei.datelastmodified & " </P> " projektHTML.writeLine "<hr>" Next ' HTML Endtags projektHTML.writeLine "</BODY>" projektHTML.writeLine "</HTML>" projektHTML.Close MsgBox "HTML File erzeugt." End Sub 72 Quellen VBA & Objekte Daten&Grundstrukturen Modelle und Modellierung KlassenObjekteBeziehungen Übungen HELD, B. (2000): EXCEL-VBA-Programmierung. - München, Mark und Technik-Verlag JANKA, A. (2005): VBA mit Word. – Bonn, Galileo Computing – Verlag JOHLEN, D. (2004): Anwendungsentwicklung.- Holland + Josenhans-Verlag COM Quellen C.O. MARTIN, R. (1999): VBA mit Office 2000 lernen. – Bonn, Addison-Wesley – Verlag 73