Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

[VBA] wert eines felds ändern und eine funktion starten sobald timer abläuft
#1
Hallo
ich möchte eine excel tabelle erstellen mit 5 timern (countdowns) 33,17,12,2,1 min, wobei der nächste timer erst dann anfangen soll wenn der vorherige bei 0 ist

bisher habe ich mich durch tourials durchgequält und folgenden code gebastelt:

Sub StartTimer()
Application.OnTime Now + TimeValue("00:00:01"), "aa"
End Sub

Sub aa()
If Range("c5").Value = 0 Then Exit Sub
Range("c5").Value = Range("c5").Value - TimeValue("00:00:01")
StartTimer
End Sub

Sub StartTimertwo()
Application.OnTime Now + TimeValue("00:00:01"), "ab"
End Sub

Sub ab()
If Range("c7").Value = 0 Then Exit Sub
Range("c7").Value = Range("c7").Value - TimeValue("00:00:01")
StartTimertwo
End Sub


Sub StopTimer()
Application.OnTime Now + TimeValue("00:00:01"), "aa", Schedule:=False
End Sub

bei der zeile 
If Range("c5").Value = 0 Then Exit Sub beende ich die funktion die "runterzählt". nun möchte ich zusätzlich, dass wenn 0 erreicht wird das nächste feld (in meinem fall c7) auf 17:00 gestellt wird und sub ab() ausgeführt wird.

hoffe habe mich verständlich genug ausgedrückt  Huh


vielen dank im voraus für jegliche Hilfe
Rjinxil
Antworten Top
#2
Hallo Rjinxil,

ich würde es so machen:



' **************************************************************
'  Modul:  mTimer  Typ = Allgemeines Modul
' **************************************************************


Option Explicit

Dim iTimerSet As Double

Sub StartTimer()
 If iTimerSet = 0 Then
   '33,17,12,2,1 min
   Range("C5").NumberFormat = "[mm]:ss"
   Range("C5").Value = TimeValue("00:33:00")
   Range("C7").NumberFormat = "[mm]:ss"
   Range("C7").Value = TimeValue("00:17:00")
   Range("C9").NumberFormat = "[mm]:ss"
   Range("C9").Value = TimeValue("00:12:00")
   Range("C11").NumberFormat = "[mm]:ss"
   Range("C11").Value = TimeValue("00:02:00")
   Range("C13").NumberFormat = "[mm]:ss"
   Range("C13").Value = TimeValue("00:01:00")
 Else
   If Range("C5").Value > 0 Then
     Range("C5").Value = Range("C5").Value - TimeValue("00:00:01")
   ElseIf Range("C7").Value > 0 Then
     Range("C7").Value = Range("C7").Value - TimeValue("00:00:01")
   ElseIf Range("C9").Value > 0 Then
     Range("C9").Value = Range("C9").Value - TimeValue("00:00:01")
   ElseIf Range("C11").Value > 0 Then
     Range("C11").Value = Range("C11").Value - TimeValue("00:00:01")
   ElseIf Range("C13").Value > 0 Then
     Range("C13").Value = Range("C13").Value - TimeValue("00:00:01")
   End If
 End If
 If Range("C13").Value > 0 Then
   iTimerSet = Now + TimeValue("00:00:01")
   Application.OnTime iTimerSet, "StartTimer", , True
 Else
   On Error Resume Next
   Application.OnTime iTimerSet, "StartTimer", , False
   On Error GoTo 0
   iTimerSet = 0
 End If
End Sub

Sub PauseTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
End Sub

Sub StopTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
 iTimerSet = 0
End Sub

Code eingefügt mit: Excel Code Jeanie

Lies Dir dazu unbedingt auch das hier durch: Applicaton.OnTime - Zeitgesteuerte Makros

Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Rjinxil
Antworten Top
#3
Hey

vielen dank genau so habe ich es mir vorgestellt. (leider war mein Ansatz wohl nicht wirklich nützlich  :22:)

eine Kleinigkeit fehlt jedoch. sobald der letzte Timer durch ist soll er von vorne anfangen (wieder alles reseten und den 33ger Timer laufen).

