Vba 在宏运行结束时启用NUMLOCK
代码的作用:我有一个代码,可以在屏幕上移动鼠标,获取打印屏幕并将其粘贴到excel 问题:出于某种原因,我的代码总是(绝对没有例外)在每次运行后关闭NUMLOCK键 我到目前为止所做的尝试:我四处搜索,找到了SendKeys(NUMLOCK),这在理论上是有效的(尽管对用户来说似乎是非常有问题的) 我想做什么:我想在每次运行宏后打开NUMLOCK Obs1:我不知道是什么原因导致宏首先关闭它。修复导致这种情况的任何原因都是理想的,但由于我不知道问题是什么,我首先希望让代码正常工作。只要找到打开NUMLOCK键的方法,我就要着手解决这个问题 问题:我可以使用SendKey执行此操作吗?我用得对吗?有更好的办法吗 Obs2:因为这是一个更大的代码,一旦解决了这个问题,我将用整个代码发布另一个问题,并讨论导致问题的原因 代码我正试图起诉以打开numlock:Vba 在宏运行结束时启用NUMLOCK,vba,excel,Vba,Excel,代码的作用:我有一个代码,可以在屏幕上移动鼠标,获取打印屏幕并将其粘贴到excel 问题:出于某种原因,我的代码总是(绝对没有例外)在每次运行后关闭NUMLOCK键 我到目前为止所做的尝试:我四处搜索,找到了SendKeys(NUMLOCK),这在理论上是有效的(尽管对用户来说似乎是非常有问题的) 我想做什么:我想在每次运行宏后打开NUMLOCK Obs1:我不知道是什么原因导致宏首先关闭它。修复导致这种情况的任何原因都是理想的,但由于我不知道问题是什么,我首先希望让代码正常工作。只要找到打开N
Application.Sendkeys (NUMLOCK)
还尝试:
Application.Sendkeys ("NUMLOCK")
及
您可以通过几个Windows API调用直接设置keystate。从以下位置移植: 可以这样称呼:
Sub Example()
'Turn Numlock off.
ToggleNumlock False
'Turn Numlock on.
ToggleNumlock True
End Sub
首先,在Excel工作表的模块中复制并粘贴以下代码(例如:-模块-1) 然后,将以下内容复制并粘贴到工作表的代码中(例如:-Sheet1(代码)) 现在冷静点!!!对于您所做的每个SelectionChange,Excel都会刷新自身,并确保Numlock始终处于启用状态。 如果需要,根据具体情况更换“Capslock”而不是Numlock
谢谢。Sashi Elit:)我发现这个解决方案到目前为止是最好的,而且不会干扰NUMLOCK。 将下面的代码放在一个模块中,并从项目中的任何地方调用它。脚本对象覆盖VBA中的SendKeys
Public Sub Sendkeys(text as variant, Optional wait As Boolean = False)
Dim WshShell As Object
Set WshShell = CreateObject("wscript.shell")
WshShell.Sendkeys cstr(text), wait
Set WshShell = Nothing
End Sub
我在下面的线程中找到了它:
你差点就成功了!
正确的编码是:
Sendkeys(“{NUMLOCK}”)我尝试了所有的建议,直到我注意到它不是(NUMLOCK)而是{NUMLOCK}。这对我有用 子Numlock() 发送键“{NUMLOCK}”
End Sub您可能需要在此处阅读:。这也可能是一个已知的问题:@sous2817谢谢你的评论。已经看到并尝试过这个问题,仍然会遇到同样的问题。另外,值得一提的是…语法不是:SendKeys“{NUMLOCK}”,真的吗?奇怪的是,我从来没有在我的戴尔电脑上看到过这种情况,但它似乎总是发生在HP笔记本电脑上。顺便说一句,请不要使用不适用于VBA的标签;)我还想建议
keybd\u事件
。顺便说一句,在GetKeyboardState
之后的测试中,在最后一次启用之前,您缺少一个Not
,当前一个与相同(如果启用,则为)@共产国际谢谢你的回答。这种类型的api调用可以用来设置任何类型的keystate吗?@Comintern对于您发布的这段代码,不需要声明变量吗?@DGMS89它们是。仅有的两个变量是已启用
,它被声明为一个参数,以及键状态
,它显式地是Dim
'd。其余部分声明为常量。@DGMS89-将所有内容放在模块顶部的Private Sub ToggleNumlock
上,就在Option Explicit
下。如果您阅读了关于该问题的评论,您将看到OP已经尝试过了,但它不起作用。请阅读评论部分,OP已经尝试过了,但没有效果
Sub Example()
'Turn Numlock off.
ToggleNumlock False
'Turn Numlock on.
ToggleNumlock True
End Sub
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
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
Public Sub Sendkeys(text as variant, Optional wait As Boolean = False)
Dim WshShell As Object
Set WshShell = CreateObject("wscript.shell")
WshShell.Sendkeys cstr(text), wait
Set WshShell = Nothing
End Sub