Arun Singh对类似问题给出了很好的答案(Is there any event that fires when keys are pressed when editing a cell?)。如果用户使用箭头键滚动,我想设置一个标志来阻止执行Selection_Change事件。我可以在Excel VBA中捕获和模拟KeyDown事件吗?
5
A
回答
5
其实很简单。我将它演示为UP和DOWN箭头键。您可以添加更多像右/左/表/输入等...我已评论你可以添加键的部分。
粘贴该工作表中的代码区
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If CancSelEvnt = False Then
'
'~~> Rest of the code for the Selection Change
'
Else
'~~> Only for demostration purpose. Remove Msgbox later
MsgBox "User pressed one of the navigation keys"
CancSelEvnt = False
End If
End Sub
模块
Option Explicit
'~~> We need this as this will help us in cancelling the
'~~> Selection chnage event
Public CancSelEvnt As Boolean
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type MSG
hwnd As Long
Message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Private Declare Function WaitMessage Lib "user32"() As Long
Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" _
(ByRef lpMsg As MSG, ByVal hwnd As Long, _
ByVal wMsgFilterMin As Long, _
ByVal wMsgFilterMax As Long, _
ByVal wRemoveMsg As Long) As Long
Private Declare Function TranslateMessage Lib "user32" _
(ByRef lpMsg As MSG) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const WM_KEYDOWN As Long = &H100
Private Const PM_REMOVE As Long = &H1
Private Const WM_CHAR As Long = &H102
Private bExitLoop As Boolean
Sub StartKeyWatch()
Dim msgMessage As MSG
Dim bCancel As Boolean
Dim iKeyCode As Integer
Dim lXLhwnd As Long
On Error GoTo errHandler:
Application.EnableCancelKey = xlErrorHandler
bExitLoop = False
lXLhwnd = FindWindow("XLMAIN", Application.Caption)
Do
WaitMessage
If PeekMessage _
(msgMessage, lXLhwnd, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE) Then
iKeyCode = msgMessage.wParam
TranslateMessage msgMessage
PeekMessage msgMessage, lXLhwnd, WM_CHAR, _
WM_CHAR, PM_REMOVE
If iKeyCode = vbKeyBack Then SendKeys "{BS}"
If iKeyCode = vbKeyReturn Then SendKeys "{ENTER}"
bCancel = False
'
'~~> This is the main part where we check what key is pressed
'
If iKeyCode = vbKeyDown Then '<~~ Down
SendKeys "{DOWN}"
CancSelEvnt = True
ElseIf iKeyCode = vbKeyUp Then '<~~ UP
SendKeys "{UP}"
CancSelEvnt = True
'
'~~> And so on for the rest of the navigation keys
'
Else
CancSelEvnt = False
End If
If bCancel = False Then
PostMessage _
lXLhwnd, msgMessage.Message, msgMessage.wParam, 0
End If
End If
errHandler:
DoEvents
Loop Until bExitLoop
End Sub
Sub StopKeyWatch()
bExitLoop = True
End Sub
中粘贴此这里是东西,你可能需要;)
VBKey代码列表
vbKeyLButton Left Mouse Button
vbKeyRButton Right Mouse Button
vnKeyCancel Cancel Key
vbKeyMButton Middle Mouse button
vbKeyBack Back Space Key
vbKeyTab Tab Key
vbKeyClear Clear Key
vbKeyReturn Enter Key
vbKeyShift Shift Key
vbKeyControl Ctrl Key
vbKeyMenu Menu Key
vbKeyPause Pause Key
vbKeyCapital Caps Lock Key
vbKeyEscape Escape Key
vbKeySpace Spacebar Key
vbKeyPageUp Page Up Key
vbKeyPageDown Page Down Key
vbKeyEnd End Key
vbKeyHome Home Key
vbKeyLeft Left Arrow Key
vbKeyUp Up Arrow Key
vbKeyRight Right Arrow Key
vbKeyDown Down Arrow Key
vbKeySelect Select Key
vbKeyPrint Print Screen Key
vbKeyExecute Execute Key
vbKeySnapshot Snapshot Key
vbKeyInsert Insert Key
vbKeyDelete Delete Key
vbKeyHelp Help Key
vbKeyNumlock Delete Key
vbKeyA through vbKeyZ are the key code constants for the alphabet
vbKey0 through vbKey9 are the key code constants for numbers
vbKeyF1 through vbKeyF16 are the key code constants for the function keys
vbKeyNumpad0 through vbKeyNumpad9 are the key code constants for the numeric key pad
Math signs are:
vbKeyMultiply - Multiplication Sign (*)
vbKeyAdd - Addition Sign (+)
vbKeySubtract - Minus Sign (-)
vbKeyDecimal - Decimal Point (.)
vbKeyDivide - Division sign (/)
vbKeySeparator - Enter (keypad) sign
当然还有THIS msdn链接为关键代码。
0
我需要调整上面的使用Worksheet_Change和Tab键作为基本上当按Tab键然后更改目标(当A2编辑和按Tab键,更改事件显示单元格B2),我想要避免。
我已经改变了关键部分:
If iKeyCode = vbKeyTab Then '<~~ Tab
SendKeys "{TAB}"
CancSelEvnt = True
Else
CancSelEvnt = False
End If<code>
,但我在努力得到任何结果?
当我按Tab键时,我的Change事件根本不会调用Sub StartKeyWatch()。 也从Worksheet_Change调用子StartKeyWatch()直接似乎没有做任何事情...
我在这里错过了什么?
谢谢, mkvarious
相关问题
- 1. 模拟keydown事件
- 2. 未捕获PyGame KEYDOWN事件
- 3. 使用react-keydown在内部组件中捕获keydown事件
- 4. 如何在可可中捕获全局keydown/keyup事件
- 5. 可以捕获texbox点击事件吗?
- 6. Excel VBA:我可以设置全局右键单击事件吗?
- 7. VBA MS Excel:我可以在模块中编写UserForm代码吗?
- 8. Internet Explorer 8模拟事件捕获
- 9. 我可以在Office365中使用我的VSTO和VBA excel插件吗?
- 10. 如何捕获标签的keydown事件?
- 11. Keydown事件捕获数字键
- 12. 我可以捕获Windows Mobile PIE键盘事件吗?
- 13. 我可以使用Python捕获OSX中的键盘和鼠标事件吗?
- 14. 以编程方式模拟C#2010中RichTextBox的KeyDown事件
- 15. 在IE中模拟W3C事件捕获模型
- 16. 我可以钩住并捕获在android进程中发生的事件吗?
- 17. 我可以在Firefox中使用javascript捕获水平滚轮事件吗?
- 18. 我可以从Excel VBA Web查询获取流吗?
- 19. Android模拟器可以捕捉PC键盘的按键事件
- 20. WH_MOUSE可以捕捉全局事件吗?
- 21. 在JavaScript中捕获“控制”keydown新闻事件
- 22. 我可以在Excel 2010精简版中使用VBA吗?
- 23. 我可以在Excel 2010 VBA中执行异步XML调用吗?
- 24. 捕获光标键的KeyDown和KeyUp事件
- 25. 我可以使用Excel和VBA写入Outlook吗
- 26. 我可以捕获Capslock/Shift键吗?
- 27. 我可以捕获受邀用户吗?
- 28. 在Excel中使用VBA可以访问VBA代码吗?
- 29. Excel VBA事件
- 30. KeyDown事件和drag'n'drop