2014-01-30 118 views

回答

5

其实很简单。我将它演示为UPDOWN箭头键。您可以添加更多像右/左/表/输入等...我已评论你可以添加键的部分。

粘贴该工作表中的代码区

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

相关问题