Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: atropos am Mai 08, 2017, 18:22:25

Titel: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 08, 2017, 18:22:25
Moin zusammen

bin ja schon lange nicht mehr hier gewesen... Habe aber gerade ein Problem und hoffe Ihr könnt mir helfen:

Ich muss für einen Kunden einen Report in eine Exceldatei generieren. Hierzu nutze ich MS Office 2010 und die Excel Klasse 14.0 Obect Lib sowie DAO Recordset.

    Dim rField As DAO.Field
    Dim xWbk As Excel.Workbook
    Dim xSht As Excel.Worksheet
    Dim xApp As Object
    Dim sFile$, sSaveAs$, sSQL$
    Dim lRow As Long, lColumn As Long
    Dim dOffEUR As Double
    Dim dOnEUR As Double
    Dim dOnEGP As Double
   
    While fIsAppRunning("Excel") = True
        Set xApp = GetObject(, "Excel.Application")
        xApp.Quit
        Set xApp = Nothing
    Wend
   
    sSQL = "SELECT ... FROM SAG_02_CALC ... GROUP BY;"

    Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)
   
    sFile = "\\ham-s001\t\Template\Forecast.xlsx"
    sSaveAs = "\\ham-s001\t\Reports\" & Format(Now(), "YYYY-MM") & " Forecast.xlsx"
    Set xApp = CreateObject("Excel.Application")
    Set xWbk = xApp.Workbooks.Open(sFile, , False)
    Set xSht = xWbk.Sheets("Invoiced Shipments")
   
    lRow = 2
    lColumn = 1
    xSht.Cells(lRow, lColumn).CopyFromRecordset rs

    xApp.Visible = True
    On Error Resume Next
    xWbk.SaveAs sSaveAs, , , , , , xlNoChange
   
    Set xSht = Nothing
    Set xWbk = Nothing
    Set xApp = Nothing
    Set rs = Nothing


Problem: Es kommt der Debugger mit der "Fehlermeldung 430: Klasse unterstützt keine Automatisierung oder unterstützt erwartete Schnittstelle nicht".

Hat jemand eine Idee?

Danke & Gruss
Christian
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: steffen0815 am Mai 08, 2017, 19:35:55
Hallo,
in welcher Zeile kommt denn der Fehler?
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 08:54:59

Hier:

xSht.Cells(lRow, lColumn).CopyFromRecordset rs

Habe auch schon mit

xSht.Range("A2").CopyFromRecordset rs

probiert, bekomme aber den gleichen Fehler.
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 08:56:36

Sorry, da war was abgeschnitten, das Recordset habe ich natürlich definiert:

Dim rs As DAO.Recordset
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: steffen0815 am Mai 09, 2017, 09:47:25
Hallo,
das sieht nicht gut aus.

Im ersten Versuch würde ich Excel mal sichtbar schalten - vielleicht sieht man mehr:xApp.Visible = True


Ansonsten würde ich einen Installationfehler vermuten. Teste mal mit einem "unverfänglicherem" Code (zur Sicherheit ohne einen Excelverweis):Sub exceltester()
Dim xApp, xWbk, xSht
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("select * from EineAccessTab")
    Set xApp = CreateObject("Excel.Application")
    xApp.Visible = True
    Set xWbk = xApp.Workbooks.Add
    Set xSht = xWbk.Sheets("Tabelle1")
    xSht.Cells(1, 1).CopyFromRecordset rs
End Sub
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 10:00:45
Hallo Steffen

leider gleiche Meldung. Ich arbeite in einer Citrix Umgebung mit verschiedenen Datenquellen, Access Backend, SQL Server und Oracle Datenbank. Soll heissen ich habe nicht wirklich Einfluß auf die Installation und kann auch nicht selbstständig mal kurz in die Registry schauen, bzw diese ändern...

Habe schon gegoogelt, Verweise gelöscht und neu gesetzt etc.

Das Einbinden von Excel an sich klappt. Wenn ich die Felder einzeln kopiere, dann klappt das, dauert aber wirklich Ewigkeiten:

    While Not rs.EOF
        ProgressBar_Update rs.AbsolutePosition
        If rs.AbsolutePosition = 50 Then GoTo skiprest1
        lRow = lRow + 1
        lColumn = 0
        For Each rField In rs.Fields
            lColumn = lColumn + 1
            xSht.Cells(lRow, lColumn) = Nz(rField.Value, "")
        Next
        rs.MoveNext
    Wend


Ich suche eigentlich nur eine Möglichkeit das zu beschleunigen, Zeilenweise kopieren oder irgendwie anders. Wie gesagt, es dauert wirklich ewig...
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: steffen0815 am Mai 09, 2017, 10:08:13
Hallo,
Zitatleider gleiche Meldung.
Dh. der (mein) Minimalcode läuft nicht?

Dann vermute ich wie geschrieben ein Installationsproblem.

Hier kannst du dann nur versuchen, die DAO-Bibliothek (neu) zu registrieren.

Google bietet bei: CopyFromRecordset "430" einige passende Ergebnisse.

Eventuell kannst du auch den Standardexport (docmd.transfer ...) mit anschließender Nacharbeit nutzen, der dürfte noch schneller sein.

Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 10:36:53

Hi Steffen

ja habe diesen Code eingesetzt:

    Dim xApp, xWbk, xSht
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT SAG_01_COSTTYPE.* FROM SAG_01_COSTTYPE;")
        Set xApp = CreateObject("Excel.Application")
        xApp.Visible = True
        Set xWbk = xApp.Workbooks.Add
        Set xSht = xWbk.Sheets("Tabelle1")
        xSht.Cells(1, 1).CopyFromRecordset rs

Exit Sub


Bin nicht so der Crack wenn es um Excel Automation geht, aber ich nehme an man kann keinen Zielbereich (Blatt + Startzelle) definieren, oder?

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Forecast_InvoicedShipments", sSaveAs, False


Geht aber schnell. Evtl kann ich ja en bloque die Daten aus einem Arbeitsblatt ins richtige kopieren. Kann man auch "nur Inhalte einfügen" nutzen?
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: DF6GL am Mai 09, 2017, 10:36:57
Hallo,

kann es sein, dass in "EineAccessTab"   OLE-Felder enthalten sind?

Vielleicht muss auch zunächst ein "Range" definert werden:


xSht.Range("A1").CopyfromRecordset 
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 10:53:18
Hallo Franz :)

scheinbar ist das ein generelles Problem mit DAO. Habe nun einen ADO Recordset daraus gemacht und es läuft:

    Set rs = New ADODB.Recordset
    rs.Open sSQL, conn, adOpenStatic, adLockReadOnly
   
    ProgressBar_TurnOn "Export Invoiced Shipments", 0
    sFile = "\\ham-s001\t\\Template\Forecast.xlsx"
    sSaveAs = "\\ham-s001\t\\Reports\" & Format(Now(), "YYYY-MM") & " Forecast.xlsx"
    Set xApp = CreateObject("Excel.Application")
    Set xWbk = xApp.Workbooks.Open(sFile, , False)
    Set xSht = xWbk.Sheets("Invoiced Shipments")

   
    xSht.Range("A2").CopyFromRecordset rs

    ProgressBar_TurnOff
    xApp.Visible = True


Danke Euch für die Ideen
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: steffen0815 am Mai 09, 2017, 10:53:18
Hallo,
ZitatEvtl kann ich ja en bloque die Daten aus einem Arbeitsblatt ins richtige kopieren. Kann man auch "nur Inhalte einfügen" nutzen?
Gleich ins  richtige Arbeitsblatt geht bei Angabe des Range-Parameters. Ansonsten sollte die Funktion nmM grundsätzlich unformatiert (also im Prinzip nur Inhalte) ausgeben.

Hinweis zu OLE (oder sonstiger Kram): Bitte noch mal eine einfache Tabelle testen.


Wenn es mit ADO funktioniert, hast du nmM trotzdem weiterhin ein Installationsproblem:
ZitatHier kannst du dann nur versuchen, die DAO-Bibliothek (neu) zu registrieren.
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 10:56:11

Achso - noch eine kurze Anmerkung, das hier geht nicht:

xSht.Cells(1, 1).CopyFromRecordset rs

Auch wenn die Accesshilfe das vorschlägt.
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: atropos am Mai 09, 2017, 10:59:24
Hi Steffen,

