Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Accessabfrage nach Excel per Button exportieren

Begonnen von Muselhexe, Oktober 29, 2013, 22:36:06

⏪ vorheriges - nächstes ⏩

Muselhexe

Moin zusammen,

ich bin kurz vorm durchdrehen. Meine Datenbank funktioniert aber die Kommunikation zu Excel funktioniert nicht wie ich das will. Ich weiss das Thema wurde schon oft durchgekaut aber ich komme trotzdem nicht weiter.
Ich habe eine Abfrage in Access, die Ergebnisse dieser möchte ich nun per Button an eine Excelarbeitsmappe bzw. in eine Exceltabellenblatt übergeben, um sie dann dort graphisch auswerten zu können. Ich habe es inzwischen über 2 Wege probiert.
Der erste funktioniert mal und mal nicht, aber wenn ich es richtig verstanden habe is der eher für die Variante einmal in eine Exceltabelle übertragen und dann erstellt der ein neues Tabellenblatt (korrigiert mich wenn ich falsch liege)


Private Sub Befehlx_Click

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, ''Abfrage Zeitraum'', ''Dateipfad der Excel'', True, ''Name Tabellenblatt''

End Sub



Und bei dem zweiten Weg bekomme ich immer wieder den Laufzeitfehler '91 Objektvariable ider With-Blockvariable nicht festgelegt. Der Fehler liegt laut Debugger in der Zeile ' Set xlBook = xl.App.workbooks.open (Dateipfad Excel).


Private Sub Befehlx_Click

Dim xlApp as Object
Dim xlBook as Object
Dim xlsheet as Object
Dim rst as DAO.Recordset

Set xlBook=xlApp.Workbooks.open(Dateipfad)
Set xlsheet = xlBook.sheets(''Ergebnisse Abfrage'')

End Sub


Was mache ich falsch? Oder bin ich total auf dem Holzweg.

Vielleicht noch kurz dazu wozu ich das brauche. Die Abfrage gibt verschiedene Zeiträume aus (die können unterschiedlich lang sein). Diese sollen dann per Button in ein bestehendes Excelarbeitsblatt gegeben werde. Dort wird dann automatisch, zumindest stelle ich mir es so vor, ein Diagramm aus den aktuellen Abfrageergebnissen kreiert. Das heißt ich muss wahrscheinlich noch einbauen die vorherigen Abfrageergebnisse zu löschen, oder werden die dann automatisch überschrieben?

Er wäre ganz wunderbar wenn mir jemand helfen könnte!

Hexe

daolix

Hallo

du must erst das Object xlApp Instanzieren,
Set xlApp = CreateObject("Excel.Application")
bevor du es verwenden kannst.

Stapi

Hallo Muselhexe

ZitatDoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, ''Abfrage Zeitraum'', ''Dateipfad der Excel'', True, ''Name Tabellenblatt''
DoCmd.OutputTo acOutputQuery, ''Name deiner Abfrage'', acFormatXLS, "Name deiner Exceldatei.xls", True

Und für den Fall zwei, wurde hier Ausführlich beschrieben.
http://www.access-o-mania.de/forum/index.php?topic=18277.msg102995#msg102995
Grüße aus dem schönen NRW
Stefan

Muselhexe

Moin,

super die Variante von daolix habe ich nun schon eingebaut und nun bekomme ich auch keine Fehlermeldung mehr. Nur wenn ich die Excel jetzt öffne sagt mir Excel ich hätte die Datei schon in Bearbeitung und kann sie dann nicht öffnen. Habe ich da noch irgendwo einen Fehler??

Vielen Dank schonmal im Vorraus!

Hexe

Stapi

Hallo Muselhexe

Bitte nicht vergessen am Ende deines Code die Objekte zu zerstören.

Set xlApp = Nothing
Set xlBook = Nothing
Set xlsheet = Nothing
Set rst = Nothing
Grüße aus dem schönen NRW
Stefan


Muselhexe

Moin,
sorry mir kam der Feiertag und das Tagesgeschäft dazwischen. Ich werde das nun mal gleich ausprobieren :D

Viele Grüße

Hexe

Muselhexe