erster Ansatz war unter der zeile "Range("C13").Value = Range("C13").Value - TimeValue("00:00:01")" ein "Else: StartTimer" einzufügen aber es geht nicht

und eine frage habe ich noch: ich brauche das ganze 5 mal in einer Tabelle. kann ich es bedenkenlos Copytesten und nur die Variablen ändern?

Gruss

*edit: das mit dem variablen ändern und copy pasten hat geklappt, jetzt nur noch der reset
Antworten Top
#4
Hallo Rjinxil,

mit Reset (= Endlosschleife) dann so:

Option Explicit

Dim iTimerSet As Double

Sub StartTimer()
 If iTimerSet = 0 Then
   '33,17,12,2,1 min
   Range("C5").NumberFormat = "[mm]:ss"
   Range("C5").Value = TimeValue("00:00:03")
   Range("C7").NumberFormat = "[mm]:ss"
   Range("C7").Value = TimeValue("00:00:02")
   Range("C9").NumberFormat = "[mm]:ss"
   Range("C9").Value = TimeValue("00:00:03")
   Range("C11").NumberFormat = "[mm]:ss"
   Range("C11").Value = TimeValue("00:00:02")
   Range("C13").NumberFormat = "[mm]:ss"
   Range("C13").Value = TimeValue("00:00:03")
 Else
   If Range("C5").Value > 0 Then
     Range("C5").Value = Range("C5").Value - TimeValue("00:00:01")
   ElseIf Range("C7").Value > 0 Then
     Range("C7").Value = Range("C7").Value - TimeValue("00:00:01")
   ElseIf Range("C9").Value > 0 Then
     Range("C9").Value = Range("C9").Value - TimeValue("00:00:01")
   ElseIf Range("C11").Value > 0 Then
     Range("C11").Value = Range("C11").Value - TimeValue("00:00:01")
   ElseIf Range("C13").Value > 0 Then
     Range("C13").Value = Range("C13").Value - TimeValue("00:00:01")
   End If
 End If
 If Range("C13").Value > 0 Then
   iTimerSet = Now + TimeValue("00:00:01")
   Application.OnTime iTimerSet, "StartTimer", , True
 Else
   iTimerSet = 0
   Application.OnTime Now, "StartTimer", , True
 End If
End Sub

Sub PauseTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
End Sub

Sub StopTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
 iTimerSet = 0
End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Rjinxil
Antworten Top
#5
Hey.
vielen Dank läuft jetzt genau wie es soll.

ich möchte nun ein weiteres Feld einbauen, welches abhängig von der Restzeit des 33 min timers einen text anzeigt:

wenn timer 30:00-33:00 text1
wenn timer 25:30-30:00 text2
etc

ist sowas ohne grosse Umstände möglich?

Gruss
Antworten Top
#6
Hallo,
Option Explicit

Dim iTimerSet As Double

Sub StartTimer()
 'wenn timer 30:00-33:00 text1
 'wenn timer 25:30-30:00 text2
 'etc
 If iTimerSet = 0 Then
   '33,17,12,2,1 min
   Range("C5").NumberFormat = "[mm]:ss"
   Range("C5").Value = TimeValue("00:33:00")
   Range("B5").Value = "Text 1"
   Range("C7").NumberFormat = "[mm]:ss"
   Range("C7").Value = TimeValue("00:17:00")
   Range("C9").NumberFormat = "[mm]:ss"
   Range("C9").Value = TimeValue("00:12:00")
   Range("C11").NumberFormat = "[mm]:ss"
   Range("C11").Value = TimeValue("00:02:00")
   Range("C13").NumberFormat = "[mm]:ss"
   Range("C13").Value = TimeValue("00:01:00")
 Else
   If Range("C5").Value > 0 Then
     Range("C5").Value = Range("C5").Value - TimeValue("00:00:01")
     If Range("C5").Value > TimeValue("00:30:00") Then
       'Range("B5").Value = "Text 1"
     ElseIf Range("C5").Value > TimeValue("00:25:30") Then
       Range("B5").Value = "Text 2"
     ElseIf Range("C5").Value > TimeValue("00:20:00") Then
       Range("B5").Value = "Text 3"
     ElseIf Range("C5").Value > TimeValue("00:00:00") Then
       Range("B5").Value = "Text 4"
     End If
   ElseIf Range("C7").Value > 0 Then
     Range("C7").Value = Range("C7").Value - TimeValue("00:00:01")
   ElseIf Range("C9").Value > 0 Then
     Range("C9").Value = Range("C9").Value - TimeValue("00:00:01")
   ElseIf Range("C11").Value > 0 Then
     Range("C11").Value = Range("C11").Value - TimeValue("00:00:01")
   ElseIf Range("C13").Value > 0 Then
     Range("C13").Value = Range("C13").Value - TimeValue("00:00:01")
   End If
 End If
 If Range("C13").Value > 0 Then
   iTimerSet = Now + TimeValue("00:00:01")
   Application.OnTime iTimerSet, "StartTimer", , True
 Else
   iTimerSet = 0
   Application.OnTime Now, "StartTimer", , True
 End If