ZitatGleich ins  richtige Arbeitsblatt geht bei Angabe des Range-Parameters. Ansonsten sollte die Funktion nmM grundsätzlich unformatiert (also im Prinzip nur Inhalte) ausgeben.

Nein das geht nicht. Wenn Du einen Range Parameter bei "TransferSpreadsheet" im Exportmodus eingibst, dann benennt Access lediglich ein neues Arbeitsblatt danach und fügt die Daten dort ein. Grundsätzlich nimmt Access auch Formatierungen (z.B. Zeilenumbrüche in den Zellen), Schriftarten und -größe vor. Jedefalls nicht die Vorlagenschriftart aus Excel.
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: steffen0815 am Mai 09, 2017, 11:31:48
Hallo,
>> dann benennt Access lediglich ein neues Arbeitsblatt danach und fügt die Daten dort ein
Schon klar, ich meine nur du hast dann ein Tabellenblatt mit dem gewünschten Namen.

>> Grundsätzlich nimmt Access auch Formatierungen (z.B. Zeilenumbrüche in den Zellen), Schriftarten und -größe vor
Ja Access missachtet die "Vorformatierung"

ZitatxSht.Cells(1, 1).CopyFromRecordset rs:Achso - noch eine kurze Anmerkung, das hier geht nicht
Kann ich nicht bestätigen, läuft sowohl unter DAO als auch unter ADODB    Dim xApp, xWbk, xSht
    Dim rs As DAO.Recordset, ado As ADODB.Recordset, conn As ADODB.Connection
    Set ado = New ADODB.Recordset
    Set conn = CurrentProject.Connection
    ado.Open "SELECT * from tabelle1", conn, adOpenStatic, adLockReadOnly

    Set rs = CurrentDb.OpenRecordset("SELECT * from tabelle1")
        Set xApp = CreateObject("Excel.Application")
        xApp.Visible = True
        Set xWbk = xApp.Workbooks.Add
        Set xSht = xWbk.Sheets("Tabelle1")
        xSht.Cells(1, 1).CopyFromRecordset rs
        Set xSht = xWbk.Sheets("Tabelle2")
        xSht.Cells(1, 1).CopyFromRecordset ado

Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: Lachtaube am Mai 09, 2017, 13:19:02
Ich würde mal eine reine Late-Binding Version testen (also ohne DAO- bzw. Access-Database Engine- und ohne Excel-Verweis).
Titel: Re: Probleme bei Datenexport in Excel
Beitrag von: Milvus am Mai 15, 2019, 15:30:18
Zitat von: atropos am Mai 09, 2017, 10:53:18
Hallo Franz :)

scheinbar ist das ein generelles Problem mit DAO. Habe nun einen ADO Recordset daraus gemacht und es läuft:

    Set rs = New ADODB.Recordset
    rs.Open sSQL, conn, adOpenStatic, adLockReadOnly
   


Danke Euch für die Ideen

Hallo zusammen,

ist schon 2 Jährchen her, hole es aber mal wieder hoch, da ich bei der Geschichte ein Phänomen beobachtet habe (hoffe, das ist OK?).

Bei einer Datensatzmenge >100.000 ist das CopyFromRecordset ohne Hänger abgeschmiert. Zum Glück hab ich das bemerkt und Debuggt. Der Datensatzzeiger bzw. AbsolutePosition war nicht am Ende, der Code ist einfach weiter gerannt.

Ich habe mir damit erst mal soweit beholfen, dass ich noch eine Prüfung eingebaut habe if Not rs.EOF = true (dann stimmt was nicht).

Hat von Euch noch jemand Erfahrung damit?

Ich habe mir das beisweilen so erklärt, dass es evtl. an der Art des Recordsets liegen könnte.
Also nicht wie im Zitat angegeben ADO/DAO Unterschied sondern eine Ebene tiefer. Man sieht, dass hier ein statischer Curser genommen wurde.

Ich nehme neuerdings DAO-Snapshot Nach Literatur wird ja eine vollständige Kopie der Datensätze in das Recordset geladen. Wenn das bei dynamischen immer nachgeladen werden muss, könnte es daran gelegen haben?

Danke & Gruß