Hi,
ich habe eine Aufgabenstellung bekommen, mit der ich nun gar nicht klar komme.
Ich betreue eine Datenbank, die Tabellen beinhaltet deren Umfang für die User zu Umfangreich ist. Aus internen Gründen ist es nicht möglich vollständige Tabellen zu exportieren. Von daher bin ich dazu übergegangen ein Formular zu erstellen aus dem sich die user mittels Kombifelder die benötigten Spalten zusammenzustellen.
Der Versuch das Gewünschte mit einer SQL Anweisung in einer temporären Tabelle darzustellen und mit Export nach Excel zu bringen klappt nicht. Select und Formularinhalt lassen sich nicht zusammenbringen.
Für eine Lösung in VBA wäre ich offen ...
Könnt Ihr mir helfen?
Zitat von: Michel007 am November 21, 2022, 09:31:02Der Versuch das Gewünschte mit einer SQL Anweisung in einer temporären Tabelle darzustellen und mit Export nach Excel zu bringen klappt nicht.
Klappt nicht bedeutet was genau?
Es gibt mehrere Möglichkeiten:
Mittels SQL Anweisung - Insert into - nach Excel übertragen.
Mittels docmd.transferspreadsheet
Mittels Excel Automatisierung mit einer Kopie der Daten aus einem Recordset.
Man wählt also abhängig vom Kontext die sinnvollste Vorgehensweise.
Hi Markus,
es klappt mein Ansatz nicht.
Ich wollte Select [Formulare]![Datenexport nach Excel]![text4]<-text4=Kombifeld
from Laufende_Themen
Auf dem Formular stehen 28 Kombifelder zu Auswahl, die willkürlich zusammengestellt oder unberücksichtigt werden können.
Du meinst also du scheiterst nicht am Export, sondern davor.
Mit deinen Angaben kann ich nicht viel anfangen.
Vielleicht beschreibst du das Vorhaben mal so, dass jeder es verstehen kann und zeigst deinen bisherigen Code dazu.
Der Ursprung ist das Formular.
Es beinhaltet 28 Kombifelder die für eine Auswahl freigegeben sind.
Bspw. Spalte A = Typ
Spalte B = Gesamtgewicht
Spalte C = Ticketnummer
Spalte D = Fehlerinhalt
Spalte E = Lösung
etc.
Die Reihenfolge kann der User willkürlich durch seine Auswahl wählen.
Es ist natürlich möglich den Inhalt des Kombifeldes als Kriterium einer Abfrage herzunehmen.
Ich möchte aber das der Kombiinhalt die vollständige/n Spalte/n einer neuen Tabelle wieder geben. Das wären in Summe ca. 20.000 Zeilen.
Daher der Versuch mittels SQL
Select [Formulare]![Datenexport nach Excel]![Typ]
from Laufende_Themen
eine Abfrage zu generieren, die die entsprechende Auswahl in einer neuen Tabelle erstellt und die dem User zur Verfügung stellt.
Also Grundsätzlich:
Parameter dienen dazu konstante Werte in eine Abfrage zu übernehmen.
Wenn es um Bezeichnungen für Felder oder Tabellen geht, dann ist das eine normale String Zusammensetzung:
sqlString = "SELECT " & WertAusKombinationsfeld ...
Und wenn du dann den ganzen String zusammen hast, dann kannst auf dieser Grundlage einen Export erstellen.
Hallo Michel,
ZitatDie Reihenfolge kann der User willkürlich durch seine Auswahl wählen.
Das ist das Einzige, was mich auf dein Vorhaben hinweist. Ich vermute
- die Kombis enthalten alle eine Feldliste der Tabelle "Laufende_Themen"
- der Anwender soll sich die Felder aussuchen, die er exportiert haben möchte
z.B. die Felder "Ticketnummer" und "Typ". Dann wählt er im ersten Kombi
"Ticketnummer" und im zweiten "Typ", die anderen Kombis bleiben leer.
Richtig verstanden?
Wenn Ja, dann kannst du mit einer Schleife über die Kombis den SQL-String
einer Abfrage zusammenstellen
(Luftcode)
Dim ctl As Control
Dim sSQL AS String
sSQL = "SELECT "
With Me
For Each ctl in .Controls
'*)
If Mid(ctl.Name, 1, 3) = "cbo" AND Nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
Next ctl
sSQL = Mid(sSQL, 1, Len(sSQL)-2)
sSQL = sSQL & " FROM Laufende_Themen" 'Leerzeichen am Anfang beachten
Debug.Print sSQL 'zum Anschauen Strg-G
End With*) Voraussetzung für diese Variante: die Kombis haben alle das Prefix "cbo"
im Namen.
Ausserdem ist natürlich auf die Reihenfolge zu achten in der die Schleife
die Auflistung durchläuft. Teste zuerst ob diese der Aktivier-Reihenfolge
entspricht (ich hab jetzt keinen Bock drauf). Wenn das nicht der Fall ist
müsstest du die Namen der Kombis nummerieren (Kombi_1, Kombi_2
oder nach deinen Wünschen).
Die Schleife läuft dann so
Dim z As Integer
For z = 1 To 28
set ctl = .Controls("Kombi_" & z)
If Nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
Next z
'Rest wie oben
Mit sSQL kannst du dann eine temporäre Abfrage füttern und exportieren.gruss ekkehard
Super, ich probiere es mal aus. Ich melde mich!
Hi Markus,
ich hab soweit alles eingegeben. Allerdings bekomme ich bei
If Mid(ctl.Name, 1, 3) = "cbo" AND Nz(ctl.Value, 0) <> 0 Then
Die Fehlermeldung Laufzeitfehler 438, Objekt unterstützt diese Eigenschaft oder Methode nicht.
Muß Nz nicht in DIM ausgewiesen werden?
Gruß
Michael
hi ekkehard, sorry für Markus ;)
für set ctl = .Controls("Kombi_" & z)
erhalte ich die Fehlermeldung unzureichender oder nicht ausreichend definierter Verweis ...
Zitatein Formular zu erstellen aus dem sich die user mittels Kombifelder die benötigten Spalten zusammenzustellen
Knowhow 3.0 von Klaus Oberdalhoff (https://freeaccess.de/downloaddetails.asp?ID=1)
Da ist eine Lösung dafür enthalten.
Hallo Michel,
ZitatMuß Nz nicht in DIM ausgewiesen werden?
Nein. Das ist eine Funktion, die dir für ein leeres Feld (Inhalt
ist NULL) einen Ersatzwert zurückliefert.
Die Fehlermeldung kommt daher, dass ein Control refenziert wird,
das keine Value-Eigenschaft besitzt.
Sorry, mein Fehler. Man müsste vorher noch auf die ControlType-
Eigenschaft prüfen
If ctl.ControlType = acCombobox Then
If Mid(ctl.Name, 1, 3) = "cbo" AND Nz(ctl.Value, 0) <> 0 Then
'wenn es keine anderen Kombis ausser den 28 gibt, kann der erste Teil
'auch entfallen
'If Nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
End IfZitatfür set ctl = .Controls("Kombi_" & z)
Die Namen musst du natürlich an deine Benamsung anpassen.
gruss ekkehard
@Eberhard
Wonach muss ich denn da suchen?
Moin Ekkehard,
soweit, so gut.
Allerdings erhalte ich am Punkt Next ctl die Fehlermeldung 'Next ohne For'
Mein Code sieht derzeit so aus:
Dim ctl As Control
Dim sSQL As String
sSQL = "SELECT "
With Me
For Each ctl In .Controls
If ctl.ControlType = acComboBox Then
If Mid(ctl.Name, 1, 3) = "cbo" And nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
Next ctl
sSQL = Mid(sSQL, 1, Len(sSQL) - 2)
sSQL = sSQL & " FROM Laufende_Themen" ' Leerzeichen am Anfang beachten
Debug.Print sSQL; zum; Anschauen; Strg - G
End With
Dim z As Integer
For z = 1 To 28
Set ctl = .Controls("cbo_" & z)
If nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
Debug.Print sSQL
Next z
ZitatWonach muss ich denn da suchen?
frmSearch (denke ich)
Hallo!
For Each ctl In .Controls
If ctl.ControlType = acComboBox Then
If Mid(ctl.Name, 1, 3) = "cbo" And nz(ctl.Value, 0) <> 0 Then
sSQL = sSQL & ctl.Value & ", "
End If
Next ctl
.. Formatierung des Codes etwas angepasst.
Siehst du jetzt was fehlt?
Allg. Tipp zum Code-Schreiben:
Gleich nach dem Tippen von If das End If schreiben und danach erst den Code innerhalb des If-Blocks ergänzen.
Beispiel:
1.
With Me
End With
2.
With Me
For Each ctl In .Controls
Next ctl
End With
3.
With Me
For Each ctl In .Controls
If ctl.ControlType = acComboBox Then
End If
Next ctl
End With
4.
With Me
For Each ctl In .Controls
If ctl.ControlType = acComboBox Then
if Mid(ctl.Name, 1, 3) = "cbo" And nz(ctl.Value, 0) <> 0 Then
end if
End If
Next ctl
End Withusw.
Anm.: Bei mehreren verschachtelten if/Next-Blöcken kann eine Hilfsprozedur die Lesbarkeit erhöhen.
Gruß
Josef
Perfekt! ich danke Allen, die mich Unterstützt haben!