2015-10-09 344 views
0

我正在運行一個循環,需要在按下「右鍵」鍵盤時停止,之後程序應該被調用分配給「正確的「鍵。按鍵退出循環並調用分配給該鍵的另一個程序

現在,即使點擊右鍵後循環仍會繼續運行。

我使用下面的代碼分配過程右鍵:

Application.OnKey "{RIGHT}", "procRight" 

任何幫助,將不勝感激

感謝,

Akshat

回答

0

你需要使用另一個線程。 VBA沒有多線程支持 - 當循環運行時,不會引發與當前代碼執行並行的任何其他事件。您將需要使用支持多線程的其他編程語言(如vb.net)來執行此類任務。一般來說,執行類似任務的可接受方式是運行一個while循環(在主線程上),只要將布爾變量設置爲true,並且當用戶按下在另一個線程中具有事件處理程序偵聽器的鍵它會將此布爾變量更改爲false =調用另一個子項並退出。請注意,多線程是編程中的高級主題。

0

@Jonathan是完全正確的,因爲理想的做法是使用多線程完成此任務,而VBA不具備這種功能。所以首先,你可能想要檢查你的程序結構來設計一個更好的方法。

但是,VBA可以執行多任務,因此如果您必須完成此特定任務,則有一種解決方法。它需要使用DoEvents,它有一些與之相關的問題(請參閱https://support.microsoft.com/en-us/kb/118468)。您將無法在循環中調用新程序,因此您的Application.OnKey "{RIGHT}", "procRight"需要取消(如下所示:Application.OnKey "{RIGHT}")。

因爲DoEvents將控制傳遞給操作系統,所以應用程序的事件仍然會被觸發,即使在循環運行時也可以捕獲。你可以做的是在你的一個工作表對象中設置一個「停止」標誌,捕捉Worksheet_SelectionChange事件,如果選擇的是其先前右側的一個單元格,則必須按下右鍵(不幸的是,同樣適用如果鼠標單擊右側的一個單元格,因此實際上不會是右擊鍵,但我們正在說一個解決方法,沒有什麼是完美的),因此您可以設置「停止」標誌。然後,您可以在循環的每次迭代中測試該標誌。

的代碼會是這個樣子:

在工作表...

Private mRight As Boolean 
Private mOldSelection As Range 
Public Property Get Right() As Boolean 
    Right = mRight 
End Property 
Public Property Let Right(bool As Boolean) 
    mRight = bool 
    Me.Activate 
    Set mOldSelection = Selection.Cells(Selection.Cells.Count) 
End Property 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Not mOldSelection Is Nothing Then 
     If mOldSelection.Column > 1 Then 
      If Target.Cells(1).Address = OldSelection.Offset(, 1).Address Then 
       mRight = True 
      End If 
     End If 
    End If 

    Set mOldSelection = Target.Cells(Target.Cells.Count) 
End Sub 

而且這裏是你的模塊中停止循環的例子...

Dim i As Long 

Sheet1.Right = False 
For i = 1 To 1000000 
    DoEvents 
    If Sheet1.Right Then 
     MsgBox "Stopped" 
     Exit For 
    End If 
Next 
MsgBox "Done" 
相關問題