End Sub

Sub PauseTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
End Sub

Sub StopTimer()
 On Error Resume Next
 Application.OnTime iTimerSet, "StartTimer", , False
 On Error GoTo 0
 iTimerSet = 0
End Sub
Gruß Uwe
Antworten Top
#7
Hey
läuft alles wie ich es wollte jetzt.
eine kleine Sache nervt allerdings extrem. wenn ich ein anderes excel Dokument öffne werden die funktionen dort ausgeführt.
wie kann ich es auf dieses Dokument einschränken
Gruss
Antworten Top
#8
Hallo,

vielleicht so?

Code:
Sub StartTimer()
'wenn timer 30:00-33:00 text1
'wenn timer 25:30-30:00 text2
'etc
With ThisWorkbook.Worksheets(1)  'bitte anpassen!
  If iTimerSet = 0 Then
    '33,17,12,2,1 min
    .Range("C5").NumberFormat = "[mm]:ss"
    .Range("C5").Value = TimeValue("00:33:00")
    .Range("B5").Value = "Text 1"
    .Range("C7").NumberFormat = "[mm]:ss"
    .Range("C7").Value = TimeValue("00:17:00")
    .Range("C9").NumberFormat = "[mm]:ss"
    .Range("C9").Value = TimeValue("00:12:00")
    .Range("C11").NumberFormat = "[mm]:ss"
    .Range("C11").Value = TimeValue("00:02:00")
    .Range("C13").NumberFormat = "[mm]:ss"
    .Range("C13").Value = TimeValue("00:01:00")
  Else
    If .Range("C5").Value > 0 Then
      .Range("C5").Value = .Range("C5").Value - TimeValue("00:00:01")
      If .Range("C5").Value > TimeValue("00:30:00") Then
        'Range("B5").Value = "Text 1"
      ElseIf .Range("C5").Value > TimeValue("00:25:30") Then
        .Range("B5").Value = "Text 2"
      ElseIf .Range("C5").Value > TimeValue("00:20:00") Then
        .Range("B5").Value = "Text 3"
      ElseIf .Range("C5").Value > TimeValue("00:00:00") Then
        .Range("B5").Value = "Text 4"
      End If
    ElseIf .Range("C7").Value > 0 Then
      .Range("C7").Value = .Range("C7").Value - TimeValue("00:00:01")
    ElseIf .Range("C9").Value > 0 Then
      .Range("C9").Value = .Range("C9").Value - TimeValue("00:00:01")
    ElseIf .Range("C11").Value > 0 Then
      .Range("C11").Value = .Range("C11").Value - TimeValue("00:00:01")
    ElseIf .Range("C13").Value > 0 Then
      .Range("C13").Value = .Range("C13").Value - TimeValue("00:00:01")
    End If
  End If
  If .Range("C13").Value > 0 Then
    iTimerSet = Now + TimeValue("00:00:01")
    Application.OnTime iTimerSet, "StartTimer", , True
  Else
    iTimerSet = 0
    Application.OnTime Now, "StartTimer", , True
  End If
End With
End Sub
Gruß Stefan
Win 10 / Office 2016
Antworten Top


Gehe zu:


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