Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Tabelle aus Access in Excel importieren

Begonnen von -Rockbiest-, April 20, 2015, 13:55:16

⏪ vorheriges - nächstes ⏩

-Rockbiest-

Hallo ich will diverse Spalten aus einer Access-Tabelle in eine vordefinierte Excel-Tabelle einfügen per Knopfdruck.
Das funktioniert bisher nicht. Lediglich die Datei findet er und öffnet diese, befüllt aber die Daten nicht. Ich hoffe mir kann jemand helfen.


Option Compare Database
Option Explicit

'Hierfür Microsoft Excel 15.0 library unter Verweise aktivieren
Private Sub cmd_kundenliste_inexcel_Click()

    Dim objExcel As Excel.Application
    Dim objWorkbook As Excel.Workbook
    Dim objSheet As Excel.Sheets
    Dim objRange As Excel.Range

    On Error Resume Next

    Set objExcel = GetObject(, "Excel.Application")
    If Err.Number = 429 Then
        Set objExcel = CreateObject("Excel.Application")
    End If

    objWorkbook = objExcel.Workbooks.Open("C:\Users\XXXXX\Desktop\XXXXXXX\Kundenliste_export")
   
    Set objRange = objSheet.Cells(2, 1).Resize(200, 12)
     

    Dim db As DAO.Database
    Dim rst As DAO.Recordset
   
    Dim kunden_id As Integer
    Dim kunden_nr As String
    Dim herr_frau As String
    Dim kunden_name As String
    Dim kunden_vorname As String
    Dim kunden_strasse As String
    Dim kunden_plz As String
    Dim kunden_stadt As String
    Dim kunden_land As String
    Dim kunden_telefon As String
    Dim kunden_fax As String
    Dim kunden_mobil As String
    Dim kunden_mail As String
   
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT kunde_id FROM tbl_kunden", dbOpenDynaset, dbSeeChanges)
    Debug.Print "rst"
   
    Dim i As Integer
    i = 0
   
   
    Do While Not rst.EOF

    Set kunden_nr = dao_loopup("kunde_nummer", "tbl_kunden", "kunde_id=" & Me!rst)
    Set herr_frau = dao_loopup("kunde_geschlecht", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_name = dao_loopup("kunde_kunde_unt_nachname", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_vorname = dao_loopup("kunde_vorname", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_strasse = dao_loopup("kunde_strasse_und_nr", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_plz = dao_loopup("kunde_plz", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_stadt = dao_loopup("kunde_stadt", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_land = dao_loopup("kunde_land", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_telefon = dao_loopup("kunde_tel", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_fax = dao_loopup("kunde_fax", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_mobil = dao_loopup("kunde_mobil", "tbl_kunden", "kunde_id=" & Me!rst)
    Set kunden_mail = dao_loopup("kunde_mail", "tbl_kunden", "kunde_id=" & Me!rst)
   

    With objWorksheet
        .Cells(2 + i, 1) = "kunden_nr"
        .Cells(2 + i, 2) = "herr_frau"
        .Cells(2 + i, 3) = "kunden_name"
        .Cells(2 + i, 4) = "kunden_vorname"
        .Cells(2 + i, 5) = "kunden_strasse"
        .Cells(2 + i, 6) = "kunden_plz"
        .Cells(2 + i, 7) = "kunden_stadt"
        .Cells(2 + i, 8) = "kunden_land"
        .Cells(2 + i, 9) = "kunden_telefon"
        .Cells(2 + i, 10) = "kunden_fax"
        .Cells(2 + i, 11) = "kunden_mobil"
        .Cells(2 + i, 12) = "kunden_email"

    i = i + 1

    rst.MoveNext
    Loop

    End With
    objExcel.Visible = True
End Sub


Das befüllen soll in der zweiten Zeile beginnen, da in der ersten Zeile die Überschriften stehen. i steht drin um jeweils zur nächsten Zeile zu springen entsprechend dem nächsten rst-Datensatz.

Das Programm stört sich jedoch direkt am "Set objRange = objSheet.Cells(2, 1).Resize(200, 12)" --> explizit am .Cells....


kann jemand helfen?



MaggieMay

#1
Hi,

nenne doch bitte auch gleich noch den Wortlaut der Fehlermeldung dazu.

PS:
Die Variable objSheet ist zu dem Zeitpunkt nicht initialisiert und kann daher nicht verwendet werden.

PPS:
Aber das ist ja nicht der einzige Fehler. Später heißt es "objWorksheet" was ebensowenig initialisiert ist. Auch der Umgang mit dem Recordset geht so nicht, was soll das "Me" davor?! An die Kunden-ID kommst du bspw. mit rst(0).

Und anstelle der zahlreichen "dao_loopup's" kannst du doch die benötigten Felder direkt in der Abfrage auslesen.

Und am Ende schreibst du dann lauter Konstanten in die Zellen und keine Variablen!
Freundliche Grüße
MaggieMay

-Rockbiest-

Ööööööhm :D
Doch so viele Fehler, mhm... also erst einmal zur Fehlermeldung

"Fehler beim Kompilieren
Methode oder Datenobjekt nicht gefunden"

Das mit dem rst(0) ist soweit klar.
Alles weitere ist mir gerade ein wenig zu hoch :-/

objRange = ?
objWorksheet = ?

Bin noch ein Newbie :P
Ein kleiner Tipp vielleicht noch :)

Wie würde denn das statt des dao aussehen?

MaggieMay

Ein "kleiner Tipp" wird vermutlich nicht reichen, probiere es mal mit diesem Code:
Private Sub cmd_kundenliste2excel_Click()
    Dim rst As DAO.Recordset
    Dim objExcel As Excel.Application
    Dim objWorkbook As Excel.Workbook
    Dim strSQL As String
    Dim i As Integer
On Error Resume Next

    Set objExcel = GetObject(, "Excel.Application")
    If Err.Number = 429 Then
        Set objExcel = CreateObject("Excel.Application")
    End If
    Set objWorkbook = objExcel.Workbooks.Open("C:\Users\XXXXX\Desktop\XXXXXXX\Kundenliste_export")
   
    strSQL = "SELECT kunde_id, kunde_nummer, kunde_geschlecht, kunde_kunde_unt_nachname, " & _
                              "kunde_vorname, kunde_strasse_und_nr, kunde_plz, kunde_stadt, kunde_land, " & _
                              "kunde_tel, kunde_fax, kunde_mobil, kunde_mail " & _
                  "FROM tbl_kunden"
    Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    Do While Not rst.EOF
        With objWorkbook.Sheets(1)
            .Cells(2 + i, 1) = rst(1)
            .Cells(2 + i, 2) = rst(2)
            .Cells(2 + i, 3) = rst(3)
            .Cells(2 + i, 4) = rst(4)
            .Cells(2 + i, 5) = rst(5)
            .Cells(2 + i, 6) = rst(6)
            .Cells(2 + i, 7) = rst(7)
            .Cells(2 + i, 8) = rst(8)
            .Cells(2 + i, 9) = rst(9)
            .Cells(2 + i, 10) = rst(10)
            .Cells(2 + i, 11) = rst(11)
            .Cells(2 + i, 12) = rst(12)
            i = i + 1
        End With
        rst.MoveNext
    Loop
    rst.Close
    objExcel.Visible = True
    Set objExcel = Nothing
End Sub

Beachte dabei, dass ich den Button umbenannt habe.
Freundliche Grüße
MaggieMay

-Rockbiest-

Die Logik habe ich soweit verstanden und übernommen.
Und es hat super funktioniert :)
Vielen lieben Dank.

Nur noch eine Kleinigkeit um es auch für die Zukunft besser nachzuvollziehen:
rst(1) - rst(12) bezieht sich auf die Reihenfolge der Attribute in strSQL, richtig?

Danke danke danke :)

MaggieMay

Zitatrichtig?
Ja, so ist es, es war mir einfach zu lästig, all die langen Feldnamen noch einmal zu schreiben (bzw. zu kopieren). ;-)
Freundliche Grüße
MaggieMay

daolix

Wenn die Reihenfolge der Feldnamen in sql mit der in der Exceltab übereinstimmen, so sollte aber auch ein CopyFromRecordset reichen. Das Loopen entfällt, auch ist es schneller als jede Zellen einzeln zu beschreiben.

-Rockbiest-

In weiterem Vorgehen ist mir leider noch etwas aufgefallen:
Wie müsste ich den Code umschreiben, wenn ich die Attribute aus zwei verschiedenen Tabellen in Access ziehen würde, um sie in eine Excel-Tabelle zu schreiben.
Verknüpft sind die Tabellen miteinander.

MaggieMay

Das ist kein Problem, du musst einfach nur die Abfrage erweitern.

Wenn dir das leichter fällt, erstelle die Abfrage mit den beiden Tabellen und den benötigten Datenfeldern im Entwurfsfenster, wechsle dann in die SQL-Ansicht und kopiere den Code ins VBA-Fenster, wo du ihn nur noch in einen String zu verpacken brauchst.
Freundliche Grüße
MaggieMay