我正在运行一个循环,需要在按下"右"点击键盘然后应该调用一个程序分配给"右键和#34;键。
现在,即使点击右键,循环也会继续运行。
我已使用以下代码将过程分配给右键:
Application.OnKey "{RIGHT}", "procRight"
任何帮助将不胜感激
谢谢,
Akshat
答案 0 :(得分:0)
你需要使用另一个线程。 VBA没有多线程支持 - 当循环运行时,您无法引发与当前代码执行并行的任何其他事件。您需要使用支持多线程的其他编程语言(如vb.net)才能执行此类任务。一般来说,执行这样的任务的可接受方式是运行while循环(在主线程上),只要布尔变量设置为true并且用户在另一个线程中按下具有事件处理程序侦听器的键时运行它会将此布尔变量更改为false =调用另一个sub并退出示例。请注意,multiThreading是编程中的高级主题。
答案 1 :(得分:0)
@Jonathan是完全正确的,因为理想的做法是使用多线程来完成这项任务,而VBA没有这种能力。首先,您可能需要检查程序结构以设计更好的方法。
但是,VBA可以进行多任务,因此如果必须完成此特定任务,则需要解决方法。它需要使用DoEvents
,它确实存在一些问题(参见https://support.microsoft.com/en-us/kb/118468)。您将无法在循环中调用新程序,因此需要取消Application.OnKey "{RIGHT}", "procRight"
(请执行以下操作:Application.OnKey "{RIGHT}"
)。
因为DoEvents
将控制传递给操作系统,所以应用程序的事件仍将被触发,即使在循环运行时也可以捕获它们。你可以做的是在你的一个工作表对象中设置一个'Stop'标志,捕获Worksheet_SelectionChange
事件,如果选择是前一个右边的一个单元格,那么必须按下右键(不幸的是,如果您将鼠标单击一个单元格向右,因此实际上不是一个正确的击键,同样适用,但我们正在谈论一个没有什么是完美的解决方法,所以你可以设置'Stop'标志。然后,您可以在循环的每次迭代中测试该标志。
代码看起来像这样:
在工作表中......
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"