Neuigkeiten:

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

Mobiles Hauptmenü

Bestimmte Daten vom Formular an bestimmte Zellen an Excel übergeben

Begonnen von Lemmy2902, Mai 20, 2025, 14:03:56

⏪ vorheriges - nächstes ⏩

Knobbi38

Hallo Lemmy,

das tut mir leid, aber aus der Ferne kann ich das Problem so nicht nachvollziehen und das Thema Eval() möchte ich in diesem Zusammenhang auch nicht weiter vertiefen, da es m.M.n. für das Problem eine bessere Lösung gibt.

Knobbi38


Lemmy2902


Lemmy2902

was komisch ist wenn ich die qry starte wird mir nur der selektiere Datensatz angezeigt.

Bitsqueezer

Hallo,

versuche es mal mit [Forms] statt [Formulare].

Eval benötigt man nicht zum Auslesen eines Formularwertes.

Wenn man sichergehen möchte, kann man den Wert auch in einer VBA-Funktion auslesen und als Rückgabewert (Typ Variant) den ausgelesenen Wert verwenden. Das hat den Vorteil, daß man in der Funktion auch Fehler abfangen kann und ggf. einen Dummy-Wert zurückgeben kann. Ebenso kann man in der Funktion auch prüfen, ob das Formular geöffnet ist.
Die Funktion kann man dann im WHERE-Teil nach dem "=" verwenden, immer mit () am Ende (oder Übergabeparametern zusätzlich, falls benötigt).

Oder man verwendet PARAMETERS, die man auch im Abfragedesigner im Ribbon findet und dort eingeben kann, wenn man die Abfrage per VBA aufrufen will, kann man dann eine QueryDef verwenden und deren Parameters-Collection entsprechend mit dem gesuchten Wert befüllen.

Gruß

Christian

Lemmy2902

Public Sub test()
    Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim i As Long
     Dim oExcel As Object
     
     
     On Error Resume Next
     Err.Clear
     
     Set oExcel = CreateObject("Excel.Applikation")
     If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
     On Error GoTo 0
     
     Set rst = CurrentDb.OpenRecordset("qryProjektBericht")
     With oExcel
        .Visible = True
        .workbooks.Add
     For i = 0 To rst.Fields.Count - 1
            .Range("A6").Value = rst.Fields("projektID").Value
            .Range("B6").Value = rst.Fields("proStartDatum").Value
            .Range("C6").Value = rst.Fields("proNummer").Value
      Next i
    End With
    Set oExcel = Nothing
    rst.Close
End Sub

ist der Code vom Modul

SELECT tblProjekte.proBericht, tblProjekte.projektID
FROM tblProjekte
WHERE (tblProjekte.projektID=eval([Formulare]![frmProjekteVerwaltung]![lstAuftragWaelen]))
ORDER BY tblProjekte.projektID;

und das ist der SQL code.

Ist eigentlich alles wie es sein soll nur der fehler bleibt immer der selbe 3061

Hondo

Hallo,
hatte kürzlich den gleichen Fehler und was war die Ursache? Ein dummer kleiner Rechtschreibfehler.
Daher könnte ich mir denken dass lstAuftragWaelen eventuell lstAuftragWaehlen heißen sollte?

Helfen könnte dass man anstelle von:
Set rst = CurrentDb.OpenRecordset("qryProjektBericht")

einfach qryProjektBericht durch die Abfrage ersetzt und diese im Code debuggt.
Wie man debugt weißt du?

Direktfenster an,
In den Code schreiben:
Debug.Print Forms("frmProjekteVerwaltung").lstAuftragWaehlen

Außerdem, lass mal das eval() weg und verwende im Code den Begriff Forms anstatt Formulare.
Ansonsten wenn das nichts bringen sollte, mach mal ne abgespeckte Version deiner DB und lade sie hoch.

Gruß Andi

Knobbi38

#51
@christian:

Zitat von: Bitsqueezer am Mai 26, 2025, 08:29:24versuche es mal mit [Forms] statt [Formulare].
Spielt in diesem Fall keine Rolle, da in VBA eine Query aufgerufen wird.

ZitatEval benötigt man nicht zum Auslesen eines Formularwertes.
Doch, wenn die Query mit VBA ausgeführt werden soll. Dabei wird kein Expression-Service ausgeführt und deshalb kann die Formular-Referenz nicht ausgewertet werden.

@Lemmy:
Zitat... und die währe
Sag mal, liest du hier eigentlich die Antworten noch mit?

Zitat... was komisch ist wenn ich die qry starte wird mir nur der selektiere Datensatz angezeigt.
Das ist nicht komisch, sondern normales Access Verhalten. Die Begründung steht doch in dem Link zur Webseite von donkarl (Karl Donaubauer).

Zitat     For i = 0 To rst.Fields.Count - 1
            .Range("A6").Value = rst.Fields("projektID").Value
            .Range("B6").Value = rst.Fields("proStartDatum").Value
            .Range("C6").Value = rst.Fields("proNummer").Value
      Next i
Was möchtest du eigentlich damit erreichen?
Bei allem Respekt, aber wenn du mit Access/VBA weiterkommen möchtest, solltest du dir doch mal die Mühe machen, dir ein paar Grundlagen bezüglich Datenbanken und VBA-Programmierung anzueignen, da das kein Forum leisten kann.

