redderblock
Goto Top

Fehler im VBA-Code, Formular-Kriterium wird nicht gelöscht oder nicht überschrieben

Hallo zusammen,

mein Code soll das Datum aus einem Formularfeld als Kriterium in eine Abfrage einsetzen und das Abfrageergebnis dann in Excel ausgeben. Das klappt auch beim ersten Durchgang, aber beim zweiten Versuch mit anderem Startdatum erhalte ich weiterhin das alte Ergebnis. Ich habe das Startdatum "überwacht", es bleibt konstant auf dem zuerst eingegebnenen Wert, bis ich Access neu starte.

Des weiterem habe ich das Gefühl, dass ich aus dem DoCmd.Hourglass nicht mehr rauskomme, wenn ein Fehler auftritt, obwohl ich ein "On Error go To" definiert habe.

Optimal wäre es, wenn bei fehlerhafter Angabe des Datum im Formular ein Fehler erscheinen würde.

Folgendes war allerdings nicht erfolgreich:

If IsNull(Me.Text10.Value) Then
    MsgBox "Bitte geben Sie ein Datum im Format TT.MM.JJJ an"  
    Exit Sub
End If

Mein gesamter Code lautet wie folgt - Vielen Dank für euer Feedback:

Private Sub Bild13_Click()

   On Error GoTo ERR_Bild13_Click

    Dim iCols As Integer
    Dim rs As DAO.Recordset
    Dim ws As Object
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim Startdatum As String
                
    DoCmd.Hourglass True
            
    Startdatum = Forms!Main!Text10
        
    Set db = CurrentDb
    Set qdf = db.QueryDefs("FDB_Eskalationsliste_Abwicklung_1Step")  
    qdf.Parameters("[Startdatum]") = Startdatum  

    'Neue Excel Datei, Arbeitsmappe und Worksheet erstellen  
    Set ws = CreateObject("Excel.Application")  
    ws.workbooks.Add

    Set rs = qdf.OpenRecordset(dbOpenDynaset)

    ' Nur was machen, wenn Daten vorhanden sind  
    If Not rs.EOF Then
        rs.MoveFirst
        ' Daten nach Excel kopieren  
        For iCols = 0 To rs.Fields.Count - 1
            ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
        Next
        ws.Range(ws.Cells(1, 1), _
            ws.Cells(1, rs.Fields.Count)).Font.Bold = True
        ws.Range("A2").CopyFromRecordset rs  
    End If
 
    DoCmd.Hourglass False
    
    ws.Visible = True
    
    Set ws = Nothing
    
    qdf.Close: Set qdf = Nothing
    rs.Close: Set rs = Nothing
    Set db = Nothing
    
EXIT_Bild13_Click:
    Exit Sub

ERR_Bild13_Click:
    MsgBox "Beim Daten-Export ist ein Fehler aufgetreten."  
Resume EXIT_Bild13_Click

End Sub

Content-Key: 190258

Url: https://administrator.de/contentid/190258

Printed on: April 19, 2024 at 14:04 o'clock

Member: NetWolf
NetWolf Aug 27, 2012 at 17:58:12 (UTC)
Goto Top
Grüß Gott,

Des weiterem habe ich das Gefühl, dass ich aus dem DoCmd.Hourglass nicht mehr rauskomme, wenn ein Fehler auftritt, obwohl ich ein "On Error go To" definiert habe.
und wo steht da, dass Hourglass = False ist? Hellsehen kann Access nicht face-smile

Optimal wäre es, wenn bei fehlerhafter Angabe des Datum im Formular ein Fehler erscheinen würde.
nichts leichter als das

Folgendes war allerdings nicht erfolgreich:

> If IsNull(Me.Text10.Value) Then
>     MsgBox "Bitte geben Sie ein Datum im Format TT.MM.JJJ an"  
>     Exit Sub
> End If
> 

