Следующий код был разработан в 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 каждую секунду. Это в старых версиях! Для меня самым удивительным является то, что это работает, но только один раз. Помогите?
С уважением, Саймон