Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Wie kann ich mehrere Application.OnTime stoppen?

Betrifft: Wie kann ich mehrere Application.OnTime stoppen? von: Rene
Geschrieben am: 26.07.2014 07:21:10

Hallo,

ich habe ein kleines Problem mit einigen Application.OnTime ´s.
Ich habe ein Userform in den ich folgende Daten eintrage.

1 Checkbox ob aktiv oder nicht
1 Textfeld für Dateiname
3 Textfelder für die Startzeit (Format hh:mm:ss)
3 Felder wie lange die Datei ausgeführt wird (Format hh:mm:ss)

Diese Felder habe ich jeweils 4x. Über Excel lasse ich 2 Präsentationen
und 2 Youtube Videos in einem Arbeitsblatt zwischenspeichern, damit diese dann
später in der Reihenfolge

Präsentation
Video
Präsentation
Video

je nachdem ob aktiviert oder nicht starten kann.
Über Application.OnTime wird festgelegt wann und vor allem wie lange die Datei ausgeführt wird.

Bsp.



Public Sub Run_P1T()
If UserForm1.CheckBox1.Value = True Then
Dim EndeZeit As Date
praesent1 = Now + TimeValue(Sheets("Overview").Range("C6").Value & ":" & Sheets("Overview"). _
Range("D6").Value & ":" & Sheets("Overview").Range("E6").Value)
Application.OnTime praesent1, "Run_P1"
Else
ytstarter.Run_YT1T
End If
End Sub

Sub Run_P1()
Sheets("Start").Range("N25").Value = "läuft"
Dim ppApp As Object
Dim ppP As Object
Dim sFile As String
laufzeit = Now + TimeValue(Sheets("Overview").Range("C7").Value & ":" & Sheets("Overview").Range("D7").Value & ":" & Sheets("Overview").Range("E7").Value)
sFile = Sheets("Overview").Range("C5").Value
Set ppApp = CreateObject("PowerPoint.Application")
ppApp.Visible = msoTrue
Set ppP = ppApp.Presentations.Open(sFile)
ppP.SlideShowSettings.Run
Application.Wait laufzeit
ppApp.Quit
Sheets("Start").Range("N25").Value = "gestoppt"
Set ppP = Nothing
Set ppApp = Nothing
Call ytstarter.Run_YT1T
End Sub
Das funktioniert auch alles super.
Mit dem Start der Youtube Videos ebenfalls, welche wie folgt aufgerufen werden:

Sub Run_YT1T()
If UserForm1.CheckBox3.Value = True Then
yt1time = Now + TimeValue(Sheets("Overview").Range("C16").Value & ":" & Sheets("Overview").Range("D16").Value & ":" & Sheets("Overview").Range("E16").Value)
Application.OnTime yt1time, "Run_YT1"
Else
FlexTimer.Run_P2T

End If
End Sub
Sub Run_YT1()
Sheets("Start").Range("N26").Value = "läuft"
Dim laufzeit As Double
laufzeit = Now + TimeValue(Sheets("Overview").Range("C17").Value & ":" & Sheets("Overview").Range("D17").Value & ":" & Sheets("Overview").Range("E17").Value)
Set IE = CreateObject("InternetExplorer.Application")


With IE

.MenuBar = 0

.Toolbar = 0

.StatusBar = 0

.navigate "http://www.youtube.com/embed/" & Sheets("Overview").Range("C14").Value & "?autoplay=1"

.Visible = 1
apiShowWindow IE.hwnd, SW_MAXIMIZE

End With
Application.Wait laufzeit
On Error GoTo weiter
IE.Quit
weiter:
Sheets("Start").Range("N26").Value = "gestoppt"
Set IE = Nothing
Call FlexTimer.Run_P2T
End Sub
Nun zu meinem eigentlichen Problem.
Da ich ja mehrere Application.OnTime verwende, benötige ich auch eine Stoppfunktion.

Ich habe versucht das ganze mittels
Application.OnTime praesent2, "Run_P2T", Schedule:=False

zu stoppen. Leider ohne Erfolg da ich immer einen Fehler erhalte.
Wie kann ich alle Application.OnTime stoppen lassen?

Also sprich:
Application.OnTime praesent1, "Run_P1"
Application.OnTime praesent2, "Run_P2"
Application.OnTime yt1time, "Run_YT1"
Application.OnTime yt2time, "Run_YT2"

Wäre super wenn ihr mir dabei helfen könntet.

Danke

  

Betrifft: AW: Wie kann ich mehrere Application.OnTime stoppen? von: Daniel
Geschrieben am: 26.07.2014 08:21:21

Hi

Du musst sicherstellen, dass du beim Stoppen genau dieselbe Zeit verwendest wie beim Starten.