Eine Variable kann drei Zustände haben:
- mit Daten gefüllt (z.B. 12.06.2012, oder auch nur die Trennpunkte xx.xx.xx)
- keine Daten (z.B. "" ohne etwas zwischen den Anführungsstrichen)
- oder NULL (nichts, rein gar nichts)

Du prüfst auf NULL und wirst bei einem Datum i.d.R. immer die Punkte haben, also eine Information (wenn auch kein Datum).
Übersetzte NULL ins deutsche mit "Nichts".

Wichtig ist die Feldtyp-Definition als Datum. Dann kannst du mit isDate() prüfen, ob es sich um ein Datum handelt.


Mein gesamter Code lautet wie folgt - Vielen Dank für euer Feedback:
@@--Dim Startdatum As String@@

nö, ein Datum ist ein Datum und kein String!!!
Dim Startdatum As date

Startdatum = Forms!Main!Text10
Das Feld Forms!Main!Text10 ist hoffentlich als Datum auf dem Formular formatiert!!
Tipp: wenn diese SUB im Formular läuft, reicht ein Me.Text10

qdf.Parameters("[Startdatum]") = Startdatum
Was soll diese Anweisung? Bitte beschreibe die Funktion mal ganz genau.

'erst mal zum Ende, dann zurück zum Anfang
rs.MoveLast
rs.MoveFirst

ws.Visible = True
'warum?
Set ws = Nothing
'wird doch hier gelöscht!

qdf.Close: Set qdf = Nothing
qdf.Close reicht vollkommen

rs.Close: Set rs = Nothing
rs.Close reicht vollkommen

Set db = Nothing
'wirklich? du hast vorher mit Set db = CurrentDb geschrieben = nutzte die aktuelle Datenbank, die gerade offen ist.
'hiermit machst du sie zu!?

ERR_Bild13_Click:
'kein Hourglass = false 'so wird das nichts mit dem Nachbarn face-smile

btw warum nutzt du nicht die Funktion Transferspreadsheed? Ist doch viel einfacher....

Grüße aus München
Wolfgang
(Netwolf)
Member: redderblock
redderblock Aug 28, 2012 at 08:39:05 (UTC)
Goto Top
Hallo Wolfgang,

danke erst einmal. Das löst mein Kernproblem aber immer noch nicht:

Mein zuerst eingegebenes Startdatum wird nach dem End Sub scheinbar gespeichert und auch bei einem im Formular geändertem Startdatum wieder verwendet.

Löse ich den Code erneut aus, ist das Startdatum zwar zunächst auf 00:00:00, ab Zeile 16 wird es aber auf das beim ersten Code-Durchlauf gewählte Datum gesetzt.

Das Formular-Feld habe ich als Datum formatiert, Dim Startdatum As date ist auch drin. Hourglass false war bereits in Zeile 38 vorhanden, ich habe es aber zusätzlich in Zeile 53 eingefügt.

qdf.Parameters("[Startdatum]") = Startdatum - Hier wird das Datum als Kriterium in meiner Abfrage qdf gesetzt.

Zwischenzeitlich dachte ich der Exit Sub in Zeile 49 führt dazu, dass die Variablen nicht gelöscht werden, aber ohne Error-Schleife habe ich das gleiche Problem.

ws = Nothing führt nicht dazu, dass das Startdatum gelöscht wird.

db.close anstelle Set bd nothing bringt keine Verbesserung.

Danke für eure Hilfe - ich suche immer noch nach einer Lösung.
Member: redderblock
redderblock Aug 28, 2012, updated at Aug 29, 2012 at 09:05:43 (UTC)
Goto Top
Die Lösung ist:

Mit einer echten Befehlsschaltfläche funktioniert's. Ich habe die Buttons leider aus Bildern gebaut und mit einem Code belegt.

Wenn man Bilder nimmt gilt:
Das Formularfeld behält solange seinen Wert, bis der Datensatz gewechselt wird.

Eine neue Eingabe bei einem Bild-Button funktioniert also, wenn man in ein anderes Feld eines Formulars geht.