Bei Inaktivität: Signalton, UserForm u. Schliessen
20.05.2004 23:45:09
BennyBunny
ich möchte ein Makro basteln, welches nach 10 Sekunden Inaktivität (also keine Änderungen mehr in der Excel-Tabelle) eine UserForm erzeugt, die die Warnmeldung ("Die Datei wird in 5 Sekunden automatisch geschlossen") erhält und einen Button ("Jetzt nicht schliessen") zum Abbrechen und wieder Rücksetzen des 10s-Timers beinhaltet.
Sowas gibt es schon von Hajo (Danke):
In die Arbeitsmappe kommt:
Option Explicit
' erstellt von Hajo.Ziplies@web.de 28.12.03
' http://home.media-n.de/ziplies/
Private Sub Workbook_Open()
Zeitmakro
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime EarliestTime:=ET, Procedure:="Start", Schedule:=False
Application.OnTime EarliestTime:=ET1, Procedure:="Schließen", Schedule:=False
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.OnTime EarliestTime:=ET, Procedure:="Start", Schedule:=False
Zeitmakro
End Sub
In den Button der UserForm kommt:
Option Explicit
' erstellt von Hajo.Ziplies@web.de 28.12.03
' http://home.media-n.de/ziplies/
Private Sub UserForm_Initialize()
BoZu = False
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' Damit mit X nicht geschloßen werden kann
If CloseMode = 0 Then
MsgBox "Bitte schließen Sie die Anwendung mit der -Ende- Schaltfläche.", vbCritical
Cancel = 1
End If
End Sub
Private Sub CMD_Nein_Click()
Application.OnTime EarliestTime:=ET1, Procedure:="Schließen", Schedule:=False
Zeitmakro
BoZu = True
Me.Hide
End Sub
Und in ein Modul kommt:
Option Explicit
' erstellt von Hajo.Ziplies@web.de 28.12.03
' http://home.media-n.de/ziplies/
Public ET As Variant
Public ET1 As Variant
Public BoZu As Boolean
Sub Zeitmakro()
BoZu = False
On Error Resume Next
Alarm
Application.OnTime EarliestTime:=ET1, Procedure:="Zeitmakro", Schedule:=False
ET = Now + TimeValue("00:00:15")
Application.OnTime ET, "Start"
End Sub
Sub Start()
ET1 = Now + TimeValue("00:00:10")
Application.OnTime ET1, "Schließen"
UserForm1.Show
End Sub
Sub Schließen()
Unload UserForm1
If BoZu = False Then ThisWorkbook.Close True
End Sub
Soweit so gut. Leider ist da aber auch noch irgendein Fehler drin: Hat man die UserForm bei ersten Mal weggeklickt, dann wird die Mappe beim nächsten TimeOut nicht mehr automatisch geschlossen. Den Fehler habe ich noch nicht gefunden.
Jetzt möchte ich aber gerne noch ein akustisches Signal, sobald diese UserForm erscheint.
Nach 10 Sekunden Inaktivität soll also 5 Sekunden lang ein Ton erzeugt werden, am liebsten einen Intervall-Ton, eben für die Dauer der UserForm.
Den Ton habe ich mir auch schon zusammengesucht:
In ein Modul kommt:
Declare Function Ton& Lib "kernel32" _
Alias "Beep" _
(ByVal dwFrequenz As Long, _
ByVal dwDauer As Long)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Alarm()
Dim i As Integer
For i = 1 To 2
Ton 440, 100
Sleep 50 '50 Millisekunden Pause
Next i
End Sub
Der Intervall-Ton klappt auch.
Nur wie bekomme ich jetzt den (Dauer-)Ton und die UserForm-Abfrage nebeneinander zum laufen ? Rufe ich zuerst den Ton auf, ist alles für die Dauer des Tons blockiert. Rufe ich zuerst die UserForm auf, muss ich erst den Button drücken, bevor der Ton kommt ...
Ich würde mich sehr freuen, wenn mir ein Excel-Freak ein paar Tipps geben könnte.
Vielen Dank und schöne Grüße,
BennyBunny
PS: Hier die Datei: https://www.herber.de/bbs/user/6575.xls