Neuigkeiten:

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

Mobiles Hauptmenü

Spalte aus Datenbanktabelle nach Excel exportieren

Begonnen von Michel007, November 21, 2022, 09:31:02

⏪ vorheriges - nächstes ⏩

Michel007

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?

markusxy

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.


Michel007

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.

markusxy

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.

Michel007

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.

markusxy

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.

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Michel007

Super, ich probiere es mal aus. Ich melde mich!

Michel007

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

Michel007

hi ekkehard, sorry für Markus ;)

für set ctl = .Controls("Kombi_" & z)

erhalte ich die Fehlermeldung unzureichender oder nicht ausreichend definierter Verweis ...

ebs17

Zitatein Formular zu erstellen aus dem sich die user mittels Kombifelder die benötigten Spalten zusammenzustellen
Knowhow 3.0 von Klaus Oberdalhoff
Da ist eine Lösung dafür enthalten.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

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 If
Zitatfü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?
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Michel007

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

ebs17

ZitatWonach muss ich denn da suchen?
frmSearch (denke ich)
Mit freundlichem Glück Auf!

Eberhard

Josef P.

#14
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 With
usw.

Anm.: Bei mehreren verschachtelten if/Next-Blöcken kann eine Hilfsprozedur die Lesbarkeit erhöhen.

Gruß
Josef