Moin,
so ich habe den Code angepasst. Einige zwischenzeitlich auftretende Fehler gelöst. Aber hier ist nun einer bei dem ich nicht weiterkomme.

Bei der Zeile : Set rst = CurrentDb.OpenRecordset("Abfrage Zeitraum") zeigt er mir einen Fehler an. Laufzeitfehler 3061: 2 Parameter wurden erwartet, aber es wurden zu wenige übergeben. Ich habe hier schon meine Bücher gewälzt aber ich weiß leider nicht was ich falsch mache  ???

Hier nochmal der aktuelle Code.


Private sub Befehl 13_Click()

Dim xlApp As Object 'Excel.Application
Dim xlbook As Object 'Excel.Workbook
Dim xlsheet As Object 'Excel.worksheet
Dim rst As DAO.Recordset

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

Set xlbook = xlApp.Workbooks.Open("Dateipfad")

Set xlsheet = xlbook.sheets("Tabelle1")

Set rst = CurrentDb.OpenRecordset("Abfrage Zeitraum")
xlsheet.Range("A1").copyfromrecordset rst

rst.Close
xlApp.Close


Set xlApp = Nothing
Set xlbook = Nothing
Set xlsheet = Nothing
Set rst = Nothing

End Sub


Viele Grüße
Hexe

DF6GL

Hallo,

dann zeige halt mal die Abfrage (SQL-String)...

Die Fehlermeldung deutet darauf hin, dass in der Abfrage nicht existierende Felder (Feldnamen) , oder nicht auflösbare Parameter (z. B. Textfeld-Verweise auf nicht geöffnetes Formular)  oder Verweise auf "leere" Textfelder verwendet werden.....




Muselhexe

Moin,

also die Abfrage sieht so aus:

SELECT
Ereignishistorie.Datum, Ereignishistorie.[Ereignis 1], Ereignishistorie.[Bemerkung 1], Ereignishistorie.[Ereignis 2], Ereignishistorie.[Bemerkung 2],
Ereignishistorie.[Ereignis 3], Ereignishistorie.[Bemerkung 3],
Qualitätsparameter.Sorte, Qualitätsparameter.Datum, Qualitätsparameter.Uhrzeit, Qualitätsparameter.[FG],
Qualitätsparameter.[Dicke],
Qualitätsparameter.[Vol],
Qualitätsparameter.[WG],
Qualitätsparameter.[L],
Qualitätsparameter.[a],
Qualitätsparameter.,
Qualitätsparameter.[BK md],
Qualitätsparameter.[BK cd],
Qualitätsparameter.[md/cd],
Qualitätsparameter.[D md],
Qualitätsparameter.[D cd],
Qualitätsparameter.[WRA],
Qualitätsparameter.[Op in %],
Qualitätsparameter.[R o],
Qualitätsparameter.[R u],
Qualitätsparameter.[Por],
Qualitätsparameter.[A 1000],
Qualitätsparameter.[A 570],
Qualitätsparameter.[Feuchte in %]
FROM Qualitätsparameter RIGHT JOIN Ereignishistorie
ON Qualitätsparameter.Datum = Ereignishistorie.Datum
WHERE (((Ereignishistorie.Datum) Between [Formulare]![Zeitraumsuche]![Text0] And [Formulare]![Zeitraumsuche]![Text2]));


Vielen Dank schoneinmal für deine Hilfe :D
Schönen Abend
HExe

DF6GL

Hallo,

ist das Copy&Paste aus der SQL-Ansicht oder über die Tastatur eingetippt?


