Code ausführen, wenn Zelle bestimmten Wert hat
#21
Vielen Dank! Gesamtvorhaben hört sich so großartig an. Mehr als das ist es eigentlich nicht. Ich beschreibe es einmal komplett:

1. Ich habe 2 Tabellenblätter - Zeit & Rech(hier wird nur rumgerechnet "unsichtbar".
2. In Zeit ist eine Form, wo man per Linksklick ein Makro auslöst.
   
3. Zuvor gibt man dort die Wunschzeit in Sekunden oder Minuten ein.
4. Mit dem Makro wird dann ein Countdown angestoßen.
5. In Tabelle Rech - Feld B53 wird dann die Zeit heruntergelaufen in Sekundenschritten.
   

Bis hierher funktioniert alles.

6. Wenn die Zeit auf 10 Sekunden heruntergetick ist, dann soll ein Sound abgespielt werden(ich hatte hier MsxBox der einfachhalthalber geschreiben - die Soundabspielung an sich funktioniert jedoch)

Und dabei entseht das Problem, dass ich das Feld B53 mit dem Inhalt: 0:00:10 nicht in VB abbilden kann.

Der Code ist ja an sich einfach: Wenn Feld B53 =  0:00:10 Dann Soundabspielung(MsgBox).
Top
#22
Hi

Versuch es so.
Code:
Sub Zeitmakro()
    With ThisWorkbook.Worksheets("Rech")
        If .Range("B53") > DaZeit Then
            ' Zeit in der Zelle um die Taktfrequenz runter setzen
            .Range("B53") = .Range("B53") - DaZeit
            If Format(.Range("B53"), "hh:mm:ss") = "00:00:10" Then Call WAValsStart
            DaEt = Now + DaZeit                     ' nächste Startzeit für das Makro festllegen
            Application.OnTime DaEt, "Zeitmakro"    ' Makro starten zur Zeit DaEt
        Else
            .Range("B54") = 0
            ' Meldung bei Excel immer in Vordergrund
            MsgBox "Endzeit erreicht", 1048576, "Endzeit"
        End If
    End With
End Sub
Gruß Elex
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • o0Julia0o
Top
#23
oh man - yes! :15: 

Eine "Kleinigkeit" noch. Liegt nicht an deinem Code. Also war schon vorher immer so. Aber ich weiß nicht, woran das liegt. Die Zeit bleibt am Ende immer auf 00:00:01 stehen. In der Tabelle Zeit bei "Abgelaufene Zeit". Also Feld: D35.

Ich würde erwarten, dass es auf 00:00:00 stehen bleibt am Ende.

Und auch da wieder - wenn ich jetzt die eine Sekunde abziehen möchte, also Rech!B53-1 oder sowas, dann funktioniert das zwar so:
=Rech!B53-"00:00:01"

Doch, wenn man genau hinsieht, dann springt der am Anfang halt viel flotter als eine Sekunde. Also wenn man 11 Sekunden drinstehen hat. Dann springt geht er direkt auf 10 Sekunden. Was ja logisch ist. Und dann springt der von 10 auf 9 Sekunden aber total schnell. Der Rest zählt dann perfekt herunter.

Da noch eine Idee?
Top
#24
Zitat:Eine "Kleinigkeit" noch. Liegt nicht an deinem Code. Also war schon vorher immer so. Aber ich weiß nicht, woran das liegt. Die Zeit bleibt am Ende immer auf 00:00:01 stehen. In der Tabelle Zeit bei "Abgelaufene Zeit". Also Feld: D35.
Code:
Sub Zeitmakro()
    With ThisWorkbook.Worksheets("Rech")
        If .Range("B53") > DaZeit Then
            ' Zeit in der Zelle um die Taktfrequenz runter setzen
            .Range("B53") = .Range("B53") - DaZeit
            If Format(.Range("B53"), "hh:mm:ss") = "00:00:10" Then Call WAValsStart
            DaEt = Now + DaZeit                     ' nächste Startzeit für das Makro festllegen
            Application.OnTime DaEt, "Zeitmakro"    ' Makro starten zur Zeit DaEt
        Else
            .Range("B53") = 0
            .Range("B54") = 0
            ' Meldung bei Excel immer in Vordergrund
            MsgBox "Endzeit erreicht", 1048576, "Endzeit"
        End If
    End With
End Sub
Zitat:Doch, wenn man genau hinsieht, dann springt der am Anfang halt viel flotter als eine Sekunde. Also wenn man 11 Sekunden drinstehen hat. Dann springt geht er direkt auf 10 Sekunden. Was ja logisch ist. Und dann springt der von 10 auf 9 Sekunden aber total schnell. Der Rest zählt dann perfekt herunter.
In der Bsp.Datei nicht nachvollziehbar.


PS:
Im Original evtl. deinem Programmablauf geschuldet.
Du klickst auf die Uhr.
Dadurch startest du die Prozedur (StartUhr). Diese verändert den Inhalt von Rech!C53.
Durch die Änderung wird auf Rech! das Change Ereignis ausgelöst. Und der Code unter
 If Target.Address = "$C$53" Then      ausgeführt (das Zeitmakro gestartet.)
Ab jetzt Ruft sich das Zeitmakro jede Sekunde selbst auf und zählt Rech!B53 runter. Allerdings ruft die Änderung von B53 auch wieder das Change Ereignis von Rech! auf. Passiert zwar in der bsp.Datei nichts weil die If Bedingungen dort nicht erfüllt werden. (in deinem Original???)
 
Der Programmablauf ist mal vorsichtig gesagt interessant und gehört aufgeräumt.

Wozu braucht es das Blatt (Rech) Samt seinen Code?
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • o0Julia0o
Top
#25
Ist wohl auch ungenau Excel. Also eine 11 Sekunden-Runterzählung auf 0 dauert kürzer als eine 10 Sekunden-Countdown von einer Stoppuhr-Seite: https://webuhr.de/stoppuhr/#enabled=0&msec=9713

Also so weit bin ich mit der Exceldatei noch nicht. In Rech schiebe ich immer alles, was so berechnet wird. Also bei jeder Excel-Datei. Ob das optimal ist, sicherlich nicht. Aber ich blende das Blatt aus und kann da alles ändern. Dann ist es nicht so hässlich auf der Zeit-Seite. Es wird auch nie etwas anders ausgelöst, als das Herunterzählen. Also das wird halt angezeigt und dann ein Ton ausgegeben.

Aber ist schon so super, wie es ist. Auf eine Sekunde kommt es dabei gar nicht an.

Was aber in jedem Fall so ist: Er zählt die 1. Sekunde blizschnell herunter. Das ist logisch, weil in dem Feld steht: =B53-"00:00:00". B53 ist das Feld mit der Zeit.

Was ich mich noch frage ist, warum zählt der nicht von sich aus auf 00:00:00 herunter? Dann wäre das
Code:
-"00:00:00"
ja gar nicht notwendig. Der Countdown in B53 stoppt ja stets bei 00:00:01.
Top
#26
Hallo

Zitat:Was ich mich noch frage ist, warum zählt der nicht von sich aus auf 00:00:00 herunter?
Das Problem mit der stehenden 00:00:01 zum Schluss kannst du wie in #24 mit eine Zeile im Else Teil erledigen.
Oder du änderst die If Abfrage.

Code:
Sub Zeitmakro()
    With ThisWorkbook.Worksheets("Rech")
        If .Range("B53") > DaZeit Then
in diese
Code:
Sub Zeitmakro()
    With ThisWorkbook.Worksheets("Rech")
        If .Range("B53") >= DaZeit Then



Zitat:Ist wohl auch ungenau Excel. Also eine 11 Sekunden-Runterzählung auf 0 dauert kürzer als eine 10 Sekunden-Countdown von einer Stoppuhr-Seite:
Deshalb hatte ich ja schon einmal gefragt was du vorhast, brauchst, erwartest.


Ungenauigkeiten entstehen z.B. dadurch.
Die erste Sekunde wird sofort mit Klick auf die Uhr(start ) abgezogen. Heißt die erste Sekunde gibt es nicht. Müsste im Code geändert werden.

Bis zum setzten der neuen Zeit für Application.OnTime läuft ja erst mal Code ab.
Also löst das nächste Application.OnTime Ereignis erst nach einer Sekunde + Code Bearbeitungszeit aus.

Evtl. spielt auch das eine Rolle. Die Ausführung von Application.OnTime kann durch die Ausführung von anderem Code verzögert werden.
Wenn das Abspielen des Countdown startet und der Prozess zum Starten dafür  länger dauert als eine Sekunde dann wird die nächste Sekunde eben erst verspätet runtergezählt.


Gruß Elex
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • o0Julia0o
Top
#27
Jo o.k., danke. Also so genau muss es nicht sein.

Der Trick mit dem >= 00:00:01 hat funktioniert. :)             Jetzt passt es auch gut von der Zeit her.

