У меня есть относительно простое решение, которое должно справиться с проблемой использования процессора, но это ничего не делает против запуска событий, хотя мышь неподвижна. Идея состоит в том, чтобы использовать функцию sleep
, предоставляемую API windows, для уменьшения частоты активации событий.
Итак, сначала вам нужно получить функцию:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal lngMilliSeconds As Long)
#End If
и затем внутри вашей пользовательской формы:
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
sleep 1 '1 should be the time in milliseconds that the code will wait,
'in practice it waits 15ms (see edit below)
'insert the rest of your code here
End Sub
sleep 1
заставит код ждать одну миллисекунду, прежде чем возобновить выполнение. Редактировать: на практике код будет ждать 15 миллисекунд, см. Комментарий @GSergs к этому ответу.
Этого обычно достаточно, чтобы избавиться от проблемы использования процессора. Если вам не нужно, чтобы событие запускалось 65 раз в секунду, вы можете изменить частоту запуска, подождав дольше, например, с помощью sleep 30
.
Если вам нужно, чтобы событие активировалось только один раз каждый раз, когда мышь Переход от «не к контролю» к «к контролю», решение заключается в использовании флага активации:
Внутри модуля Userforms:
Dim ControlActive As Boolean
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Not ControlActive Then
ControlActive = True
'insert the rest of your code here
End If
End Sub
Private Sub Userform_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If ControlActive Then
ControlActive = False
End If
End Sub