Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2001.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Export nach Excel

Autor: Manfred Hoffbauer, Düsseldorf

Eine häufige Anforderung an die Datenbank Microsoft Access besteht darin, die gespeicherten Daten auch unter Excel zur Verfügung zu stellen. Excel eignet sich hervorragend für Auswertungen und Diagramme, die ad hoc am Bildschirm erstellt werden. Hier kann auch der Anwender ohne Programmierfahrung mit entsprechender Fachkenntnis schnell zu überzeugenden Ergebnissen kommen.

Unterschiedliche Export-Methoden

Export ganz schnell

Aber wie gelangen die Daten aus der Datenbank in ein Arbeitsblatt? Die einfachste Variante bietet das Office-Symbol von Microsoft Access. Um die Daten einer Tabelle oder Abfrage an Excel zu übergeben, gehen Sie wie folgt vor:

  • Aktivieren Sie das Datenbankfenster.
  • Markieren Sie die Tabelle oder Abfrage, deren Daten Sie exportieren wollen.
  • Klicken Sie in der Symbolleiste auf den nach unten zeigenden Pfeil neben dem Symbol Office-Verknüpfungen (s. Abb. 1)
  • Wählen Sie Analysieren mit MS Excel aus der Liste des Symbols.
  • Der weitere Ablauf erfolgt automatisch: Access exportiert die Daten in eine .xls-Datei und öffnet diese mit der Version von Microsoft Excel, die auf Ihrem PC als Standard für .xls-Dateien definiert ist.

    Vor- und Nachteile des Office-Symbols

    Der Vorteil dieser Vorgehensweise liegt auf der Hand: Die gesamte Abwicklung mit Excel übernimmt Access selbständig. Es ist also wirklich keine Programmierung erforderlich. Die Programmfunktion zum Exportieren nach Excel steht sofort nach der Installation von Microsoft Access zur Verfügung.

    Abb. 2: So sehen die Artikeldaten im Excel-Arbeitsblatt aus.

    Für das Erstellen der Abbildungen wurde die Artikeltabelle der Nordwind-Datenbank nach Excel 2000 exportiert. Hier fällt ein weiterer Vorteil des Office-Symbols auf: Das entstehende Arbeitsblatt erhält automatisch auch einige Formatierungen, die beispielsweise die Überschriftenzeile besonders hervorheben (s. Abb. 2).

    Ein weiterer Vorteil des Office-Symbols führt gleichzeitig zu einem triftigen Nachteil: Access hält sich beim Excel-Export an die Programmfunktion von Excel 5.0 als kleinsten gemeinsamen Nenner. Das ist vermutlich der Grund dafür, dass generell nur Texte mit einer Länge von bis zu 255 Zeichen exportiert werden können. Insbesondere beim Export von Memofeldern tritt das Problem auf, das Excel darüber hinausgehende Texte einfach abschneidet.

    Bestimmte Formatierungen von Zahlenwerten (z.B. Währungssymbole), Hyperlinks und Zeilenumbrüchen in Textfeldern gehen ebenfalls beim Export verloren oder werden fehlerhaft umgewandelt. So wandelt Excel einige Zahlen in Texte um und das führt dazu, dass Excel mit diesen Werten nicht rechnen kann.

    Die genannten Probleme lassen sich allesamt lösen, erfordern jedoch ein wenig Programmieraufwand. Die folgenden Abschnitte beschreiben die erforderlichen Lösungsansätze.

    Export automatisch

    Wie bei Access nicht anders zu erwarten, können Sie die Programmfunktion zum Export nach Excel auch in VBA benutzen. Um dies an einem einfachen Beispiel nachvollziehen zu können, öffnen Sie die Nordwind-Datenbank oder die Beispieldatenbank ExportToExcel.mdb.

    Abfrage entwerfen

    Mit einer Abfrage stellen Sie die zu exportierenden Daten zusammen. Sie können entweder eine eigene Abfrage entwerfen oder die Abfrage qryBestellungenUndKunden aus der Beispieldatenbank zu diesem Beitrag verwenden (s. Abb. 3).

    Fügen Sie der Abfrage alle Felder hinzu, die Sie exportieren möchten. Definieren Sie auch die Kriterien, mit denen Sie die zum Export vorgesehenen Datensätze selektieren. Um das VBA-Programm für den Export zu entwerfen, gehen Sie wie folgt vor:

  • Öffnen Sie die Entwurfsansicht eines beliebigen Formulars.
  • Legen Sie auf dem Formular eine neue Befehlsschaltfläche an.
  • Öffnen Sie das Eigenschaftenfenster für die Schaltfläche.
  • Klicken Sie auf das Editor-Symbol der Eigenschaft Bild.
  • Wählen Sie aus der sich öffnenden Übersicht der Symbole den Eintrag Ausgabe an MS Excel.
  • Als Ergebnis dieser Schritte erhalten Sie eine Befehlsschaltfläche (s. Abb. 4). Das Bild der Schaltfläche gleicht dem des Office-Symbols für den Export nach Excel. Um die Schaltfläche zu programmieren, gehen Sie wie folgt vor:

  • Klicken Sie die Schaltfläche mit der rechten Maustaste an, und wählen Sie Ereignis aus dem Kontextmenü.
  • Wählen Sie den Eintrag Code-Generator aus der Liste der Generatoren.
  • Geben Sie die beiden folgenden Programmzeilen ein:
  • DoCmd.OpenQuery _
        "qryBestellungenUndKunden"

    DoCmd.RunCommand acCmdOutputToExcel

    Mit den genannten Schritten haben Sie die Ereignisprozedur für das BeimKlicken-Ereignis der Schaltfläche vollständig definiert. In der Formularansicht können Sie das Ergebnis Ihrer Arbeit überprüfen und die Schaltfläche anklicken (s. Abb. 5). Access öffnet daraufhin das Datenblatt der Abfrage qryBestellungenUndKunden und exportiert die Daten nach Excel. Der Export hat die gleichen Vor- und Nachteile wie die Verwendung des Office-Symbols.

    Export in eine Datei

    Die beiden bisher beschriebenen Methoden führen zu dem gleichen Ergebnis: Access exportiert die Daten in eine Excel-Datei und öffnet diese mit Excel. Die entstehende Datei enthält auch einige Formatierungen, die automatisch übertragen werden.

    Das Generieren der Formatierungen ist zwar komfortabel, benötigt aber Zeit. Wenn Sie große Datenmengen an Excel weitergeben wollen, dann sollten Sie stattdessen die TransferText- oder die TransferSpreadSheet-Methode verwenden. Beide Methoden stehen als VBA-Befehl und als Makroaktion zur Verfügung.

    Export als .csv-Datei

    Mit der TransferText-Methode können Sie die Daten beispielsweise in eine .csv-Datei exportieren. .csv-Dateien enthalten für jeden Datensatz eine eigene Textzeile.

    Die Felder des Datensatzes sind durch Semikola getrennt. Textfelder sind durch doppelte Anführungszeichen eingeklammert.

    Der folgende Befehl exportiert die Daten der Abfrage qryBestellungenUndKunden in die Textdatei Bestellungen.csv:

    DoCmd.TransferText acExportDelim, "", _
        "qryBestellungenUndKunden", _
        "C:\bestellungen.txt", True, ""

    Der Vorteil von .csv-Dateien besteht darin, dass Sie aus reinem Text bestehen. Sie können Sie also auch mit einem Editor wie Notepad öffnen und ansehen (s. Abb. 6).

    Export als XLS-Datei

    Für den Export in eine Datei mit dem Format von Excel-Dateien hält Access einen eigenen Befehl bereit. Die folgende VBA-Anweisung exportiert die Daten der Abfrage qryBestellungenUndKunden in die .xls-Datei Bestellungen.xls:

    DoCmd.TransferSpreadsheet acExport, _
        8, "qryBestellungenUndKunden", _
        "C:\Bestellungen.xls", True, ""

    Der Vorteil dieser Methode besteht darin, dass Sie die .xls-Datei ohne Konvertierung direkt mit Excel öffnen können. Mit dem zweiten Parameter, der im Beispiel den Wert 8 hat, geben Sie übrigens die Excel-Version an, deren Dateiformat der Export verwenden soll. Die 8 steht für acSpreadsheetTypeExcel8, was dem Dateiformat von Excel 2000 entspricht.

    Vor- und Nachteile von .csv- und
    .xls-Dateien

    .csv- und .xls-Dateien sind aufgrund der guten Performance beim Erzeugen der Dateien insbesondere für den Austausch großer Datenmengen sehr gut geeignet. Da .csv-Dateien wirklich nur die reinen Daten (zwar als Text- und nicht als Binärdaten) enthalten, benötigen sie außerdem vergleichsweise wenig Speicherplatz.

    Der größte Nachteil besteht darin, dass Sie keine Formatierungen an Excel übergeben können. So lassen sich beispielsweise Zahlenwerte nicht ohne weiteres auch direkt mit dem Währungssymbol in Excel formatieren. Die Tätigkeit des Formatierens muss der Anwender nach jedem Datenexport selbst vornehmen.

    Export mit Automatisierung

    Die optisch ansprechendste und gleichzeitig langsamste Methode zum Export von Daten nach Excel ist die Verwendung der Automatisierung (ehemals: OLE-Automation). Mit dieser Methode können Sie die Daten einer Tabelle oder Abfrage sozusagen zellenweise in ein Excel-Arbeitsblatt übertragen.

    Da Sie bei der Automatisierung auf alle Excel-Methoden und -Eigenschaften zugreifen können, stehen Ihnen bei der Formatierung des Arbeitsblatts alle Möglichkeiten von Excel zur Verfügung. Aber auch der Nachteil dieser Methode soll an dieser Stelle nicht verschwiegen werden:

    Um alle Möglichkeiten ausschöpfen zu können, müssen Sie praktisch jeden einzelnen Schritt mit VBA programmieren. Der Preis für die Vielfalt an Möglichkeiten besteht also in einem vergleichsweise hohen Programmieraufwand. Außerdem ist die OLE-Automation die langsamste Methode zur Übertragung von Daten nach Excel.

    Anlegen einer Befehlsschaltfläche

    Als Grundlage für den Datenexport dient die Abfrage qryBestellungenUndKunden aus der Beispieldatenbank zu diesem Beitrag. Die Datenbank enthält das Formular frmBestellungenFiltern, mit dem sich Bestellungen filtern und als Liste anzeigen lassen. Das Formular enthält die Schaltfläche btnExportToExcel mit der Bitmap MS Excel als Symbol. Bei einem Klick auf die Schaltfläche führt Access die Prozedur aus Quellcode 1 aus.

    Die Ereignisprozedur fragt mit Me.Filter den Filter des aktuellen Formulars ab und speichert ihn in der String-Variablen sFilter. Die folgende If-Anweisung prüft, ob überhaupt ein Filter definiert ist. Falls nein, fragt die MsgBox-Funktion, ob der Anwender alle Datensätze an Excel übergeben möchte. Wenn der Anwender diese Frage mit einem Klick auf die Schaltfläche Nein beantwortet, beendet die Exit Sub-Anweisung die Prozedur. Andernfalls speichert Access die folgende SQL-Anweisung als Datenquelle für den Datenexport:

    SELECT * FROM qryBestellungenUndKunden

    Wenn das Formular einen Filter hat, soll dieser auch für den Datenexport verwendet werden. In diesem Fall fügt Access den gesamten Ausdruck einfach als Where-Klausel an die Select-Anweisung an. Wenn der Anwender die Bestellungen beispielsweise nach Alfreds Futterkiste gefiltert hat, führt der Ausdruck

    sSQL = "SELECT * FROM qryBestellungenUndKunden WHERE " & sFilter

    zu folgendender Select-Anweisung:

    SELECT * FROM qryBestellungenUndKunden WHERE [Kunden-Code] = "ANTON"

    Private Sub btnExportToExcel_Click()

        Dim sFilter As String

        Dim sSQL As String

        sFilter = Me.Filter

        If Len(Nz(sFilter)) = 0 Then

            If MsgBox("Wollen Sie alle Datensätze exportieren?", vbYesNo, _
                "Kein Filter definiert.") = vbNo Then

                Exit Sub

            Else

                ' Datenquelle für alle Datensätze definieren

                sSQL = "SELECT * FROM qryBestellungenUndKunden"

            End If

        Else

            ' Datenquelle mit Filter definieren

            sSQL = "SELECT * FROM qryBestellungenUndKunden WHERE " & sFilter

        End If

    Ob nun mit oder ohne Filter: Die Ereignisprozedur speichert die SQL-Anweisung in der String-Variablen sSQL. Für den weiteren Ablauf ist aber eine Abfrage als Datenquelle für den Export erforderlich.

    Aus diesem Grund weisen die folgenden Anweisungen die SELECT-Anweisung der SQL-Eigenschaft eines QueryDefs-Objekts zu. Da das QueryDefs-Objekt nicht jedes Mal neu generiert wird, muss es vor Aufruf der Prozedur bereits in der aktuellen Datenbank enthalten sein. Dabei genügt es allerdings, irgendeine Auswahlabfrage als Rahmen unter dem Namen qryExportToExcel zu speichern.

    Dim dbs As Database

    Set dbs = CurrentDb

    dbs.QueryDefs("qryExportToExcel").SQL _
        = sSQL

    dbs.QueryDefs("qryExportToExcel").Close

    ExportQueryToExcel

    Den Abschluss der Ereignisprozedur bildet der Aufruf der Prozedur ExportQueryToExcel. Diese Prozedur ist im Modul modExcelTransfer der Beispieldatenbank enthalten und führt den Export der Daten nach Excel durch.

    Einen Namen für die neue
    Excel-Datei ermitteln

    Die erste Aufgabe der Prozedur ExportQueryToExcel besteht darin, einen Namen für die neue Excel-Datei zu ermitteln. Dies geschieht durch einen Aufruf der Funktion ExcelDateiNameErmitteln( ), die einen Dateinamen inklusive Pfad als Funktionsparameter zurückgibt. Aber nach welchen Regeln wird der neue Name gebildet? Die Funktion ermittelt zunächst mit GetDBPath( ) den Pfad des aktuellen Projektes. Der Pfad wird um den Dateinamen ergänzt, der sich aus dem Text Bestellungen, dem aktuellen Tagesdatum im Format JJJJMMTT, einer dreistelligen fortlaufenden Nummer und der Erweiterung .xls zusammensetzt.. Das Listing aus Quellcode 2 zeigt die Funktion im Detail.

    Public Function ExcelDateiNameErmitteln() As String

        Dim sDateiname As String

        sDateiname = GetDBPath() & "\Bestellungen" & Format(Date, "yyyymmdd")

        Dim sTestname As String

        Dim i As Integer

        i = 0

        Dim lDateiVorhanden As Boolean

        lDateiVorhanden = True

        ' Ende, wenn bereits 1.000 Dateien an diesen angelegt wurden.

        While lDateiVorhanden And i <= 999

            sTestname = sDateiname & Format(i, "000") & ".xls"

            If Not FileExists(sTestname) Then

                lDateiVorhanden = False

                sDateiname = sTestname

            End If

            i = i + 1

        Wend

        If Not lDateiVorhanden Then

            ExcelDateiNameErmitteln = sDateiname

        End If

    End Function

    Quellcode 2

    Damit keine Datei unbeabsichtigt überschrieben wird, überprüft die Funktion auch die vorhandenen Dateien. Wenn sich die Beispieldatenbank im Verzeichnis C:\ExportToExcel befindet, liefert die Funktion beim ersten Aufruf den Dateinamen

    C:\ExportToExcel\
    Bestellungen20010706000.xls

    und wenn diese Datei bereits angelegt ist, den folgenden Dateinamen:

    C:\ExportToExcel\
    Bestellungen20010706001.xls

    Da die Vergabe der fortlaufenden Nummer auf drei Stellen begrenzt ist, lautet der höchste Dateiname:

    C:\ExportToExcel\
    Bestellungen20010706999.xls

    Dieser Wert wird erst überschritten, wenn mehr als 999 Dateien an einem Tag angelegt werden. Falls Sie an diese Grenze stoßen sollten, können Sie die Anzahl der Stellen in der Format-Funktion und in der While-Anweisung erhöhen.

    Der Aufruf der Funktion ExcelDateiNameErmitteln erfolgt aus der Prozedur ExportToExcel heraus mit den Anweisungen aus Quellcode 3.

    Für den Fall, dass die Funktion keinen gültigen Dateinamen ermitteln kann, bricht Access die Ausführung der Prozedur ExportToExcel mit Exit Sub ab.

    Excel starten

    strExcelDatei = ExcelDateiNameErmitteln()

    If Len(strExcelDatei) = 0 Then

        MsgBox "Es konnte kein Dateiname für die Excel-Datei ermittelt werden. Bitte " _
        & "löschen Sie nicht mehr benötigte Dateien aus dem Verzeichnis.", vbCritical, _
        sAppname

        Exit Sub

    End If

    Dim ExcelSheet As Object

    'Überprüfen, ob Excel gestartet werden muss.

    If IstExcelGestartet() Then

        Set ExcelSheet = GetObject(, "Excel.Application")    ' Excel war schon gestartet

    Else

        Set ExcelSheet = CreateObject("Excel.Application")   ' Excel starten

    End If

    ' Anstehende Ereignisse des Betriebssystems verarbeiten lassen.

    DoEvents

    ' Überprüfen, ob das Excel-Objekt erfolgreich instanziert wurde.

    If ExcelSheet Is Nothing Then

        MsgBox "Das Excel-Objekt konnte nicht erstellt werden.", vbCritical, sAppname

        Exit Sub

    End If

    Um auf die Eigenschaften und Methoden von Excel zugreifen zu können, müssen Sie zuerst ein Objekt definieren und ihm eine Excel-Instanz zuweisen. Der VBA-Code aus Quellcode 4 führt diese Aufgabe durch.

    In der If-Anweisung wird die Funktion IstExcelGestartet( ) aufgerufen. Falls diese Funktion den Wert True liefert, erhält das Objekt ExcelSheet einen Verweis auf die laufenden Excel-Applikation. Andernfalls erzeugt die CreateObject( )-Funktion ein neues Excel-Objekt und liefert gleichzeitig den Verweis darauf als Funktionswert zurück.

    In jedem Fall kann nach der Ausführung einer der beiden Funktionen davon ausgegangen werden, dass die Objekt-Variable ExcelSheet auf eine laufende Excel-Applikation verweist. Zur Sicherheit wird mit den Anweisungen aus Quellcode 5 noch einmal überprüft, ob der Vorgang auch wirklich erfolgreich abgeschlossen werden konnte.

    Falls das Excel-Objekt nicht erzeugt werden konnte, trifft die Bedingung Is Nothing zu. Dieser Fall kann beispielsweise dann eintreten, wenn Excel auf dem PC nicht installiert ist.

    Überprüfen, ob Excel gestartet ist

    Aber wie kann die Funktion IstExcelGestartet überhaupt feststellen, ob Excel gestartet ist? Die Prüfung erfolgt - wie der Programmcode aus Quellcode 6 zeigt - durch den Aufruf der GetObject-Funktion in Kombination mit einer On Error Resume Next-Anweisung.

    Mit der Set-Anweisung wird der Objektvariablen obj eine Referenz auf eine Excel-Applikation zugewiesen. Falls Excel zu diesem Zeitpunkt nicht gestartet sein sollte, dann führt die Set-Anweisung zu einem Fehler und in der Folge auch zum Programmabbruch.

    Public Function IstExcelGestartet() As Boolean

        ' Stellt fest, ob Excel gerade geladen ist

        Dim obj As Object

        On Error Resume Next

        ' Prüfen, ob Excel-Objekt instanziert werden kann.

        Set obj = GetObject(, "Excel.Application")

        IstExcelGestartet = (Err.Number = 0)

        Set obj = Nothing

    End Function

    ' Excel mit Hilfe des Application-Objekts bereitstellen

    ExcelSheet.Application.Visible = True

    Const xlMinimized = -4140

    Const xlNormal = -4143

    If ExcelSheet.WindowState = xlMinimized Then

        ExcelSheet.WindowState = xlNormal

    End If

    ' Neues Workbook hinzufügen

    ExcelSheet.workbooks.Add

    ' Das Excel-Sheet speichern

    ExcelSheet.ActiveWorkbook.SaveAs Filename:=strExcelDatei

    If ExcelSheet.workbooks.Count = 0 Then

        MsgBox "Momentan ist keine Excel-Mappe geöffnet.", _
            vbCritical, sAppname

        Exit Sub

    End If

    Die On Error Resume Next-Anweisung verhindert jedoch den Programmabbruch und führt dazu, dass die auf Set folgende Anweisung in jedem Falls ausgeführt wird. Diese Anweisung ermittelt nun anhand der aktuellen Fehlernummer, ob das Excel-Objekt erfolgreich zugewiesen werden konnte. Falls kein Fehler aufgetreten ist, ist Excel bereits gestartet und die Funktion liefert den Wert True zurück.

    Eine Excel-Arbeits-mappe öffnen

    Die Objektvariable ExcelSheet enthält eine Referenz auf die laufende Excel-Applikation. Mit ihr können Sie nun auf alle Eigenschaften und Methoden von Excel zugreifen. Bei der Programmierung verwenden Sie prinzipiell die gleiche Punktnotation wie in Access. Die Anweisungen aus Quellcode 7 machen die Excel-Applikation sichtbar und bringen das Fenster auf Normalgröße.

    Da das Excel-Fenster von Windows in den Vordergrund gestellt wird, können Sie bei einem Test der Prozedur den weiteren Ablauf direkt am Bildschirm verfolgen und beobachten, wie die folgenden Anweisungen (s. Quellcode 8) ein neues Excel-Arbeitsblatt anlegen und es auf der Festplatte speichern. Als Dateiname wird hier der von der Funktion ExcelDateiNameErmitteln ermittelte Name verwendet.

    Die If-Anweisung überprüft den Erfolg der Aktion. Falls Excel das Arbeitsblatt nicht anlegen konnte, liefert die Count-Eigenschaft des Workbook-Objekts den Wert 0. Access zeigt dann eine Fehlermeldung auf dem Bildschirm an und beendet die Prozedur ExportQueryToExcel.

    Feldnamen in Kopfzeile
    schreiben

    Nachdem nun alle Vorbereitungen abgeschlossen sind, kann die Datenübertragung endlich beginnen. Die erste Aufgabenstellung ist die Übertragung der Feldnamen in die erste Zeile des Excel-Arbeitsblatts. Die Feldnamen dienen als Überschriften und werden später auch als solche formatiert.

        Set dbs = CurrentDb()

        Set rDaten = dbs.OpenRecordset("qryExportToExcel")

        rDaten.MoveFirst

        ' Feldnamen in Kopfzeile schreiben

        Dim iSpalte As Integer

        Dim iZeile As Integer

        iZeile = 1

        For iSpalte = 0 To dbs.QueryDefs("qryExportToExcel").Fields.Count - 1

            vCellValue = dbs.QueryDefs("qryExportToExcel").Fields(iSpalte).Name

            ExcelSheet.ActiveSheet.Cells(iZeile, iSpalte + 1).Value = vCellValue

        Next iSpalte

    ' Daten übertragen

    iZeile = 2

    While Not rDaten.EOF

        For iSpalte = 0 To dbs.QueryDefs("qryExportToExcel").Fields.Count - 1

            If rDaten.Fields(iSpalte).Name = "Homepage" Or rDaten.Fields(iSpalte).Name = _
                "E-Mail" Then

                ' Adresse des Hyperlink-Feldes ermitteln

                vCellValue = HyperlinkPart(Nz(rDaten.Fields(iSpalte)), acAddress)

                ' Hyperlink in Excel einfügen

                ExcelSheet.ActiveSheet.Hyperlinks.Add Anchor:=ExcelSheet. _

                    ActiveSheet.Cells(iZeile, iSpalte + 1), Address:=vCellValue

            Else

                ' ASCII 13,10 durch ASCII 10 ersetzen

                vCellValue = Replace(Nz(rDaten.Fields(iSpalte).Value), vbCrLf, vbLf)

                ExcelSheet.ActiveSheet.Cells(iZeile, iSpalte + 1).Value = vCellValue

            End If

        Next iSpalte

        iZeile = iZeile + 1

        rDaten.MoveNext

    Wend   ' Daten übertragen

    Der Zugriff auf die zuvor definierte Abfrage qryExportToExcel erfolgt über das DAO-Recordset rDaten. Die Anweisung rDaten.MoveFirst positioniert den Datensatzzeiger auf den ersten Datensatz des Recordsets (s. Quellcode 9).

    Mit der Fields-Auflistung des QueryDefs-Objekts greifen Sie direkt auf die Feldnamen der Abfrage zu. Die For Next-Schleife (s. Quellcode 10) durchläuft die gesamte Auflistung, liefert also die Ordinalnummern aller Felder beginnend bei 0.

    Der mit Fields(iSpalte).Name ermittelte Name einer Spalte wird zunächst in der Variablen vCellValue zwischengespeichert (s. Quellcode 11). In der darauffolgenden Anweisung gibt

    Sheet.ActiveSheet.Cells(iZeile, iSpalte + 1).Value

    zunächst die durch Zeilennummer und Spaltennummer identifizierte Zelle des Excel-Arbeitsblatts an (s. Abb. 7). Hier ist darauf zu achten, dass die Nummerierung bei Excel mit 1 beginnt. Die in iSpalte hinterlegte Spaltennummer darf deshalb nur mit dem Offset 1 verwendet werden.

    Datensätze übertragen

    Auf die Übertragung der Feldnamen erfolgt die Übertragung der einzelnen Datensätze. Da das Recordset rDaten weiter oben schon mit MoveFirst auf den ersten Datensatz positioniert wurde, kann es direkt mit einer While-Schleife losgehen. Access durchläuft den Schleifenrumpf für jeden Datensatz der Abfrage qryExportToExcel einmal.

    Innerhalb der Leseschleife durchläuft eine zweite Schleife alle Felder des Datensatzes. Diese zweite Schleife ist wegen der Besonderheiten der Felder E-Mail und Hyperlink erforderlich.

    Besonderheiten für E-Mail- und Hyperlink-Felder

    In der Beispieldatenbank haben die Felder E-Mail und Hyperlink den Datentyp Hyperlink. Durch das einfache Zuweisen der Feldwerte in ein Excel-Arbeitsblatt werden zwar die Web- und E-Mail-Adressen übertragen, aber leider nur als Text.

    Als besonderen Komfort können Sie Excel aber veranlassen, die übertragenen Texte auch direkt als Hyperlinks zu interpretieren. Das hat den Vorteil, dass der Excel-Anwender die Hyperlinks nur anzuklicken braucht, um eine Web-Seite mit dem Standardbrowser zu öffnen oder um eine Mail mit dem Standard-Mailprogramm zu versenden.

    Damit das Ganze funktioniert, wird auf der Access-Seite mit

    vCellValue = HyperlinkPart(Nz(rDaten. _
        Fields(iSpalte)), acAddress)

    die eigentliche Adresse aus dem Hyperlink-Feld extrahiert und in der Variablen vCellValue gespeichert. Bei der Zuweisung des Werts an eine Excel-Zelle kommt eine weitere Funktion zum Einsatz, die aber diesmal aus dem Sprachvorrat von Excel stammt. Mit Hyperlink.Add fügen Sie in Excel ein neues Hyperlink-Feld hinzu. Mit Anchor spezifizieren Sie die Zelle für den Hyperlink und mit Adresse die eigentliche Web- oder Mail-Adresse.

    ExcelSheet.ActiveSheet.Hyperlinks.Add _
        Anchor:=ExcelSheet.ActiveSheet. _
        Cells(iZeile, iSpalte + 1), _
        Address:=vCellValue

    Diese Anweisung fügt den Wert von vCellValue im Excel-Arbeitsblatt als Hyperlink ein. Wenn der Anwender den Hyperlink später anklickt, startet Excel die Standardanwendung (in der Regel Internet Explorer oder Microsoft Outlook) für den Hyperlink (s. Abb. 8).

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Excel-Daten importieren mit TransferSpreadsheet

    Excel automatisieren

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.