Ich habe jetzt noch eine Stopp-Funktion eingebaut. Also nehmen wir an, man hätte 3:12 Minuten eingetragen. Jetzt läuft die Uhr 1:12 Sekunden & man möchte das Herunterzählen stoppen.

In Rech!C55 habe ich dazu folgende Formel verwendet, um aus den gestoppten Sekunden (im Beispiel: 00:02:00) eine 120 zu machen: =B55*86400. Damit dann in Zeit!D33 dieser Wert wieder übertragen wird. Und zwar im Sekundenwert:
   

Der Code sieht so aus:
Code:
Sub Counterstop()
Sheets("Rech").Range("B55") = Sheets("Rech").Range("B53")
Application.DisplayAlerts = False
Sheets("Rech").Range("B53") = "00:00:00"
Sheets("Zeit").Range("D33") = Sheets("Rech").Range("C55")
Application.DisplayAlerts = True
End Sub

Um also den Countdown zu stoppen, setze ich Rech!B53 auf 00:00:00. Die Zeit, beim Stopp, habe ich ja dann mir gemerkt in Rech!B55 (Zeile 2 im Code):
   

Wenn ich den Countdown stoppe, kommt die MsgBox "Endzeit erreicht". Die ist beim Stoppen natürlich unerwünscht. Ich wollte sie per Codezeile 3 ausblenden. Jedoch klappt das nicht. Funktioniert das nicht mit dem Application.DisplayAlerts-Befehl?
Top
#28
In deinen Codes befindet sich schon eine Möglichkeit wie du den Counter stoppen kannst. Brauchst du nur zu übernehmen.
Code:
Sub Counterstop()
        On Error Resume Next   ' Fehlerbehandlung falls Zeitmakro noch nicht gestartet
        ' Zeitmarko anhalten falls schon gestartet
        Application.OnTime EarliestTime:=DaEt, Procedure:="Zeitmakro", Schedule:=False
End Sub
Gruß Elex
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste