Hallo,
eine wirklich rundum befriedigende Lösung für dein
Problem kann ich dir nicht anbieten. Du könntest mit
Application.OnTime Now + TimeSerial(0, 30, 0), "Beenden"
(zweckmäßigerweise in der Sub Workbook_Open) den Excel-
Timer starten, der nach 30 Minuten (oder einer anderen
Zeit, die du für angemessen hältst) eine Prozedur startet.
Im Beispiel heißt sie "Beenden", sie muss Public sein, in
einem Modul stehen und die gewünschte Aktion auslösen
(MsgBox, Speichern/Beenden oder was auch immer).
Das kann der User dadurch umgehen, dass er beim Öffnen
der Datei die Makros deaktiviert. Du müsstest also die
Funktionalität der Arbeitsmappe bei deaktivierten Makros
einschränken, z. B. dadurch, dass vor dem Speichern
(Sub Worksheet_BeforeSave) alle Worksheets bis auf ein
leeres Blatt mit
Worksheets(Index).Visible = xlSheetVeryHidden
ausgeblendet werden. Blätter, die auf VeryHidden gesetzt
sind, kann der User auch nicht im Menü Format - Blatt -
Einblenden wieder sichtbar machen. Das müsste ebenfalls
in der Sub Workbook_Open geschehen, indem die Visible-
Eigenschaft wieder auf True gesetzt wird (und natürlich
nach dem Speichern, damit der User bei Bedarf weiter
arbeiten kann).
Allerdings ist es so, dass der Excel-Timer ziemlich leicht
"außer Gefecht gesetzt" werden kann. Es genügt, dass beim
User mitten in einer Eingabe das Telefon klingelt und er
ohne die Eingabe zu beenden "entschwindet", denn im
Eingabemodus werden OnTime-Prozeduren nicht ausgeführt.
Derselbe Effekt tritt ein, sobald ein integrierter Dialog
oder einfach eine MsgBox angezeigt wird.
Zu beachten wäre außerdem, dass der Timer beim Schließen der
Datei explizit zurückgesetzt werdwn muss. Wenn der User zwar
die betreffende Datei schließt, aber Excel nicht beendet,
wird sonst beim Ablauf der eingestellten Zeit die Datei
erneut geladen, um das Makro auszuführen. Dazu musst du
die Zeit nicht direkt angeben, sondern in einer globalen
Variablen speichern, die du in einem Modul mit
Public dteEnde As Date
deklarieren musst. Das obige Beispiel wäre dann wie folgt
abzuwandeln:
dteEnde = Now + TimeSerial(0, 30, 0)
Application.OnTime dteEnde, "Beenden"
In der Sub Workbook_BeforeClose musst du den Timer
zurücksetzen:
Application.OnTime dteEnde, "Beenden", , False
Alles in allem wäre das, jedenfalls für dich als bekennender
VBA-Neuling ein ziemlicher Aufwand für ein nicht völlig
befriedigendes Ergebnis.
Gruß
|