Hallo,
ich habe mir für die Bearbeitung größerer Datensätze, welche z.B. mit Do Loop Schleifen durchlaufen werden ein Fortschrittsfenster gebaut. Ein einfaches Fenster in dem steht "Fortschritt: x von y erledigt".
In einem Modul habe ich eine Sub, welche x und y aus der Do Loop Schleife empfängt und die Werte an das geöffnete Fortschrittsfenster weitergibt, in dem die Sub einfach das Textfeld aktualisiert (frm.txtFeld = Fortschritt: " & lngX & " von " & lngY & " erledigt."
Leider flackert dieses Fortschrittsfenster bzw. der Text mit jeder Änderung. Das sieht nicht professionell aus. Gibt es hier andere Ansätze wie das Flackern vermieden werden kann?
Hallo,
Zitatich habe mir für die Bearbeitung größerer Datensätze, welche z.B. mit Do Loop Schleifen durchlaufen werden ein Fortschrittsfenster gebaut.
wahrscheinlich wäre eine Aktualisierungsabfrage besser geeignet als Schleifen. Sollte man in einer Datenbank eh vermeiden.
Und mit einer Abfrage braucht es dann wahrscheinlich keinen Balken mehr, weil die Abfrage das viel schneller erledigt. Und der Balken verlangsamt das Ganze noch zusätzlich, der braucht ja auch Ressourcen des Rechners.
Was wird denn bearbeitet in den Datensätzen ?
Bei mir flackert da nichts. Nicht vergessen, DoEvents auszulösen direkt nach der Aktualisierung des Textfelds.
Fragen:
Wie wird das geöffnete Formular denn angesprochen? Wird das Fortschrittsformular evtl immer wieder neu aufgerufen?
Hängt an dem Textfeld vielleicht irgendein Ereignis?
Ja, erstmal vielen Dank für Eure Antworten.
Eine Aktualisierungsabfrage bringt mich leider nicht in jedem Fall weiter denn diese kann ich ja nur anwenden, wenn Aktualisierungen in den Datentabellen nötig sind, welche auf reinem SQL basieren. Wenn z.B. Mailings zu senden sind oder eine größere Anzahl an Daten anderweitig zu bearbeiten sind, sind Recordsets notwendig, welche dann durchlaufen werden. Ich habe dieses Fortschrittsfenster bewusst nur für Arbeiten gewählt, die länger / lange dauern.
Ansonsten, das Textfeld hängt an keinem Ereignis, ein Do Events ist in der Schleife selbst enthalten. Das Formular wird auch nicht mit jedem durchlaufen der Schleife neu geöffnet, es wird nur das Feld aktualisiert.
Angesprochen wird das Form und das Feld aus einer Sub heraus via
frm = forms("frmFortschritt")
frm.TxtFeld = "Fortschritt: " & lngAktuell & " von " & lngGesamt & " erledigt."
Ich hab das mal folgendermassen ausprobiert, und mich stört kein Zucken.
Im Formular gibt es eine public Routine:
Public Sub Fortschritt(ByVal lngAktuell As Long, ByVal lngGesamt As Long)
txt01.Value = "Fortschritt: " & lngAktuell & " von " & lngGesamt & " erledigt."
DoEvents
End Sub
Im Modul habe ich folgende Testroutine:
Private Sub meineRoutine()
DoCmd.OpenForm ("frmFortschritt")
Dim frm As Object
Set frm = Forms("frmFortschritt")
Dim lngGesamt As Long
lngGesamt = 100
Dim lngAktuell As Long
For lngAktuell = 1 To lngGesamt
Debug.Print lngAktuell
Call frm.Fortschritt(lngAktuell, lngGesamt)
Warten (10) 'API-Funktion sleep aufrufen
Next lngAktuell
End Sub
Das spärlich ausgefallene und unformatierte Code-Zitat stellt in der gezeigten Form schon einmal keine gültige VBA-Syntax dar und trägt kaum zur Ursachenfindung des Problems bei. Du müsstest also schon etwas mehr von Deiner Programmierkunst preisgeben, um eine ähnliche Szenerie nachstellen und analysieren zu können.
Am besten ein Label (Bezeichnungsfeld) nehmen und mit lbl.Caption den Inhalt aktualisieren. Dann flackert gar nichts.