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?
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!
Öööööö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?
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.
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 :)
Zitatrichtig?
Ja, so ist es, es war mir einfach zu lästig, all die langen Feldnamen noch einmal zu schreiben (bzw. zu kopieren). ;-)
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.
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.
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.