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
Hallo,
in welcher Zeile kommt denn der Fehler?
Hier:
xSht.Cells(lRow, lColumn).CopyFromRecordset rs
Habe auch schon mit
xSht.Range("A2").CopyFromRecordset rs
probiert, bekomme aber den gleichen Fehler.
Sorry, da war was abgeschnitten, das Recordset habe ich natürlich definiert:
Dim rs As DAO.Recordset
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
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...
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.
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?
Hallo,
kann es sein, dass in "EineAccessTab" OLE-Felder enthalten sind?
Vielleicht muss auch zunächst ein "Range" definert werden:
xSht.Range("A1").CopyfromRecordset
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
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.
Achso - noch eine kurze Anmerkung, das hier geht nicht:
xSht.Cells(1, 1).CopyFromRecordset rs
Auch wenn die Accesshilfe das vorschlägt.
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.
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
Ich würde mal eine reine Late-Binding Version testen (also ohne DAO- bzw. Access-Database Engine- und ohne Excel-Verweis).
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ß