VBA (Visual Basic for Application) Austausch von Daten
File - Dialogbox... ist in der Office 2000-Version erstmalig implementiert.... hat folgende Typen: msofiledialogfilepicker, um Dateien auszuwählen. msofiledialogfolgerpicker, um Verzeichnisse auszuwählen. msofiledialogopen, um Dateien auszuwählen und zu öffnen. Dieser Typ wird nicht von Access 2007 unterstützt. msofiledialogsaveas, um Dateien auszuwählen und zu speichern. Dieser Typ wird nicht von Access 2007 unterstützt.... benötigen einen Verweis auf die Microsoft Office xx Library. Dialogboxen können auch mit Hilfe der Windows API erstellt werden. OpenOffice Folie 2 Access 2007 VBA 06.03.08 Seite 2
Objektvariable deklarieren Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Die Objektvariable hat den Datentyp Office.FileDialog. Die Objektvariable bekommt ein Verweis auf eine Dialogbox zur Auswahl von Dateien übergeben. OpenOffice Folie 3 Access 2007 VBA 06.03.08 Seite 3
Aussehen der Dialogbox Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd.title = "Datei für die Anlage auswählen".buttonname = "Auswählen" End With Beschriftung des OK- Buttons. Bezeichnung in der Titelleiste der Dialogbox. OpenOffice Folie 4 Access 2007 VBA 06.03.08 Seite 4
Dateiauswahl beeinflussen Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd.allowmultiselect = False.InitialFileName = "C:\" Mehrfachauswahl von Dateien?.InitialView = msofiledialogviewlist End With Wie werden die Dateien und Ordner in dem Dialogfenster angezeigt? OpenOffice Folie 5 Access 2007 VBA 06.03.08 Seite 5
Einstellungen für.initialview msofiledialogviewsmallicon zeigt den Dateinamen und ein kleines Icon an. msofiledialogviewlist zeigt die Dateien als Liste an. msofiledialogdetails zeigt die Dateinamen, Größe etc. an. msofiledialogthumbnail zeigt die Dateien als Vorschaubilder an. Weitere Möglichkeiten werden in einer Liste zur Auswahl angezeigt. OpenOffice Folie 6 Access 2007 VBA 06.03.08 Seite 6
.InitialFileName... legt das Standardverzeichnis für das Dialogfenster fest.... nutzt als Standardeinstellung einen Dateinamen. In dem Dateinamen können folgende Platzhalter genutzt werden: "C:\chart?.txt". Das Fragezeichen ersetzt ein beliebiges Zeichen. "C:\cha*.txt". Das Sternchen ersetzt ein beliebige Anzahl von Zeichen. OpenOffice Folie 7 Access 2007 VBA 06.03.08 Seite 7
Dateien filtern Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd.filters.clear Das Kombinationsfeld Dateityp am unteren Rand des Dialogfenster wird geleert..filters.add "PDF-Dokumente", "*.pdf; *.PDF", 1.Filters.Add "JPEG-Bild", "*.jpg, *.jpeg", 2.Filters.Add "Alle Dateien", "*.*", 3.FilterIndex = 1 End With Standardauswahl im Kombinationsfeld. Welche Dateitypen werden in dem Kombinationsfeld angezeigt? Der Liste Dateityp werden die verschiedenen Elemente hinzugefügt. OpenOffice Folie 8 Access 2007 VBA 06.03.08 Seite 8
Dialogbox anzeigen Dim fd As Office.FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd If.Show = True Then Mit Hilfe der Methode Show wird das Dialogfenster angezeigt. Wenn der OK-Button gedrückt ist, wird true zurückgeliefert.. End If End With For Each element In.SelectedItems choosedatei = element Exit Function Next Die Auflistung enthält alle, in dem Dialogfenster markierten Dateien. OpenOffice Folie 9 Access 2007 VBA 06.03.08 Seite 9
PDF-Dateien anzeigen Private Sub cmdopen_click() Dim pfad As String pfad = attachtext.value Call ShellExecute(Me.hWnd, "open", _ pfad, "", "", SW_NORMAL) End Sub ShellExceute... ist eine API (Application programming interface)-funktion.... entspricht einem Doppelklick auf eine Datei. Falls das Anwendungsprogamm Acrobat Reader oder Acrobat auf dem Zielrechner installiert ist, wird die Datei geöffnet. OpenOffice Folie 10 Access 2007 VBA 06.03.08 Seite 10
Windows API A(pplication) P(rogrammers) I(nterface)... ist eine Funktionsbibliothek, die aus vielen DLLs (Dynamic Link Libraries) besteht. DLLs... sind Schnittstellen zu Systemfunktionen von Windows.... können von mehreren Anwendungen gleichzeitig genutzt werden. Bevor Funktionen aus der Windows API genutzt werden können, muss die API-Funktion deklariert werden. Informationen zur Windows API befindet sich im Windows SDK (http://msdn.microsoft.com/en-us/library/aa383750.aspx) Eine Referenz der Funktionen finden Sie als Referenz auf der Webseite http://www.vbarchiv.net/api/index.php. Ein Tool zur Anzeige der Funktionen finden Sie unter http://www.activevb.de/rubriken/apiviewer/index-apiviewer.html OpenOffice Folie 11 Access 2007 VBA 06.03.08 Seite 11
Deklaration der API-Funktion Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" () As Long In Standardmodulen werden API-Funktionen immer als öffentliche Funktionen deklariert. In Klassenmodulen werden sie privat deklariert. Dem Schlüsselwort Declare Function folgt der Funktionsname. Der Name muss korrekt geschrieben werden. Es wird Gross- und Kleinschreibung beachtet. Dem Schlüsselwort Lib folgt der DLL-Name. Pfadangaben werden nicht benötigt. Wenn der Funktionsname von dem DLL-Namen abweicht, muss ein Alias- Name gesetzt werden. Ein Alias-Name wird auch genutzt, wenn der Name der Funktion in VBA vorhanden ist. OpenOffice Folie 12 Access 2007 VBA 06.03.08 Seite 12
Argumente der ShellExecute-Funktion Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( ByVal hwnd As Long,_ ByVal lpoperation As String, _ ByVal lpfile As String, _ ByVal lpparameters As String, _ ByVal lpdirectory As String, _ ByVal nshowcmd As Long) As Long OpenOffice Folie 13 Access 2007 VBA 06.03.08 Seite 13
Erläuterung ByVal hwnd As Long beschreibt das Handle des aufrufenden Fensters. Ein Handle ist ein positive Ganzzahl, die Windows für die Identifizierung eines Objekts nutzt. ByVal lpoperation As String beschreibt welche Operation ausgeführt werden soll. Beispielsweise "print" für den Ausdruck oder "open" für das Öffnen einer Datei in dem damit verbundenen Anwendungsprogramm. ByVal lpfile As String enthält den Verzeichnis- oder Dateinamen, welches zum Beispiel mit dem entsprechenden Anwendungsprogramm geöffnet werden soll. ByVal lpparameters As String kann optional Aufruf-Parameter für das Anwendungsprogramm enthalten. ByVal lpdirectory As String legt das Arbeitsverzeichnis fest. ByVal nshowcmd As Long legt mit Hilfe einer Konstanten das Verhalten des Anwendungsfensters fest. OpenOffice Folie 14 Access 2007 VBA 06.03.08 Seite 14
Konstanten für das Verhalten der Anwendung Public Const SW_HIDE = 0 Public Const SW_MAXIMIZE = 3 Public Const SW_MINIMIZE = 6 Public Const SW_NORMAL = 1 Public Const SW_RESTORE = 9 Public Const SW_SHOWMAXIMIZED = 3 Public Const SW_SHOWMINIMIZED = 2 Public Const SW_SHOWMINNOACTIVE = 7 Public Const SW_SHOWNOACTIVATE = 4 OpenOffice Folie 15 Access 2007 VBA 06.03.08 Seite 15
Rückgabewert untersuchen Private Sub cmdopen_click() Dim pfad As String Dim result As Long pfad = attachtext.value result = ShellExecute(Me.hWnd, "open", _ pfad, "", "", SW_NORMAL) Select Case result Case SE_ERR_NOASSOC MsgBox "Keine Verbindung zu einer Anwendung" Case SE_ERR_PNF MsgBox "Pfad wurde nicht gefunden"" Case SE_ERR_FNF MsgBox "Datei wurde nicht gefunden" End Select End Sub OpenOffice Folie 16 Access 2007 VBA 06.03.08 Seite 16
Hinweise Wenn kein Fehler auftritt, wird das Handle des geöffneten Anwendungsprogramms zurückgegeben. Wenn ein Wert von 0 zurückgeben wird, reichen die Systemressourcen zur Ausführung der API-Funktion nicht aus. Andere Rückgabewert beschreiben meist einen Fehler. OpenOffice Folie 17 Access 2007 VBA 06.03.08 Seite 17
Daten nach Excel transferien Sub exporttransfer() Dim strsql As String Dim qry As QueryDef Dim pfad As String End Sub Err.Clear On Error GoTo errmeldung strsql = "SELECT umsatz, quartal, jahr FROM tblbezirkumsatz" strsql = strsql & " WHERE bezirk = " & lstbezirk.value Set qry = CurrentDb.CreateQueryDef("BezirkUmsatz", strsql) pfad = Application.CurrentProject.Path & "\umsatz.xls" DoCmd.TransferSpreadsheet acexport, acspreadsheettypeexcel9,_ "BezirkUmsatz", pfad, True OpenOffice Folie 18 Access 2007 VBA 06.03.08 Seite 18
Abfrage erzeugen strsql = "SELECT umdatz, quartal, jahr FROM tblbezirkumsatz" strsql = strsql & " WHERE bezirk = " & lstbezirk.value Set qry = CurrentDb.CreateQueryDef("BezirkUmsatz", strsql) Mit Hilfe von CreateQueryDefs wird eine Abfrage in der aktuellen Datenbank erzeugt. Als erster Parameter wird der Methode eine Bezeichnung übergeben. Unter diesen Namen wird die Abfrage im Navigationsfenster angezeigt. Als zweiter Parameter wird eine SQL-Anweisung übergeben. Falls die Abfrage vorhanden ist, wird die Fehlernummer 3012 gesendet. Der Fehler kann folgendermaßen behoben werden: Die Abfrage mit Hilfe der Anweisung DoCmd.DeleteObject acquery, "BezirkUmsatz" gelöscht. Mit Hilfe von CurrentDb.QueryDefs("BezirkUmsatz").SQL wird die Datenquelle der Abfrage an die Auswahl des Listenfeldes angepasst werden. OpenOffice Folie 19 Access 2007 VBA 06.03.08 Seite 19
Daten transferieren DoCmd.TransferSpreadsheet acexport, _ acspreadsheettypeexcel9,_ Wie werden die Daten transferiert. Hier werden die Daten exportiert. In welches Format werden die Daten transferiert? "BezirkUmsatz", pfad, True Spaltenüberschriften der Abfrage werden übernommen. Welche Daten sollen wohin transferiert werden? OpenOffice Folie 20 Access 2007 VBA 06.03.08 Seite 20
Excel öffnen Dim xlapp As Excel.Application Set xlapp = CreateObject("Excel.Application") xlapp.visible = True xlapp.quit Set xlapp = Nothing Voraussetzung: Excel ist auf dem Zielrechner vorhanden. Mit Hilfe von Extras Verweise ist der Verweis Microsoft Excel 12.0 Object Library aktiviert. Mit Hilfe von CreateObject wird ein Verweis auf eine Excel-Anwendung erzeugt. Mit Hilfe der Eigenschaft.Visible wird die Anwendung eingeblendet. Mit Hilfe der Methode.Quit wird die Anwendung geschlossen. OpenOffice Folie 21 Access 2007 VBA 06.03.08 Seite 21
Neue Arbeitsmappe anlegen Dim xlworkbook As Excel.Workbook pfad = Application.CurrentProject.Path & "\umsatz.xlsx" Set xlworkbook = xlapp.workbooks.add xlworkbook.saveas pfad Set xlworkbook = Nothing Workbooks enthält alle Arbeitsmappen einer geöffneten Excel- Anwendung. Mit Hilfe von.add wird der Auflistung eine neue Arbeitsmappe hinzugefügt. Mit Hilfe von.saveas wird die Arbeitsmappe unter einem Namen in einem bestimmten Verzeichnis gespeichert. Mit Hilfe von.save werden Änderungen an der aktiven Arbeitsmappe gespeichert. OpenOffice Folie 22 Access 2007 VBA 06.03.08 Seite 22
Arbeitsmappe öffnen Dim xlworkbook As Excel.Workbook pfad = Application.CurrentProject.Path & "\umsatz.xlsx" If Dir(pfad) <> "" Then Set xlworkbook = xlapp.workbooks.open(pfad) End If Mit Hilfe der Funktion Dir() wird überprüft, ob eine Datei in dem angegebenen Verzeichnis vorhanden ist. Falls die Datei vorhanden ist, wird die Bezeichnung zurückgeliefert, andernfalls ein leerer String. xlapp.workbooks.open(pfad) öffnet die Excel-Datei und fügt sie der Auflistung hinzu. OpenOffice Folie 23 Access 2007 VBA 06.03.08 Seite 23
Arbeitsblätter Dim xlsheet As Excel.Worksheet Set xlsheet = xlworkbook.sheets(1) xlsheet.name = strsheetname Worksheet bezeichnet ein Arbeitsblatt in einer Excel-Datei (Arbeitsmappe). Die Auflistung.Sheets enthält alle in einer Arbeitsmappe vorhandenen Arbeitsblätter..Name hat als Wert die Bezeichnung des Arbeitsblattes. Standardmäßig hat ein Arbeitsblatt den Namen Tabelle und eine Nummer von 1 bis n. Jeder Name beschreibt eindeutig ein Arbeitsblatt. Jede Arbeitsmappe hat mindestens ein Arbeitsblatt. OpenOffice Folie 24 Access 2007 VBA 06.03.08 Seite 24
Arbeitsblätter hinzufügen With xlworkbook Set xlsheet01 =.Sheets.Add Set xlsheet02 =.Sheets.Add(Before:=.Worksheets(.Worksheets.Count)) Set xlsheet03 =.Sheets.Add(After:=.Worksheets("Tabelle1"))) End With Mit Hilfe von.add wird ein neues Arbeitsblatt hinter dem aktiven Arbeitsblatt eingefügt. Mit Hilfe dem Parameter Before kann ein Arbeitsblatt vor einem anderen Blatt eingefügt werden. Hier wird das Arbeitsblatt vor dem letzten Arbeitsblatt eingefügt. Mit Hilfe dem Parameter After kann ein Arbeitsblatt nach einem anderen Blatt eingefügt werden. Hier wird das Arbeitsblatt nach dem Arbeitsblatt Tabelle1 eingefügt. OpenOffice Folie 25 Access 2007 VBA 06.03.08 Seite 25
Daten einfügen xlsheet.cells.copyfromrecordset rs xlsheet.range("a2").copyfromrecordset rs Die Daten des Recordsets werden in ein Arbeitsblatt von Excel kopiert. Cells beschreibt immer eine bestimmte Zelle. Wenn keine Angaben zur Spalte und Zeile gemacht wird, wird Cells(1, 1); A1 als Ausgangspunkt angenommen. Die Daten werden, beginnend in der linken, oberen Ecke, eingefügt. Range kann eine Zelle, ein Zellbereich, eine Spalte oder eine Zeile sein. In diesem Beispiel wird eine Zelle angegeben, ab der die Daten eingefügt werden sollen. Mit Hilfe von Range(Cells(Zeile, Spalte), Cells(Zeile, Spalte) wird ein Zellbereich festgelegt. Zuerst wird die linke, obere Ecke des Zellbereichs definiert und anschließend die rechte, untere Ecke. OpenOffice Folie 26 Access 2007 VBA 06.03.08 Seite 26
Kopfzeilen einfügen For count = 0 To rs.fields.count - 1 xlsheet.cells(1, count + 1).Value = rs.fields(count).name Next count Cells(zeile, spalte) identifiziert eindeutig eine Zelle..Value enthält den Wert der Zelle. In diese Zelle wird die Spaltenüberschrift aus dem Recordset eingetragen. OpenOffice Folie 27 Access 2007 VBA 06.03.08 Seite 27
Formatierungen Schriften: xlsheet.range("a2").font.name legt die Schriftart fest. xlsheet.range("a2").font.size legt die Größe fest. Fettschrift etc. kann mit Hilfe von boolschen Werten gesetzt werden. Rahmen: xlsheet.range("a2").borders(typ) legt fest, welcher Rahmen formatiert werden soll..borders(xledgeright) formatiert den rechten Rahmen..LineStyle,.Weight und.color legt das Aussehen des Rahmens fest..numberformat formatiert Zahlen in einer bestimmten Art und Weise..NumberFormat = "yyyy" interpretiert die Zahlen als vierstellige Jahreszahl..NumberFormat = "@" interpretiert die Zahlen als Text..NumberFormat = "#.##0,00 " interpretiert die Zahlen als Währung. In diesem Fall wird das Euro-Zeichen genutzt. Die Zahl besteht aus mindestens einer Ziffer vor dem Komma und zwei Nachkommastellen. Ein Tausender- Zeichen wird angegeben. OpenOffice Folie 28 Access 2007 VBA 06.03.08 Seite 28
Word öffnen Dim wdapp As Word.Application Set wdapp = CreateObject("Word.Application") wdapp.visible = True wdapp.quit Set wdapp = Nothing Voraussetzung: Word ist auf dem Zielrechner vorhanden. Mit Hilfe von Extras Verweise ist der Verweis Microsoft Word 12.0 Object Library aktiviert. Mit Hilfe von CreateObject wird ein Verweis auf die Word-Anwendung erzeugt. Die Anwendung wird versteckt geöffnet. Mit Hilfe der Eigenschaft.Visible wird die Anwendung eingeblendet. Mit Hilfe der Methode.Quit wird die Anwendung geschlossen. OpenOffice Folie 29 Access 2007 VBA 06.03.08 Seite 29
Neue Dokument anlegen Dim wddoc As Word.Document Set wddoc = wdapp.documents.add(template:=pathtemplate, _ Visible:=True) wdapp.visible = True wddoc.close Set wddoc = Nothing Documents enthält alle geöffneten Dokumente und Vorlagen in Word. Mit Hilfe von Documents.Add wird ein neues Dokument der Auflistung hinzugefügt. Standardmäßig wird die Vorlage (Template) Normal genutzt. Mit Hilfe des Parameters Visible wird das neue Dokument in angezeigt. Falls eine Vorlage gespeichert werden soll, wird der Parameter NewTemplate auf True gesetzt..close schließt das Dokument. OpenOffice Folie 30 Access 2007 VBA 06.03.08 Seite 30
Neue Dokument anlegen Dim wddoc As Word.Document Set wddoc = wdapp.documents.add(template:=pathtemplate, _ Visible:=True) wddoc.saveas FileName:=pathBrief wddoc.close Set wddoc = Nothing.SaveAs speichert ein Word-Dokument unter einem neuen Namen. Es können Angaben zum Format des Textes gemacht werden. Zum Beispiel FileFormat:=wdFormatRTF speichert den Text im RTF-Format. Das Dokument kann mit einem Passwort zum Lesen oder Ändern des Dokuments versehen werden..save speichert die Änderungen eines Dokuments. OpenOffice Folie 31 Access 2007 VBA 06.03.08 Seite 31
Mit Textmarken arbeiten Dim wdrange As Word.Range If wddoc.bookmarks.exists("markadress") Then Set wdrange = wddoc.bookmarks("markadress").range wdrange.text = "RRZN" & vbcrlf & "Schloßwender Str. 5" End If Die Auflistung Bookmarks enthält alle Textmarken, die in einem Word- Dokument existieren. Die Methode.Exists liefert True, wenn die angegebene Textmarke existiert. OpenOffice Folie 32 Access 2007 VBA 06.03.08 Seite 32
Selection oder Range.Selection... ist immer nur einmal in einem Word-Dokument vorhanden.... repräsentiert die aktuelle Markierung von Text. Falls kein Text oder Objekt ausgewählt ist, bezieht sich.selection auf die Einfügemarke..Range... stellt immer den Bereich dar, der bearbeitet werden soll.... kann beliebig oft in einem Word-Dokument vorkommen. Die Größe wird durch eine Start- und Endposition festgelegt.... kann nur durch die Einfügemarke definiert werden. Mit Hilfe der Eigenschaft.Text... kann vorhandener Text innerhalb des gewählten Bereichs ersetzt werden.... Text an einer bestimmten Position eingefügt werden. OpenOffice Folie 33 Access 2007 VBA 06.03.08 Seite 33