Neuigkeiten:

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

Mobiles Hauptmenü

Probleme bei Datenexport in Excel

Begonnen von atropos, Mai 08, 2017, 18:22:25

⏪ vorheriges - nächstes ⏩

atropos

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
Gruss
atropos

steffen0815

Hallo,
in welcher Zeile kommt denn der Fehler?
Gruß Steffen

atropos


Hier:

xSht.Cells(lRow, lColumn).CopyFromRecordset rs

Habe auch schon mit

xSht.Range("A2").CopyFromRecordset rs

probiert, bekomme aber den gleichen Fehler.
Gruss
atropos

atropos


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

Dim rs As DAO.Recordset
Gruss
atropos

steffen0815

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
Gruß Steffen

atropos

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...
Gruss
atropos

steffen0815

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.

Gruß Steffen

atropos


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?
Gruss
atropos

DF6GL

#8
Hallo,

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

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


xSht.Range("A1").CopyfromRecordset 

atropos

#9
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
Gruss
atropos

steffen0815

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.
Gruß Steffen

atropos


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

xSht.Cells(1, 1).CopyFromRecordset rs

Auch wenn die Accesshilfe das vorschlägt.
Gruss
atropos

atropos

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.
Gruss
atropos

steffen0815

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

Gruß Steffen

Lachtaube

Ich würde mal eine reine Late-Binding Version testen (also ohne DAO- bzw. Access-Database Engine- und ohne Excel-Verweis).
Grüße von der (⌒▽⌒)