Gruß Knobbi38

PS:
Vielleicht können andere Helfer hier für mich weiter machen?
Wird sind mittlerweile bei 50 Beiträgen ohne erkennbaren Fortschritt, daß sollte i.N. reichen.

Bitsqueezer

Hallo,

@Ulrich: Stimmt, hast Du recht, mit "Forms"-Auswertung. War mir auch noch nicht bekannt, sehr strange.
Ein Grund mehr, keine Form-Referenzen in Abfragen einzubauen.

@Lemmy:
Hier mal zwei Beispiele, wie man das lösen kann:

Public Sub TestQueryWithParams()
    Dim rs As DAO.Recordset
   
    'Set rs = CurrentDb.OpenRecordset("SELECT ID FROM qryFormTest WHERE ID = " & Forms!frmBestellungenMain.ID)
   
    Dim qd As DAO.QueryDef
    Set qd = CurrentDb.QueryDefs("qryFormTestParam")
    qd.Parameters("parID") = Forms!frmBestellungenMain.ID
    Set rs = qd.OpenRecordset()
   
    Stop
End Sub

Erste Abfrage im auskommentierten Teil ist ohne Parameter, zweite Abfrage hat einen Long Integer Parameter "parID" im Abfragedesigner erstellt bekommen und als Kriterium für "ID".

Ich würde die 2. Version verwenden. Der Test, ob das Formular geladen ist, kann und sollte natürlich auch bei der ersten Variante erfolgen.

Das Anpassen an Deine Tabellen/Abfragen sollte hoffentlich kein Problem sein.

Gruß

Christian

Lemmy2902


Hondo

Also,
da sind m.E. strukturelle Fehler gemacht worden.
Zuerst, die Abfrage gehört als SQL-String in den Code nicht als Referenz auf eine gespeicherte Abfrage.
Dann muss der Fehler abgefangen werden dass der Benutzer kein Projekt auswählt aber trotzdem auf Export klickt.
Entweder indem der Export-Button erst dann aktiv geschaltet wird wenn ein Projekt ausgewählt wurde oder als Abfrage im VBA-Code ob der Wert Null ist.

Anbei eine Version die einwandfrei funktioniert.
Und beachte mal die Schreibweise der Abfrage. keine Klammern, keine überflüssige Tabelle.Feld Bezeichnung, Zeilentrennung über Fortsetzungszeichen.

Du musst nur dann die Tabelle vor das Feld schreiben wenn es mehrere Tabellen gibt bzw. die Zuornung nicht eindeutig ist.

Private Sub expotierenExcel_Click()
    Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim i As Long
     Dim strSQL As String
     Dim oExcel As Object
     
     If IsNull(Forms("frmProjektVerwaltung").lstAuftragWaelen) Then
        MsgBox "Bitte wählen Sie ein Projekt aus!"
        Exit Sub
     End If
     
     strSQL = "SELECT projektID, proNummer, proBeschreibung, proProjektGeschlossen, proStartDatum " & _
                "FROM tblProjekte WHERE projektID=" & Forms("frmProjektVerwaltung").lstAuftragWaelen

     
     On Error Resume Next
     Err.Clear
     
     Set oExcel = CreateObject("Excel.Applikation")
     If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
     On Error GoTo 0
     
     Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
     With oExcel
        .Visible = True
        .workbooks.Add
     For i = 0 To rst.Fields.Count - 1
            .Range("A6").Value = rst.Fields("projektID").Value
            .Range("B6").Value = rst.Fields("proStartDatum").Value
            .Range("C6").Value = rst.Fields("proNummer").Value
      Next i
    End With
    Set oExcel = Nothing
    rst.Close
End Sub

Gruß Andi

Hondo

Und wenn du die Excel-Datei noch speichern möchtest und Excel beenden, dann schreibst du direkt vor "End With" folgendes:
        .Workbooks(1).SaveAs "Projekt_" & Forms("frmProjektVerwaltung").lstAuftragWaelen & ".xlsx"
        .Workbooks(1).Close
        .Quit

Gruß Andi

Ach ja, und an diejenigen gerichtet die meinen die Zeile:
If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
sei überflüssig, sollten diese doch einfach weglassen und es ausprobieren.
Den Fehler 429 könnt ihr ja dann selbst abfangen.

Lemmy2902

frage läuft das bei dir ich habe immer noch die selbe Fehlermeldung 3061

Lemmy2902

wenn ich die abfrage im direkt Fenster mache "Debug.Print Forms("frmProjektVerwaltung").lstAuftragWaelen" wird mir der Ausgewählte Datensatz angezeigt.

Hondo

Ich kann dir nicht auf den Schoß sitzen und dir jeden Tastendruck vormachen.
Ich hab dir gesagt, du musst lernen Fehler zu debuggen!
Gruß Andi

Dann sieh dir den kompletten SQL-STring im Direktfenster an, poste ihn hier.
Wo an welcher Stelle im Code tritt der Fehler auf?

Lemmy2902

ja da hast du recht muss noch einiges Lernen, danke es Klappt.