2014-10-08 194 views
2

我目前有一個宏,當我單擊用戶窗體上的任何位置時,圖片框移動到左側。我爲此添加了一個計時器,以便在第一次單擊表單後始終保持向左。問題是picturebox確實向左移動,但只移動一次。之後,沒有任何反應。這是我到目前爲止的代碼:Excel VBA計時器保持停止狀態

Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    Call PlayerMoving 
End Sub 

Public Sub PlayerMoving() 
    Player1.Left = Player1.Left + 5 
    Call StartTimer 
End Sub 

Sub StartTimer() 
    Application.OnTime Now + TimeValue("00:00:01"), "PlayerMoving" 
End Sub 

就像我之前提到的,在第一步之後,沒有其他的事情發生。我不知道爲什麼。我也有試過do while循環是這樣的:

Public Sub PlayerMoving() 
do while SOME_STATEMENT_HERE 
     Player1.Left = Player1.Left + 5 
     Call StartTimer 
loop 

末次

回答

4

大問題!答案是Application.OnTime函數。它旨在調用常規模塊中的過程,而不是表單等類對象。換句話說OnTime函數找不到您的PlayerMoving子,因爲它在您的表單的類中,而不是在常規模塊中。

爲了解決這個問題,你可以簡單地添加下面的包裝函數在一個常規的VBA模塊:

Public Sub MoveMyPlayer() 
    UserForm1.PlayerMoving 
End Sub 

然後更改您OnTime呼叫調度MoveMyPlayer功能駐留在常規模塊:

Public Sub StartTimer() 
    Application.OnTime Now + TimeValue("00:00:01"), "MoveMyPlayer" 
End Sub 

另外請記住,你的代碼應該有一個方法來停止計時器完成。您可能需要添加另一個功能到您的窗體中,並在您準備好停止移動圖像時調用它:

Public Sub CancelTimer() 
    Application.OnTime Now, "MoveMyPlayer", , False 
End Sub 

希望幫助!

亞當

+0

非常感謝 – HumanlyRespectable 2014-10-09 11:56:58

1

請確保它們在普通模塊(不是用戶表單模塊)中。修改使用表單的Name的情況下,它不同於UserForm1

Public timerOn As Boolean 

Public Sub PlayerMoving() 
    UserForm1.Player1.Left = UserForm1.Player1.Left + 5 
    Call StartTimer 
End Sub 

Sub StartTimer() 

If timerOn Then 
    Application.OnTime Now + TimeValue("00:00:01"), "PlayerMoving" 
End If 

End Sub 

在您的用戶窗體模塊:

Sub UserForm_Activate() 
    Player1.Left = 0 'Set the initial position if desired 
    Module1.timerOn = False '## Modify to the module name 
End Sub 
Private Sub UserForm_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    Module1.timerOn = True 
    Call PlayerMoving 
End Sub 

Sub UserForm_Terminate() 
    Module1.timerOn = False 
End Sub 

有可能是處理這更好/更精緻的方式,但它是我想出了比較快。

因此,我們創建一個布爾變量來確定是否保持「計時器」循環。我們在表單卸載時將其設置爲false,並且在重新激活表單時確保重置Player1.Left,否則它可能「消失」。

然後,我們可以根據需要簡單地切換此開關。