Access Daten in Excel exportieren über ein selbst geschriebenes Programm

  • Access

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Cyver.

    Access Daten in Excel exportieren über ein selbst geschriebenes Programm

    Hallo Leute,

    ich versuche gerade Daten von einer Access-Datei(.accdb) in eine Excel-Datei(.xlsx) zu exportieren. Leider scheiter ich gerade daran. Ich habe es zurzeit so gemacht das er einfach die Daten ausliest und dann in eine Excel-Datei rein schreibt. Jedoch dauert das bei vielen Daten und Tabellen schon paar Sekunden. Jetzt versuche ich per VB die Funktionen in Access zu nutzen. Leider habe ich es zur zeit nur geschafft Access zu starten. Weiter komme ich leider nicht. Alles was ich in google gefunden habe, hat mir nicht geholfen ( docmd.~ ). Könnte mir da einer weiter helfen?


    Visual Basic-Quellcode

    1. Dim MSACCESS As New Access.Application MSACCESS.OpenCurrentDatabase("D:\Database1.accdb")



    Danke schonmal im voraus
    MFG
    Cyver

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cyver“ () aus folgendem Grund: Überschrift missverständlich gewählt

    Es gibt 2 Möglichkeiten.
    Die Frage ist:
    Wie groß ist die MdB sprich Tabellen und Anzahl der Inhalte
    Und brauchst du wirklich alle Tabellen in einer Excel gleichzeitig?

    1. Möglichkeit ist, dass was ich annehme, du schon gemacht hast. Eine datenbankanbindung über Excel. So dass er dir in eine Tabelle eine angegebene Tabelle aus der MdB ausließt.

    2. Möglichkeit.
    Spezifisch über einen Button bestimmte Daten herauszuholen und diese in Tabellen zusammen zufassen oder mit auswahlkriterien einfach auszulesen.


    Die 1. Variante sollte sich über das Menü erledigen lassen.
    Die 2. Variante benötigt einen Eintrag unter extra Verweise, da kannst du eine ADODB (glaube die war das) aktivieren und im Code deklarieren, es wird eine Art SQL Abfrage generiert, die eine spezifische Tabelle deiner MdB anspricht und über eine eof Schleife die Datensätze in die gewünschten Spalten setzt.

    Edit:
    Beschreibung folgt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „tulla“ ()

    Hier ist ein Beispiel wie die die MdB ansprichtst und Daten ausließt.

    Visual Basic-Quellcode

    1. Dim cn As New ADODB.Connection
    2. Dim rs As New ADODB.Recordset
    3. dim zeahler as integer
    4. zeahler = 1
    5. Private Sub CommandButtin1_Click()
    6. cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= X:\DeinOrdner\DeineAccessDatei.mdb"
    7. Set rs = cn.Execute("SELECT Spaltenname FROM DIETABELLE") ' Sollte deine Tabelle Leerzeichen besitzen musst Eckige Klammern drum setzen [Tabelle mit Leerzeichen]
    8. Do While Not rs.EOF
    9. 'Bedingte Abfrage
    10. if IsNull(rs.Fields("Spalte1")) then ' Wenn die Zeile in Spalte 1 nicht leer ist, wird die folgende IF Anweisung ausgeführt.
    11. worksheets("Tabelle1").Cells(zaehler,1).value = rs.Fields("Spalte1") ' Hier wird der Wert aus der Accesstabelle Spalte1 in die Excel Tabelle1 geschrieben
    12. 'Es ist Möglich eine Formatierung für die ExcelZelle bereits beim einlesen mitzugeben Beispiel wäre hier ein Datum dann würde die vorstehende Zeile um dies erweitert werden
    13. ':worksheets("Tabelle1").Cells(zaehler,1.value).NumberFormat="dd.mm.yyyy"
    14. zeahler= zeahler +1 ' Zeilenzähler
    15. end if
    16. rs.movenext 'Datensatzzähler für die nächste Zeile in der Accesstabelle
    17. loop
    18. cn.close 'Sehr wichtig, dass die DB Anfrage auch wieder geschlossen wird.


    Ich denke ich sollte alles haben.
    In der Theorie ist die 2. Variante die selbe wie ich es aktuell habe nur, dass ich es nicht über ein Recordset mache. Was ist denn die Besonderheit an einem Recordset?

    Hier mal meine Aktuelle Variante

    Visual Basic-Quellcode

    1. Imports System.Data.OleDb
    2. Private Sub btn_Export_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Export.Click
    3. Dim con As New OleDbConnection
    4. Dim cmd As New OleDbCommand
    5. Dim reader As OleDbDataReader
    6. Dim MSEXCEL As New Excel.Application
    7. MSEXCEL.Worksheets().Add()
    8. DirectCast(MSEXCEL.Sheets(1), Excel.Worksheet).Name = "ExportTabelle"
    9. MSEXCEL.Range("A:A").NumberFormat = "0000"
    10. MSEXCEL.Range("A1").Activate()
    11. MSEXCEL.ActiveCell.Value = "Überschrift Spalte1"
    12. MSEXCEL.Range("B1").Activate()
    13. MSEXCEL.ActiveCell.Value = "Überschrift Spalte2"
    14. MSEXCEL.Range("C1").Activate()
    15. MSEXCEL.ActiveCell.Value = "Überschrift Spalte3"
    16. con.ConnectionString =
    17. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    18. "Data Source=D:\Database1.accdb"
    19. con.Open()
    20. Try
    21. cmd.CommandText = "SELECT * FROM Artikel order by ID asc;"
    22. reader = cmd.ExecuteReader()
    23. Do While reader.Read()
    24. counter += 1
    25. MSEXCEL.Range("A" & counter).Activate()
    26. MSEXCEL.ActiveCell.Value = reader("Spalte1")
    27. MSEXCEL.Range("B" & counter).Activate()
    28. MSEXCEL.ActiveCell.Value = reader("Spalte2")
    29. MSEXCEL.Range("C" & counter).Activate()
    30. MSEXCEL.ActiveCell.Value = reader("Spalte3")
    31. Loop
    32. counter = 1
    33. reader.Close()
    34. DirectCast(MSEXCEL.Sheets(n), Excel.Worksheet).Delete()
    35. MSEXCEL.Visible = False
    36. MSEXCEL.ActiveWorkbook.SaveAs(Filename:="C:\Export_" & Dateiname & ".xlsx")
    37. MSEXCEL.Workbooks("Export_" & Dateiname & ".xlsx").Activate()
    38. MSEXCEL.Workbooks.Close()
    39. MSEXCEL.Quit()
    40. MSEXCEL = Nothing
    41. Catch ex As Exception
    42. MessageBox.Show(ex.Message)
    43. End Try
    44. con.Close()


    ich habe es mal gekürzt und hoffe ich habe nichts vergessen


    aber meine Frage war, sorry wenn ich mich falsch ausgedrückt habe, ob es ne möglichkeit gibt, die Funktion "Export to Excel" in Access, über VB zu steuern bzw zu nutzen?


    kleine Infos noch zu deinem Quelltext. Es funktioniert an sich gut, nur musste ich kleinigkeiten ändern, da "IsNull" nicht mehr bei VB 2010 gibt.

    Visual Basic-Quellcode

    1. If IsNull(rs.Fields("Spalte1")) Then 'bei mir ging es nur mit IsReference(rs.Fields("Spalte1"))

    Visual Basic-Quellcode

    1. worksheets("Tabelle1").Cells(zaehler, 1).value = rs.Fields("Spalte1")) 'MSExcel.Range("A" & zeahler).Activate() MSExcel.ActiveCell.Value = rs.Fields("Spalte1")


    Mfg
    Cyver

    petaod schrieb:

    Zitat von »Cyver«



    ob es ne möglichkeit gibt, die Funktion "Export to Excel" in Access, über VB zu steuern bzw zu nutzen
    DoCmd
    DoCmd.OutputTo

    Cyver schrieb:


    Alles was ich in google gefunden habe, hat mir nicht geholfen ( docmd.~ ). Könnte mir da einer weiter helfen?
    könntest du es mir bitte genauer schreiben? ich habe vieles im netz gefunden mit docmd...nur nichts funktioniert oder ich mache was falsch...und bitte an VB 2010 anpassen(wenn möglich) da wohl viel von älteren versionen zu finden ist, die nicht funktionieren

    Visual Basic-Quellcode

    1. DoCmd.OutputTo acOutputTable, "DerNameDeinerTabelle", acFormatXLS, "DerNameDeinerExcelDatei.xls"
    Das Beispiel ist nahezu 1:1 aus dem oben verlinkten MSDN-Artikel.
    Wo ist jetzt das Problem ?(
    Aah:
    bitte an VB 2010 anpassen

    Visual Basic-Quellcode

    1. MSACCESS.DoCmd.OutputTo(acOutputTable, "DerNameDeinerTabelle", acFormatXLS, "DerNameDeinerExcelDatei.xls")
    War das jetzt schwer?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    das Problem ist, dass es nicht 1:1 geht. Sobald ich das einfüge kommen sofort 3 Fehler.



    Fehler 1 "OutputTo" ist mehrdeutig, da in interface "Microsoft.Office.Interop.Access.DoCmd" mehrere Arten von Membern mit diesem Namen vorhanden sind.

    Fehler 2 "acOutputTable" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.

    Fehler 3 "acFormatXLS" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
    Du sprachst von Excel und Access, beider verfügen nicht über vb2010 runtimes sondern nur vba(visualbasic for Applications).
    Wenn du jetzt noch nen vb2010 Programm dafür schreiben willst, trägst die Kirche ums Dorf!

    Mach nen macro mit der Abhandlung wie du die accesstabelle in Excel exportierst unrund Schau es dir im Detail an...
    Dann kannst im Excel nen Button machen in dem du die Access.mdb aufrufst und das. Macro startest.

    tulla schrieb:

    Dann kannst im Excel nen Button machen in dem du die Access.mdb aufrufst und das. Macro startest.
    die Sache ist nur das mein Programm nichts mit Excel bzw Access zu tun hat, außer das er wenn man auf den Export-Button klickt die Daten von Access(wo der User kein zugriff hat) in ein Excel-Arbeitsblatt bekommen soll um die Daten für sich selbst übersichtlicher machen kann:wacko:

    sehe gerade auch das die Überschrift bissl. ungünstig gewählt worden ist :rolleyes:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cyver“ () aus folgendem Grund: nachtrag

    Cyver schrieb:

    "OutputTo" ist mehrdeutig, da in interface "Microsoft.Office.Interop.Access.DoCmd" mehrere Arten von Membern mit diesem Namen vorhanden sind.
    Dann nimm halt die IDE zu Hilfe und such dir den passenden Member raus.
    Ich gehe davon aus, dass das verschiedene Überladungen sind, die bei richtiger Parametrierung von selbst eindeutig werden.

    Cyver schrieb:

    "acOutputTable" wurde nicht deklariert.
    "acFormatXLS" wurde nicht deklariert
    Da gibts sicher eine Definition im Interop.Access-Namespace
    Object Browser ist dein Freund.
    Ansonsten:

    Visual Basic-Quellcode

    1. Const acFormaltXLS = "Microsoft Excel (*.xls)"
    2. Const acOutputTable = 3
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    soo...

    Visual Basic-Quellcode

    1. MSACCESS.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport, Access.AcSpreadSheetType.acSpreadsheetTypeExcel8, TableName:="Tabelle1", FileName:="C:\test")


    gibt es eine Möglichkeit mehrere Tabellen in eine Excel-Tabelle zu speichern?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cyver“ () aus folgendem Grund: Neue Problematik

    Cyver schrieb:

    gibt es eine Möglichkeit mehrere Tabellen in eine Excel-Tabelle zu speichern?
    Dazu schreibt Microsoft:
    If the file name is the same as the name of an existing spreadsheet, Microsoft Access replaces the existing spreadsheet, unless you're exporting to a Microsoft Excel version 5.0, 7.0, 8.0 or Excel 2000 workbook. In that case, Microsoft Access copies the exported data to the next available new worksheet in the workbook.
    Ich würde interpretieren, dass bis Format "Excel 97-2003" (also alles, was mit .xls endet) ein neues Tabellenblatt in einem bestehenden Workbook angelegt werden kann.
    Probier's aus!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Alles Klar danke :)

    Visual Basic-Quellcode

    1. MSACCESS.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport, Access.AcSpreadSheetType.acSpreadsheetTypeExcel9, TableName:="Tabelle1", FileName:="C:\Test")MSACCESS.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport, Access.AcSpreadSheetType.acSpreadsheetTypeExcel9, TableName:="Tabelle2", FileName:="C:\Test")



    so geht das :) somit ist es erledigt :) für jeden den es interessiert der "gesamte" code :P

    Visual Basic-Quellcode

    1. Dim MSACCESS As New Access.Application
    2. Try
    3. MSACCESS.Visible = False
    4. MSACCESS.OpenCurrentDatabase("D:\Database1.accdb")
    5. MSACCESS.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport, Access.AcSpreadSheetType.acSpreadsheetTypeExcel9, TableName:="Tabelle1", FileName:="C:\Test")
    6. MSACCESS.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport, Access.AcSpreadSheetType.acSpreadsheetTypeExcel9, TableName:="Tabelle2", FileName:="C:\Test")
    7. MSACCESS.Quit()
    8. MSACCESS = Nothing
    9. Catch ex As Exception
    10. End Try

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cyver“ ()