wie müsste ein Code aussehen, der den Wert einer Zelle immer nach 1,3s um 1 erhöht?
Ich hab grrad mit application.ontime herumgespielt, aber es funktioniert nicht wirklich.
Dank und Gruß
A.
'Code in einem allgemeinen Modul
'Erstellt unter WIndows Vista, MS Office 2010 Professional
'Erstellt: 2013-08-02
'Ersteller: fcs
Option Explicit
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, _
ByVal nIDEvent As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Public lnghWnd As Long
Private bolZeit As Boolean, strNumberformat As String
Private lngStarttime As Long
Private wksTime As Worksheet, rngZiel As Range
Private lngCount As Long
Private lngStart As Long
Private Const dblZeitDiff As Double = 1.3 'Zeitdifferenz in Sekunden
Sub Zaehler_Start()
If lngStarttime > 0 Then
MsgBox "Zähler läuft schon! " & vbLf & "Bitte ggf. erst Zähler stoppen.", _
vbInformation + vbOKOnly, "Zähler erhöhen alle " & dblZeitDiff & " Sekunden"
Else
Set wksTime = ActiveSheet 'Tabellnblatt in dem hochgezählt werden soll
Set rngZiel = wksTime.Range("D5") 'Zelle mit Zähler
lngCount = 0 'Dieser Wert wird alle 1,3 Sekunden hochgezählt
If MsgBox("Soll laufende Zeit in rechter Nachbarzelle der Zählerzelle angezeigt werden?" _
, _
vbQuestion + vbYesNo + vbDefaultButton2, _
"Zähler erhöhen alle " & dblZeitDiff & " Sekunden") = vbYes Then
bolZeit = True
strNumberformat = rngZiel.Offset(0, 1).NumberFormat
rngZiel.Offset(0, 1).NumberFormat = "#,##0.000"
Else
bolZeit = False
End If
lngStart = rngZiel.Value
lnghWnd = FindWindow("xlMain", vbNullString)
lngStarttime = timeGetTime
SetTimer lnghWnd, 0, 1, AddressOf proc_Display
End If
End Sub
Sub Zaehler_Stopp()
'Stoppt den Timer und setzt andere Werte zurück
If lngStarttime = 0 Then
MsgBox "Bitte Zähler erst starten.", _
vbInformation + vbOKOnly, "Zähler erhöhen alle " & dblZeitDiff & " Sekunden"
Else
If bolZeit = True Then
rngZiel.Offset(0, 1).NumberFormat = strNumberformat
bolZeit = False
End If
Set rngZiel = Nothing: Set wksTime = Nothing
KillTimer lnghWnd, 0
lngStarttime = 0
End If
End Sub
Private Sub proc_Display(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
ByVal lpTimerFunc As Long)
'Diese Prozedur verarbeitet den Timer
Dim dblLaufZeit As Double
On Error GoTo Fehler 'zwingend erforderlich, sonst stürzt Excel bei jeder Gelegenheit ab
dblLaufZeit = (timeGetTime - lngStarttime) / 1000 'Laufzeit in Sekunden
If dblLaufZeit > lngCount * dblZeitDiff Then
With rngZiel
.Value = lngStart + lngCount
If bolZeit = True Then .Offset(0, 1) = dblLaufZeit
End With
Fehler:
lngCount = lngCount + 1
End If
End Sub
Um den Wert einer Zelle in Excel alle 1,3 Sekunden um 1 zu erhöhen, kannst Du den folgenden VBA-Code nutzen. Dieser Code verwendet die Application.OnTime
-Methode und einige API-Aufrufe, um präzise Zeitintervalle zu ermöglichen.
ALT + F11
, um den VBA-Editor zu öffnen.Einfügen
> Modul
, um ein neues Modul zu erstellen.Option Explicit
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Public lnghWnd As Long
Private bolZeit As Boolean, strNumberformat As String
Private lngStarttime As Long
Private wksTime As Worksheet, rngZiel As Range
Private lngCount As Long
Private Const dblZeitDiff As Double = 1.3 ' Zeitdifferenz in Sekunden
Sub Zaehler_Start()
If lngStarttime > 0 Then
MsgBox "Zähler läuft schon! Bitte ggf. erst Zähler stoppen.", vbInformation + vbOKOnly, "Zähler erhöhen alle " & dblZeitDiff & " Sekunden"
Else
Set wksTime = ActiveSheet ' Arbeitsblatt in dem hochgezählt werden soll
Set rngZiel = wksTime.Range("D5") ' Zelle mit Zähler
lngCount = 0 ' Dieser Wert wird alle 1,3 Sekunden hochgezählt
lngStarttime = timeGetTime
lnghWnd = FindWindow("xlMain", vbNullString)
SetTimer lnghWnd, 0, 1300, AddressOf proc_Display ' 1300 Millisekunden
End If
End Sub
Sub Zaehler_Stopp()
If lngStarttime = 0 Then
MsgBox "Bitte Zähler erst starten.", vbInformation + vbOKOnly, "Zähler erhöhen alle " & dblZeitDiff & " Sekunden"
Else
KillTimer lnghWnd, 0
lngStarttime = 0
End If
End Sub
Private Sub proc_Display(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Dim dblLaufZeit As Double
dblLaufZeit = (timeGetTime - lngStarttime) / 1000 ' Laufzeit in Sekunden
If dblLaufZeit > lngCount * dblZeitDiff Then
rngZiel.Value = rngZiel.Value + 1
lngCount = lngCount + 1
End If
End Sub
ALT + F8
, wähle Zaehler_Start
und klicke auf Ausführen
, um den Zähler zu starten.Zaehler_Stopp
aus.Fehler: Zähler läuft nicht
Zaehler_Start
gestartet hast. Überprüfe auch, ob das richtige Arbeitsblatt aktiv ist.Fehler: Excel stürzt ab oder reagiert nicht
Eine alternative Methode ist die Verwendung von Application.OnTime
, um die Zeitsteuerung zu realisieren. Dies funktioniert jedoch nicht so präzise wie die API-Methoden. Hier ist ein einfaches Beispiel:
Sub Zaehler_Alle_1_3_Sekunden()
Dim rngZiel As Range
Set rngZiel = ActiveSheet.Range("D5")
rngZiel.Value = rngZiel.Value + 1
Application.OnTime Now + TimeValue("00:00:01.3"), "Zaehler_Alle_1_3_Sekunden"
End Sub
Diese Methode hat jedoch einige Einschränkungen hinsichtlich der Genauigkeit.
Angenommen, Du möchtest den Zähler in Zelle D5 in einem Arbeitsblatt namens "Zähler" erhöhen:
Set rngZiel = wksTime.Range("D5")
anpasst.Debug.Print
-Anweisung, um den Fortschritt des Zählers in der Immediate-Fenster von VBA zu verfolgen.1. Wie kann ich den Zähler anhalten?
Du kannst den Zähler anhalten, indem Du die Zaehler_Stopp
-Subroutine ausführst.
2. Ist dieser Code mit älteren Excel-Versionen kompatibel?
Der vorgestellte Code wurde unter Excel 2010 getestet, sollte jedoch auch in neueren Versionen funktionieren. Achte darauf, dass die API-Funktionen unterstützt werden.
3. Kann ich den Zähler in einer anderen Zelle einfügen?
Ja, ändere einfach die Range-Referenz in Set rngZiel = wksTime.Range("D5")
auf die gewünschte Zelle.
Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden
Suche nach den besten AntwortenEntdecke unsere meistgeklickten Beiträge in der Google Suche
Top 100 Threads jetzt ansehen