我有一个小型 VBA 宏,它循环运行一分钟左右,生成动态 Excel 显示。我想通过定义变量来更改按下按键时的显示 - 例如,如果按下“e”则 x = 1
是否有代码可以检测按键并用它定义变量?
它可以是按键事件或按键事件。我在其中看到的所有示例代码都会假设它是重新编程按键或运行例程。
我查看了代码示例并尝试了 Application.OnKey "e", x = 1 没有运气。
不能直接在
Application.OnKey
语句中设置变量的值,它只能调用过程。但是,该过程随后可以设置变量的值。因此,例如,Application.OnKey "e", "SetMyVar"
将调用过程SetMyVar
,在标准模块中,它可以是:
Sub SetMyVar()
x = 1
End Sub
...请注意,在同一模块中的模块级别(即模块中的所有子函数和函数之上)定义“x”非常重要,例如
Dim x As Long
(否则,如果您使用,您的代码将无法编译) Option Explicit
)。
然后就按照您在问题中提出的要求进行操作。一个用法示例可以是(同样在同一模块中):
Sub MyExistingSubThatUsesX()
' this is just a demo Sub and you will use your own Sub to do what you want with the value of x
If x = 1 Then
Debug.Print Now, "x is 1"
Else
Debug.Print Now, "x is not 1"
End If
End Sub
还有一些其他的事情。
您可能会发现这种“e 键行为”有点令人沮丧。任何时候您按“e”(当您尚未在单元格中输入时),因此您可以考虑使用 Ctrl+e,这将是
Application.OnKey "^e", "SetMyVar"
。请参阅 Application.OnKey 了解更多组合键选项。
如果您希望 x 的值在两个值之间交替,那么您可以(在
SetMyVar
中)将 x = 1
替换为 x = 1 - x
,那么 x 将在 0 和 1 之间交替。显然,您也可以使用If
语句或其他一些代码来设置 x 的其他值。
您可能希望使“e 键行为”仅在特定工作簿打开并处于活动状态时才起作用。为此,请在 ThisWorkbook 模块(必须是 ThisWorkbook,这在任何其他模块中都不起作用)中添加:
Private Sub Workbook_Activate()
' set a press of the 'e' key to run the SetMyVar Sub when this Workbook is the active Workbook
Application.OnKey "e", "SetMyVar"
Debug.Print Now, "Set"
End Sub
Private Sub Workbook_Deactivate()
' stop a press of the 'e' key from running the SetMyVar Sub when this Workbook is not the active Workbook
Application.OnKey "e", ""
Debug.Print Now, "Stopped"
End Sub
...如果您愿意,您可以再次将“e”替换为“^e”。现在,当您切换到查看不同的工作簿(或关闭已添加代码的工作簿)时,“e 键行为”将停止,当您切换回(或重新打开)已添加代码的工作簿时“e 键行为”将(重新)启动。