Hallo Reiti,
der letzte Tag eines Monats ist zugleich der erste Tag des Folgemonats minus 1. Mit der DateSerial()-Funktion kannst du auf diese Weise den letzten Tag des aktuellen Monats ermitteln:
datLetzterTag = DateSerial(Year(), Month() + 1, 0)
Das funktioniert auch problemlos mit Schaltjahren und auch mit Jahresenden, z.B. ist der 31.12.2007 identisch mit dem 0.13.2007. Mit der TimeSerial()-Funktion kannst du die passende Uhrzeit noch hinzuaddieren:
datUhrzeit = TimeSerial(16, 0, 0)
Um festzustellen, wann der Zeitpunkt gekommen ist, kannst du entweder das Timer-Ereignis eines (ggfs. unsichtbaren) Formulars benutzen, das im Sekundentakt eine geeignete Prüfung der aktuellen Uhrzeit durchführt. Falls du kein Formular willst, dann geht das auch über ein reguläres Modul, wobei du dort den fehlenden Timer durch eine Schleife ersetzen musst. Dabei solltest du die dabei auftretende Prozessorlast vermeiden, indem du die Sleep-Prozedur aus der Windows-API verwendest, die legt dir Access für die angegebene Zeitspanne schlafen.
Deklarationszeile im Kopf des Moduls:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Folgendes Beispiel lässt die Anwendung 5 Sekunden schlafen:
Sleep 5000
Damit Access dann auch noch auf deine Benutzereingaben reagiert, solltest du bei jedem Schleifendurchlauf noch die DoEvents-Anweisung ausführen.
Prinzipiell sollte das alles ungefähr so aussehen:
Do Until blnExternesAbbruchKriterium = True
If Now() = DateSerial(Year(), Month()+1, 0) + TimeSerial(16, 0, 0) Then
AbfrageAusführen
End If
Sleep 1000
DoEvents
Loop
Die Variable blnExternesabbruchKriterium repräsentiert eine von vielen Möglichkeiten, mittels eines äußeren Eingriffs die Schleife auch mal wieder zu beenden. Endlosschleifen sollten vermieden werden. :-)
Dann gäbe es noch eine weitere offene Frage. Willst du den Code ausschließlich zum geeigneten Zeitpunkt ausführen oder sollen evtl. verpasste Zeitpunkte nachträglich aufgearbeitet werden? Im ersten Fall reicht ein Zeitvergleich wie oben im Beispielcode. Im zweiten Fall müssten du zum einen den Vergleichsoperator >= heranziehen und auch zusätzlich in einer Tabelle festhalten, welche Monate bereits erfolgreich abgearbeitet wurden, um mehrfache Verarbeitungen zu verhindern.
Gruß
erik