Microsoft Excel

Herbers Excel/VBA-Archiv

Verzögerung in Application.OnTime ???

Betrifft: Verzögerung in Application.OnTime ??? von: Spenski
Geschrieben am: 11.08.2014 22:21:26

Hi

Ich habe 5 tabellenblätter . vom tabellenblatt 1 starte ich ein makro , das aktiviert tabelleblatt2 , nach einiger zeit tabellenblatt 3 usw.
Soll als Anzeigetafel dienen.

Was mich wundert ist das der code nicht den ablauf nimmt wie er soll ( 2,3,4,5,2,3,4,5,2usw.) sondern immer durcheinander. jdf bei mir auf dem PC
aber es lief auch schonmal vernünftig wie vorgegeben.

wird tabellenblatt aktiviert unterbricht der code

können da verzögerungen entstehen und sich die codes überschneiden??

Bsp. Datei
https://www.herber.de/bbs/user/92024.xlsm

gruss
christian

  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Daniel
Geschrieben am: 11.08.2014 23:07:53

Hi
überarbeite erstmal deinen Code.
das wichtigste wäre, Option Explicit zu aktivieren und zu prüfen, ob du nicht einen Variablenfehler drin hast.
Es muss zwar nicht sein, dass das die Ursache ist, aber einen Code der nicht mit Option Explicit erstellt wurde, werde ich nicht auf Fehler untersuchen.
Warum und wieso steht hier:
http://www.online-excel.de/excel/singsel_vba.php?f=4

ausserdem ist der Code zu komplex.
Warum teilst du das Einblenden und das Aufrufen des nächsten Einblendens in zwei Makros auf?
das halbiert die Anzahl der Makros.

im Prinzip sollte ein Makro für die Schleife reichen (Makros können sich auch selbst aufrufen) und dann noch eines fürs Starten und eines fürs Stoppen:

Option Explicit
Public t As Boolean
Public Zeit As Date

Sub start()
t = True
Schleife
End Sub

Sub Schleife()
Static i As Long
Sheets(i + 2).Select
i = (i + 1) Mod 4
If t Then
    Zeit = Now + TimeSerial(0, 0, 5)
    Application.OnTime Zeit, "Schleife"
End If
End Sub
um abzusichern, dass sich die Datei nicht wieder öffnet, fall jemand die Datei schließt, ohne die Schleife zu stoppen, brauchst du noch folgenden Code im Modul "DieseArbeitsmappe"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Zeit > Now Then Application.OnTime Zeit, "Schleife", schedule:=False
End Sub
Gruß Daniel


  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Spenski
Geschrieben am: 12.08.2014 14:56:49

hallo Daniel...das sollte der verzeweifelte versuch werden mal was selber zu machen.

hab jetzt den code genommen den du gepostet hast und noch eine if t then abfrage eingebaut, damit wenn in der schleife t auf false gesezt wird nicht nochmal das blatt gewechselt wird...das sollte auch der sinn meiner vielen codes sein.

Option Explicit
Public t As Boolean
Public Zeit As Date

Sub start()
t = True
Schleife
End Sub

Sub Schleife()
Static i As Long
If t Then
Sheets(i + 2).Select
i = (i + 1) Mod 4
If t Then
    Zeit = Now + TimeSerial(0, 0, 5)
    Application.OnTime Zeit, "Schleife"
End If
End If
End Sub
wenn ich tabellenblatt 1 activiere wird t auf false gesetzt
Private Sub Worksheet_Activate()
 t = False
End Sub
dank dir für deine tipps und den link

gruss
christian


  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Daniel
Geschrieben am: 12.08.2014 16:53:08

Hi
auch das lässt sich noch vereinfachen.
das t ist in diesm Fall unnötig, wenn du die entsprechende Prüfung in die Schleife einbaust:

Sub Schleife()
Static i As Long
Sheets(i + 2).Select
i = (i + 1) Mod 4
IF ActiveSheet.Index <> 1 then
    Zeit = Now + TimeSerial(0, 0, 5)
    Application.OnTime Zeit, "Schleife"
End If
End Sub
Gruß Daniel


  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Spenski
Geschrieben am: 12.08.2014 18:56:23

aber lieg ich jetzt falsch wenn ich sage das wenn ich innerhalb dieser 5sec (können später auch 30sec werden , ist noch nicht definiert)...

...also innerhalb: Zeit = Now + TimeSerial(0, 0, 5) .....

...das tabellenblatt 1 activiere er trotzdem nach ende des timers den oberen Teil bis zur IF abfrage ausführt und damit wieder von Tabellenblatt 1 auf ein anderes Springt???


gruss und danke für deine Hilfe
Christian


  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Daniel
Geschrieben am: 12.08.2014 19:10:27

Stimmt.
du musst die Abfrage nach dem Aktuellen Sheet an den Anfang verschieben, bevor du die Selektion wechselst.
kannst das mit dem t natürlich auch drin lassen, ist sicherer, manchmal ist einfach dann doch zu einfach.
bei 30 sec wäre dann auch die frage was passieren soll, wenn du innerhalb dieser Zeitspanne wieder auf ein anderes Blatt zurückwechselst.
Soll dann die Schleife automatisch weiter laufen oder gestoppt bleiben bis du wieder den Button drückst.
Gruß Daniel


  

Betrifft: AW: Verzögerung in Application.OnTime ??? von: Spenski
Geschrieben am: 12.08.2014 19:27:23

Die schleife soll nur angehalten werden wenn Blatt 1 aktiviert wird (bzw die Schleife läuft aus aber danach darf nix mehr passieren)

Blatt 1 ist ein eingabeformular, wenn die Bediener den auftragsverlauf eingegeben haben wird ein Button gedrückt und 4 Blätter im Wechsel angezeigt .also dient die Mappe gleichzeitig als Anzeigetafel.

Werde deine Version aber mit der doppelten if t abfrage mal verwenden und schauen wie es in der Praxis läuft.

Dank dir auf jedenfall für die ganzen Erklärungen
Christian