Hierzu musst du dir die Startzzeit in einer projektweit gültigen Variable merken und beim Stoppen wiederverwenden. Diese Variable darf dazwischen natürlich nicht verändert werden.

Eine projektweit gültige Variable erstellt du, indem du die Variable in einem allgemeinen Modul oberhalb der Makros direkt unter Option Explcit als Public deklariert.


Beispiel

Option Explicit
Public praesent1 as Date


Sub Starten()
praesent1 = Now + Timeserial(1, 0, 0)
Application.OnTime praesent1, "Run_P1T"
End Sub

Sub Stoppen()
If praesent1 > Now Then Application.OnTime praesent1, "Run_P1T", Schedule:=False
End Sub
Gruß Daniel


  

Betrifft: AW: Wie kann ich mehrere Application.OnTime stoppen? von: Rene
Geschrieben am: 26.07.2014 20:39:03

danke für die antwort.
schaut ganz gut aus, zumindest für die präsentationen.

allerdings habe ich jetzt folgendes problem.
da die internetseiten ja geöffnet werden, ist in excel während die seite läuft
nix machbar, da lädt einfach die seite im hintergrund und ich kann nix zum stoppen anklicken.

schließt die seite und ich klick dann auf stopp passiert nix, da ja zu dem zeitpunkt noch kein timer läuft. aber die seite startet nach kurzer zeit erneut. also müsste ich das ganze irgendwie abfangen sobald man auf stopp klickt damit die schleife

präsentation 1 -> youtube 1 -> präsentation 2 -> youtube 2 
geschlossen wird. ist das realisierbar?


  

Betrifft: AW: Wie kann ich mehrere Application.OnTime stoppen? von: Rene
Geschrieben am: 26.07.2014 20:59:44

das mit dem haken, hätte ich vielleicht mal früher sehen soll.
sorry für das erneute posting aber ich mach mal den haken rein, dass der thread weiter offen ist...


  

Betrifft: AW: Wie kann ich mehrere Application.OnTime stoppen? von: Rene
Geschrieben am: 26.07.2014 21:49:20

ok ich glaub ich habe die lösung....
beim klick auf einen button, nenne wir ihn einfach stopp

mach ich einfach folgendes

If praesent1 > Now Then Application.OnTime praesent1, "Run_P1", Schedule:=False
If praesent2 > Now Then Application.OnTime praesent2, "Run_P2", Schedule:=False
thisWorkbook.Sheets("Overview").Range("Q4").Value = "stopp"
ThisWorkbook.Sheets("Overview").Range("Q5").Value = "stopp"
ThisWorkbook.Sheets("Overview").Range("Q6").Value = "stopp"
ThisWorkbook.Sheets("Overview").Range("Q7").Value = "stopp"
ThisWorkbook.Sheets("Overview").Range("Q8").Value = "stopp"
ytstarter.yt1stop
also erstmal irgendwo zwischenspeichern das angehalten werden soll

da die schleife hier noch läuft
gehts natürlich bei ytstarter.yt1stop wie folgt weiter
If yt1time > Now Then Application.OnTime yt1time, "Run_YT1", Schedule:=False
If yt2time > Now Then Application.OnTime yt2time, "Run_YT2", Schedule:=False
ThisWorkbook.Sheets("Start").CommandButton1.Enabled = True
ThisWorkbook.Sheets("Start").CommandButton3.Enabled = True
ThisWorkbook.Sheets("Start").CommandButton7.Enabled = True
erstmal zur sicherheit
bei den schleifen selbst, also bei den timern, steht jetzt folgendes
Public Sub Run_P1T()
If ThisWorkbook.Sheets("Overview").Range("Q4").Value = "stopp" Then GoTo ende
If UserForm1.CheckBox2.Value = True Then
praesent1 = Now + TimeValue(Sheets("Overview").Range("C6").Value & ":" & Sheets("Overview"). _
Range("D6").Value & ":" & Sheets("Overview").Range("E6").Value)
Application.OnTime praesent1, "Run_P1"
Else
ytstarter.Run_YT1T
End If
Exit Sub
ende:
Call stopp_all

also hier wird jetzt erstmal geschaut ob in der zuvor zwischengespeichten zelle
stopp steht, wenn ja gehts zu stopp_all

und damit beim starten das zuvor gespeicherte stopp wieder raus geht, einfach
ThisWorkbook.Sheets("Overview").Range("Q4:Q8").Value = ""

in die startsub mit reingeschrieben.

vielleicht keine super lösung, wahrscheinlich sogar eher eine ziemlich schlammpige,
jedoch funktioniert das ganze so recht gut. werd das mal bisserl testen und schauen.

bisher gehts zumindest. hoffentlich bleibt das auch so.


 

Beiträge aus den Excel-Beispielen zum Thema "Wie kann ich mehrere Application.OnTime stoppen?"