SELECT
Ereignishistorie.Datum, Ereignishistorie.[Ereignis 1], Ereignishistorie.[Bemerkung 1], Ereignishistorie.[Ereignis 2], Ereignishistorie.[Bemerkung 2],
Ereignishistorie.[Ereignis 3], Ereignishistorie.[Bemerkung 3],
Qualitätsparameter.Sorte, Qualitätsparameter.Datum, Qualitätsparameter.Uhrzeit, Qualitätsparameter.[FG],
Qualitätsparameter.[Dicke],
Qualitätsparameter.[Vol],
Qualitätsparameter.[WG],
Qualitätsparameter.[L],
Qualitätsparameter.[a],
Qualitätsparameter.,    'Hier fehlt ein Feldname
Qualitätsparameter.[BK md],
Qualitätsparameter.[BK cd],
Qualitätsparameter.[md/cd],
Qualitätsparameter.[D md],
Qualitätsparameter.[D cd],
Qualitätsparameter.[WRA],
Qualitätsparameter.[Op in %],
Qualitätsparameter.[R o],
Qualitätsparameter.[R u],
Qualitätsparameter.[Por],
Qualitätsparameter.[A 1000],
Qualitätsparameter.[A 570],
Qualitätsparameter.[Feuchte in %]
FROM Qualitätsparameter RIGHT JOIN Ereignishistorie
ON Qualitätsparameter.Datum = Ereignishistorie.Datum
WHERE (((Ereignishistorie.Datum) Between [Forms]![Zeitraumsuche]![Text0] And [Forms]![Zeitraumsuche]![Text2]));


Das Form "Zeitraumsuche" muss zum Zeitpunkt der Abfrageausführung geöffnet sein und die Textfelder "Text0" und "Text2" müssen einen gültigen Datumswert enthalten.




DRINGENDER Rat:  Eliminiere die Sonder- und Leerzeichen aus den Namen....

Muselhexe

Moin,

also das war C&P aus der SQL Ansicht. Nur habe ich die Feldnamen ein bissl eingekürzt. Der der fehlte ist eigentlich drin, ist mir nur nicht aufgefallen. Die Bezeichung Formular habe ich auch geändert. Aber er gibt mir immer noch die selbe Fehlermeldung.

Ich habe einen zweiten Button 'Abfrage ausführen' und das läuft. Wenn ich allerdings meinen Exportieren Button klicke öffnet er mir zwar die richtige Exceltabelle aber er schreibt nichts ein und in der Accessoberfläche zeigt er mir dann den genannten Fehler.

Die Sonderzeichen könnte ich aber zur Not rausnehmen. Die Leerzeichen werden dann aber schwierig weil bei manchen handelt es sich um die gleiche Messung aber in 2 versch. Richtungen und dann wird es ohne Leerzeichen unübersichtlich.

Hast du vllt. noch eine Idee?

Gruß
HExe

DF6GL

Hallo,


mach das mal so nach diesem Prinzip:
.
.
.
Dim strSQL as String
strSQL= "SELECT Ereignishistorie.Datum, Ereignishistorie.[Ereignis 1], Ereignishistorie.[Bemerkung 1], Ereignishistorie.[Ereignis 2], Ereignishistorie.[Bemerkung 2], " & _
" Ereignishistorie.[Ereignis 3], Ereignishistorie.[Bemerkung 3],Qualitätsparameter.Sorte, Qualitätsparameter.Datum, Qualitätsparameter.Uhrzeit, Qualitätsparameter.[FG], " & _
" Qualitätsparameter.[Dicke],Qualitätsparameter.[Vol],Qualitätsparameter.[WG], Qualitätsparameter.[L], Qualitätsparameter.[a],Qualitätsparameter[color=red].[abcdef],[/color]   " & _
" Qualitätsparameter.[BK md],Qualitätsparameter.[BK cd],Qualitätsparameter.[md/cd],Qualitätsparameter.[D md],Qualitätsparameter.[D cd],Qualitätsparameter.[WRA],   " & _
" Qualitätsparameter.[Op in %], Qualitätsparameter.[R o], Qualitätsparameter.[R u], Qualitätsparameter.[Por], Qualitätsparameter.[A 1000], Qualitätsparameter.[A 570],"Qualitätsparameter.[Feuchte in %]  " & _
" FROM Qualitätsparameter RIGHT JOIN Ereignishistorie ON Qualitätsparameter.[Datum] = Ereignishistorie.[Datum]  " & _
" WHERE Ereignishistorie.[Datum] Between " & Format(nz(Me!Text0,Date),"\#yyyy-mm-dd\#")   & "  And    " & Format( nz(Me!Text2,Date),"\#yyyy-mm-dd\#")

Set rst = CurrentDb.OpenRecordset(strSQL,dbOpenSnapShot)

.
.
.

Muselhexe

Moin,

du bist mein Held :D Bis jetzt funktioniert es !!


Vielen Vielen Dank für deine Mühe

Hexe