2017-02-24 158 views
3

代碼的作用:我有一個代碼,它可以在屏幕上移動鼠標,將打印屏幕粘貼到excel中。在宏運行結束時將NUMLOCK打開

問題:出於某種原因,我的代碼總是(絕對沒有例外)在每次運行後關閉NUMLOCK鍵。

我到目前爲止的嘗試:我周圍搜索並找到SendKeys(NUMLOCK),它在理論上的作品(雖然它似乎是非常有問題的用戶)。

我想要做什麼:我想打開NUMLOCK上每個宏運行後,

OBS1:我不知道是什麼原因造成的宏來關閉它擺在首位。修復造成這種情況的原因是理想的,但由於我不知道問題是什麼,我首先想讓我的代碼正常工作。只要找到一種方法來打開NUMLOCK鍵,我將盡力解決這個問題。

問題:我可以使用SendKeys來做到這一點嗎?我是否正確使用它?有沒有更好的辦法? Obs2:由於它是一個更大的代碼,只要這個問題解決了,我將會在整個代碼中發佈另一個問題,然後回顧導致問題的原因。

代碼我想起訴打開NumLock鍵上:

Application.Sendkeys (NUMLOCK) 

也試過:

Application.Sendkeys ("NUMLOCK") 

Application.Sendkeys {NUMLOCK} 
+2

你可能想要閱讀這裏:http://stackoverflow.com/questions/25977933/sendkeys-is-messing-with-my-numlock-key-via-vba-code-in-訪問形式。它也可能是一個已知問題:https://support.microsoft。com/en-us/help/179987/bug-multiple-sendkeys-statement-turns-off-numlock-key – sous2817

+0

@ sous2817感謝您的評論。已經看到了這個問題並嘗試了它,但仍然遇到同樣的問題。 – DGMS89

+1

也是,它的價值是不是語法:SendKeys「{NUMLOCK}」,True – sous2817

回答

5

您可以用直接設置keystate幾個Windows API調用。從MSDN page for keybd_event function移植:

#If VBA7 Then 
    Private Declare PtrSafe Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, _ 
                   ByVal dwFlags As LongPtr, ByVal dwExtraInfo As LongPtr) 
    Private Declare PtrSafe Function GetKeyboardState Lib "user32.dll" (ByVal lpKeyState As LongPtr) As Boolean 
#Else 
    Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, _ 
                 ByVal dwFlags As Long, ByVal dwExtraInfo As Long) 
    Private Declare Function GetKeyboardState Lib "user32.dll" (ByVal lpKeyState As Long) As Boolean 
#End If 

Private Const KEYEVENTF_EXTENDEDKEY As Long = &H1 
Private Const KEYEVENTF_KEYUP As Long = &H2 
Private Const VK_NUMLOCK As Byte = &H90 
Private Const NumLockScanCode As Byte = &H45 

Private Sub ToggleNumlock(enabled As Boolean) 
    Dim keystate(255) As Byte 
    'Test current keyboard state. 
    GetKeyboardState (VarPtr(keystate(0))) 
    If (Not keystate(VK_NUMLOCK) And enabled) Or (keystate(VK_NUMLOCK) And Not enabled) Then 
     'Send a keydown 
     keybd_event VK_NUMLOCK, NumLockScanCode, KEYEVENTF_EXTENDEDKEY, 0& 
     'Send a keyup 
     keybd_event VK_NUMLOCK, NumLockScanCode, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0& 
    End If 
End Sub 

這樣稱呼它:

所有的
Sub Example() 
    'Turn Numlock off. 
    ToggleNumlock False 
    'Turn Numlock on. 
    ToggleNumlock True 
End Sub 
+0

我也正在建議'keybd_event'。順便說一句,在'GetKeyboardState'後面的測試中最後一個'enabled'之前缺少'Not',當前的和'If Then Then'一樣。 ;) – R3uK

+0

@ R3uK謝謝,你說得對。固定。 :-) – Comintern

+0

不客氣! – R3uK

2

首先,複製並粘貼到您的Excel工作表的模塊下面的代碼(例如: - 模塊-1)...

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer 
     Private Const kCapital = 20 
     Private Const kNumlock = 144 

     Public Function CapsLock() As Boolean 
     CapsLock = KeyState(kCapital) 
     End Function 

     Public Function NumLock() As Boolean 
     NumLock = KeyState(kNumlock) 
     End Function 

     Private Function KeyState(lKey As Long) As Boolean 
     KeyState = CBool(GetKeyState(lKey)) 
     End Function 

然後,複製並粘貼以下在表的代碼(例如: - 工作表Sheet1(代碼))...

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
     Range("XFD1").FormulaR1C1 = "=NumLock()" 
     If Range("XFD1").Value = "FALSE" Then 
     SendKeys "{NUMLOCK}" 
     Else 
     End If 
     End Sub 

現在寒意!!!對於您創建的每個SelectionChange,Excel自行刷新並確保Numlock始終開啓。 如果您需要視情況而定,請替換「Capslock」而不是Numlock。

謝謝。 Sashi Elit :)

相關問題