如何使用vba在Excel中调用ENTER键上的函数

时间:2016-07-27 15:51:05

标签: excel excel-vba windows-7-x64 excel-2016 vba

Google应该为我提供充足的示例,但它们似乎都不起作用

我想要的是什么:每次用户按下然后释放ENTER键,我的程序都要做某事(即创建一个MsgBox,或调用函数Foo)。我更喜欢MWE的形式

我做了什么:我已经尝试使用Google搜索,但没有一个示例正常运行。他们编译,但不做任何事情。我还确保以宏兼容的Excel格式保存。

我正在使用的是什么:我正在使用Excel 2016,64位使用Office 365

编辑:用户正在将此信息输入工作表。我想拦截用户输入,每次按ENTER键时,将光标/活动单元格向下移动两行,因此每个单元格下面都有一个空单元格。如果用户按Tab键,我想将光标/活动单元格对齐两列,因此每个单元格右侧都有一个空单元格。

编辑2:这是我现在所拥有的MWE哪个应该有效,但什么都不做。我将此添加到工作表中,而不是作为模块

Sub SomeActions()
    MsgBox ("Hello")
End Sub

Private Sub Workbook_Open()
    Application.OnKey "~", "SomeActions"
End Sub

2 个答案:

答案 0 :(得分:2)

首先,制作一个执行所需逻辑的回调Sub。将它放入一个新的代码模块(不是工作表代码):

Sub SomeActions()
...
End Sub

然后,订阅OnKey事件,例如,当用户在VBA编辑器中打开工作簿(此代码进入ThisWorkbook)模块时:

Private Sub Workbook_Open()
    Application.OnKey "~", "SomeActions"
End Sub

"~"表示输入键。对于数字键盘键,请使用"{ENTER}"

答案 1 :(得分:1)

  

我想要的:每次用户按下然后释放ENTER键,我的程序都要做某事(即创建一个MsgBox,或调用函数Foo)。
我希望以MWE

的形式

如果我读得正确,你需要在每个用户输入值之间输入一个空白行,并且每个用户输入值之间的空白列都是正确的。

在工作表代码表中:

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Dim r As Long, c As Long
    If Target.Row / 2 <> Int(Target.Row / 2) Then r = 1
    If Target.Column / 2 <> Int(Target.Column / 2) Then c = 1
    Target.Offset(r, c).Activate
    Application.EnableEvents = True
End Sub

所有导航都会发生这种情况。如果您只想在输入中进行此操作,请修改以适合Worksheet_Change事件宏而不是Worksheet_SelectionChange事件宏。