Таймер Excel VBA перезванивает только один раз [решено] - PullRequest
0 голосов
/ 28 апреля 2020

Следующий код был разработан в Office97 и работал в последующих версиях Windows и Office. Однако использовать его в Office2013 - это слишком далеко. Я сократил пример, где обычно обратный вызов будет обмениваться данными через последовательный порт. Сейчас я просто пытаюсь увеличить содержимое ячейки, но проблема остается той же: обратный вызов вызывается один раз, когда в старой ситуации он вызывался повторно, как и предполагалось. Я заметил, что теперь он работает на 64-битной и скорректировал объявления для этого. Электронная таблица содержит две кнопки, которые вызывают подпрограммы «actionStart» и «actionStop». Вот код:

Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As LongPtr) As Long

Private lngTimerId As LongPtr

Function TickHandler(ByVal hwnd&, ByVal lngMsg&, ByVal lngTimerId&, ByVal lngTime&)
    Cells(40, 7).Value = Cells(40, 7).Value + 2
End Function

Sub Timer_Initialize(Optional vInterval As Variant)
Dim lngInterval As Long
    lngInterval = CLng(vInterval)
    If lngInterval < 100 Then lngInterval = 100 
    If lngTimerId = 0 Then  
         lngTimerId = SetTimer(0, 0, lngInterval, AddressOf TickHandler)
    End If
    If lngTimerId = 0 Then
        MsgBox "Unable to initialize a new timer!"
    End If
End Sub

Sub Timer_Terminate()
    If lngTimerId <> 0 Then
        Call KillTimer(0, lngTimerId)
        lngTimerId = 0
    End If
End Sub

Sub actionStart()
    Call Timer_Initialize(100)
End Sub

Sub actionStop()
    Call Timer_Terminate()
End Sub

Я думаю, что я должен видеть ячейку G40 go 0 ... 2 ... 4 ... 6 ... 8 каждую секунду. Это в старых версиях! Для меня самым удивительным является то, что это работает, но только один раз. Помогите?

С уважением, Саймон

...