August 11, 2022, 04:40:08

Neuigkeiten:

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


Abfrage mit QueryDef-Parametern als Excel abspeichern, aber vorher bearbeiten

Begonnen von osterhase, Juni 08, 2022, 16:15:37

⏪ vorheriges - nächstes ⏩

osterhase

Hallo,

ich habe folgendes Problem: Ich habe mit QueryDef eine Abfrage erstellt; die Parameter dazu kann man in einem Formular einstellen. Hier der Beispiel-Code:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rs_new As Recordset
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("Abfrage_blabla")
       
qdf.Parameters!par1 = Forms!Abfrage_blabla!eingabe_1
qdf.Parameters!par2 = Forms!Abfrage_blabla!eingabe_2
...

Das klappt soweit ganz gut, das Ergebnis wird anschließend in einem Formular angezeigt. Durch einen Button möchte ich nun dieses Abfrage-Ergebnis als Exceltabelle abspeichern. Auch das klappt ganz gut, mit:

Private Sub Befehl1_Click()
   DoCmd.OutputTo acForm, , "MicrosoftExcel(*.xls)", , True                       
End Sub

Das Problem dabei ist, dass die Such-Parameter in den ersten Spalten meiner Exceltabelle mitgespeichert werden. Diese möchte ich aber nicht drin haben, sondern nur das reine Abfrageergebnis.
Gibt es eine Möglichkeit diese Exceltabelle vorher irgendwie abzufangen und zu sagen, dass man die ersten Spalten nicht drinnen haben möchte? Ich habe es schon versucht, mit z.B.:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, Me.Name, "C:\Users\osterhase\Desktop\test.xlsx", True, "E:K" 

so dass Spalten A, B, C, D nicht mit übergeben werden, allerdings klappt es für den acExport leider nicht, sondern nur für den acImport.

Hat jemand vielleicht andere Ideen, in diese Richtung?

ebs17

Die gezeigte Parameterübergabe an das QueryDef-Objekt erzeugt letzten Endes ein Recordset, das Du hier sicherlich als Datenherkunft an das Formular übergibst. Das Formularrecordset kannst Du mit der Methode CopyFromRecordset an eine geöffnete Excelmappe übergeben.
Mit freundlichem Glück Auf!

Eberhard

osterhase

Hallo ebs17,

vielen Dank für Deinen Tipp. :)  Ich suche allerdings etwas, ohne dass ich mit Excel Applicationen arbeiten muss (aus Gründen, die hier ein wenig komplizierter sind zu erklären). Ich würde gerne eher in die Richtung, ähnlich wie bei

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, Me.Name, "Pfad", True, "E:K"

mit einer Range zu arbeiten oder einfach mit etwas wie delete.column...
Vielleicht gibt es noch weitere Möglichkeiten/Wege?

markus888

Zitat von: osterhase am Juni 09, 2022, 14:59:11aus Gründen, die hier ein wenig komplizierter sind zu erklären

Dann mach mal, wenn du willst dass andere eine Lösung für deine Probleme finden.

Kannst ja per SQL Insert versuchen.
Oder gar, die Datei per xml Schnittstelle bearbeiten - wäre doch auch lustig.
10 Jahre Access

ebs17

Zitatso dass Spalten A, B, C, D nicht mit übergeben werden
Primär würde ich unnötige Spalten erst gar nicht in eine Abfrage übernehmen. Was nicht da ist, muss nicht abgewählt oder gelöscht werden.
Eine Abfrage ist nur etwas Code. Da kann man zur Not eine weitere zielgenaue erstellen, statt seine einmal erstellte Abfrage wie ein Weltwunder für alles einsetzen zu wollen.

Maßnahmen würde ich vom Kontext der Aufgabe ableiten, der bleibt aber wegen Kompliziertheit (für uns?) unbekannt.
Mit freundlichem Glück Auf!

Eberhard

osterhase

ZitatPrimär würde ich unnötige Spalten erst gar nicht in eine Abfrage übernehmen.
Das Problem ist, dass durch meine Abfrage, die Query-Parameter als Spalten mit in die Exceltabelle übernommen werden. Genau diese versuche ich loszuwerden. Vielleicht gibt es auch einen anderen Trick, dass Access diese QueryDef-Parameter bei der Excel-Erstellung ignoriert?

Spalten A, B, C, D sind also meine Queryparameter, die ich nicht möchte. E,F,G,H,... sind die gewünschten Datenbank-Felder.

Mit der Excel-Application klappt es zwar A,B,C,D nicht mitzübernehmen, allerdings werden dann einige anderen Datenbank-Spalten nicht richtig dargestellt, weil in meiner DB einige Spalten Zahlen enthalten und erst durch das Eigenschaftsblatt -> Daten -> Datensatzherkunft in Begriffe konvertiert werden. Es sind Optionen aus Kombinationsfeldern wie z.B. 1;Name1;2;Name2;3;Name3...  ::)  Die Excel-Application ignoriert dies bei einem ".copyfromRecordset rs"
Ich müsste dann vermutlich für sämtliche Kombinationsfelder Fallunterscheidungen selbst programmieren.
Deswegen ist mir der weg über DoCmd o.ä. lieber, da dort diese Unwandlungen gleich in die Tabelle korrekt mitübernommen werden. Allerdings mit 4 Spalten, die ich nicht haben will.

ebs17

ZitatDas Problem ist, dass durch meine Abfrage ...
Ja, die Abfrageformulierung ...
Damit in einem Feld gefiltert wird, muss es nicht im SELECT-Teil stehen.

ZitatDatenbank-Spalten nicht richtig dargestellt
Primär würde ich auch eine Abfrage exportieren, nicht ein Formular mit seinen Eigengeschichten. Eine Abfrage würde mir dann jene Inhalte anzeigen und übergeben, die ich will.

Die "Kompliziertheit" liegt vermutlich in Deinen Vorstellungen und in Deiner Gestaltung.
Mit freundlichem Glück Auf!

Eberhard

osterhase

Zitat von: ebs17 am Juni 09, 2022, 19:03:05Primär würde ich auch eine Abfrage exportieren, nicht ein Formular mit seinen Eigengeschichten. Eine Abfrage würde mir dann jene Inhalte anzeigen und übergeben, die ich will.

Die "Kompliziertheit" liegt vermutlich in Deinen Vorstellungen und in Deiner Gestaltung.

Es geht darum, dass ein Kunde diese Abfrage-Parameter über dieses Formular eingeben soll und zwar für (fast) alle möglichen Parameter der DB, und allen möglichen Kombinationen die sich daraus ergeben. Er soll keine Abfrage selbst schreiben, denn das könnte er nicht (weil er nicht aus IT, EDV & Co. kommt). Deswegen habe ich dieses Formular erstellt, damit er nur seine Auswahl anklicken braucht und sich die Ergebnis-Exceltabelle runterladen kann. Das Formular und die Abfrage sind soweit fertig. Es fehlt nur noch ein sauberer Export des Abfrage-Ergebnisses in diese Exceltabelle. Auch das ist im Grunde schon fertig, bis darauf, dass eben besagte Query-Parameter leider mitexportiert werden. Meine Query-Parameter stehen nicht im Select-Teil, sondern in der Where-Bedingung.

ebs17

Zitat... sind soweit fertig
Dann hast Du einige Stücke Extra-Arbeit.
TransferSpreadsheet (der ordentliche Export nach Excel) benötigt eine Tabelle oder eine gespeicherte Abfrage, die sich ihre Parameter selber holt, nicht wie bei Dir zugewiesen.
Aus dem Recordset kann man nur per Schleife Werte in eine Tabelle schreiben, nicht im Stück eine Tabelle erstellen.
Bezüglich der gespeicherten Abfrage müsste die Parameterabfrage anders gestaltet werden: Grundlagen - SQL ist leicht (16) - Abfragen mit Parametern
Mit freundlichem Glück Auf!

Eberhard