在macros运行结束时closuresNUMLOCK

什么代码:我有一个代码,在屏幕上移动鼠标,采取打印屏幕,并将其粘贴到Excel。

问题:出于某种原因,我的代码总是(绝对没有例外)在每次运行之后closuresNUMLOCK键。

我到目前为止的尝试:我search周围,发现SendKeys(NUMLOCK),这在理论上是可行的(虽然它似乎是非常有问题的用户)。

我想要做什么:我想在每次macros运行之后打开NUMLOCK,

Obs1:我不知道是什么原因导致macrosclosures它首先。 解决这个问题是很理想的,但是因为我不知道问题是什么,所以我首先想让我的代码正常工作。 一旦find一种方法来打开NUMLOCK键,我将尽力解决这个问题。

问:我可以使用SendKeys来做到这一点吗? 我正确使用它吗? 有没有更好的办法?

Obs2:由于它是一个更大的代码,只要解决了这个问题,我将会用整个代码发布另外一个问题,然后介绍导致问题的原因。

代码我试图起诉打开numlock:

Application.Sendkeys (NUMLOCK) 

还试过:

 Application.Sendkeys ("NUMLOCK") 

 Application.Sendkeys {NUMLOCK} 

您可以直接使用几个Windows API调用来设置keystate。 从keybd_event函数的MSDN页面移植:

 #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 

首先,将以下代码复制并粘贴到Excel工作表模块(例如:-Module-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(Code))…

 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 

现在寒意! 对于您创build的每个SelectionChange,Excel会自行刷新,并确保Numlock始终开启。 根据具体情况,如果需要更换“Capslock”而不是Numlock。

谢谢。 Sashi Elit 🙂