Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Immer nach 1,3 sec Wert erhöhen

Forumthread: Immer nach 1,3 sec Wert erhöhen

Immer nach 1,3 sec Wert erhöhen
02.08.2013 17:50:51
Albert
Hallo...
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.

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Abändern auf 1,3 Sekunden ? Profi bitte schauen
02.08.2013 22:09:13
Matze
Hallo Albert,
habe dir hier mal eine Datei erstellt und diese mit den Codezeile von UweD bestückt.
Dort wird dann mit 1 Sekunde aufgerechnet, leider hab ich es nicht geschafft dies auf die 1,3 Sekunden
oder auch 1300 Millisekunden umzubauen. Mal sehen was später die Profis dazu schreiben. Lasse den Beitrag als offen stehen.
https://www.herber.de/bbs/user/86692.xlsm
Matze

Anzeige
AW: Abändern auf 1,3 Sekunden ? Profi bitte schauen
03.08.2013 01:05:17
fcs
Hallo Matze, hallo Albert,
fast alle Zeitfunktionen in Excel basieren auf ganzen Sekunden, so auch OnTime.
Wenn man Ereignisse in Bruchteilen von Sekunden verarbeiten will, dann muss man eine betriebssystemnahe Zeitfunktion verwenden.
Ein Grundproblem aller zeitabhängigen Ereignisprozeduren:
Excel darf zum Zeitpunkt der Ausführung nicht mit etwas anderem beschäftigt sein.
Andernfalls werden die Ereignisprozeduren verzögert oder nicht ausgeführt, oder es kommt es schnell zum Excel-/Systemabsturz wenn man in den zeitgesteuerten Prozeduren auf eine Fehlerbehandlung verzichtet.
In der Beispieldatei hab ich ein ursprünglich als Stoppuhr konzipiertes VBA-Projekt mal in einen Zähler umgewandelt.
https://www.herber.de/bbs/user/86696.xlsm
Gruß
Franz
Timer-Funktion aus Herber-Excel-Forum:
https://www.herber.de/forum/archiv/1260to1264/t1261770.htm#1261770
https://www.herber.de/bbs/user/80010.xlsm
'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

Anzeige
Wau,...das ist mal ein Input...
03.08.2013 10:16:34
Matze
Moin Franz,
...der gleich wieder in meiner Sammlung landet.
Da wird sich Albert aber freuen.
Danke Franz
Matze

Herzlichen Dank euch allen... owT
04.08.2013 19:35:01
Albert
Gruß
A
;
Anzeige

Infobox / Tutorial

Wert in Excel nach 1,3 Sekunden erhöhen


Schritt-für-Schritt-Anleitung

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.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code in das Modul ein:
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
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Drücke ALT + F8, wähle Zaehler_Start und klicke auf Ausführen, um den Zähler zu starten.
  3. Um den Zähler zu stoppen, führe Zaehler_Stopp aus.

Häufige Fehler und Lösungen

  • Fehler: Zähler läuft nicht

    • Stelle sicher, dass Du den Zähler mit Zaehler_Start gestartet hast. Überprüfe auch, ob das richtige Arbeitsblatt aktiv ist.
  • Fehler: Excel stürzt ab oder reagiert nicht

    • Dies kann passieren, wenn andere Prozesse Excel beschäftigen. Stelle sicher, dass Excel während der Ausführung des Codes nicht belastet wird.

Alternative Methoden

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.


Praktische Beispiele

Angenommen, Du möchtest den Zähler in Zelle D5 in einem Arbeitsblatt namens "Zähler" erhöhen:

  1. Stelle sicher, dass Du die oben genannten Codes in ein Modul eingefügt hast.
  2. Ändere die Zelle, die erhöht werden soll, indem Du die Referenz in Set rngZiel = wksTime.Range("D5") anpasst.
  3. Starte den Zähler und beobachte, wie sich der Wert alle 1,3 Sekunden erhöht.

Tipps für Profis

  • Debugging: Nutze die Debug.Print-Anweisung, um den Fortschritt des Zählers in der Immediate-Fenster von VBA zu verfolgen.
  • Erweiterungen: Du könntest den Code erweitern, um den Zähler zu stoppen, wenn ein bestimmter Wert erreicht ist.
  • Optimierung: Überlege, ob Du den Timer in eine Klasse umwandeln möchtest, um mehrere Zähler gleichzeitig zu verwalten.

FAQ: Häufige Fragen

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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige