Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在宏运行结束时启用NUMLOCK_Vba_Excel - Fatal编程技术网

Vba 在宏运行结束时启用NUMLOCK

Vba 在宏运行结束时启用NUMLOCK,vba,excel,Vba,Excel,代码的作用:我有一个代码,可以在屏幕上移动鼠标,获取打印屏幕并将其粘贴到excel 问题:出于某种原因,我的代码总是(绝对没有例外)在每次运行后关闭NUMLOCK键 我到目前为止所做的尝试:我四处搜索,找到了SendKeys(NUMLOCK),这在理论上是有效的(尽管对用户来说似乎是非常有问题的) 我想做什么:我想在每次运行宏后打开NUMLOCK Obs1:我不知道是什么原因导致宏首先关闭它。修复导致这种情况的任何原因都是理想的,但由于我不知道问题是什么,我首先希望让代码正常工作。只要找到打开N

代码的作用:我有一个代码,可以在屏幕上移动鼠标,获取打印屏幕并将其粘贴到excel

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

我到目前为止所做的尝试:我四处搜索,找到了SendKeys(NUMLOCK),这在理论上是有效的(尽管对用户来说似乎是非常有问题的)

我想做什么:我想在每次运行宏后打开NUMLOCK

Obs1:我不知道是什么原因导致宏首先关闭它。修复导致这种情况的任何原因都是理想的,但由于我不知道问题是什么,我首先希望让代码正常工作。只要找到打开NUMLOCK键的方法,我就要着手解决这个问题

问题:我可以使用SendKey执行此操作吗?我用得对吗?有更好的办法吗

Obs2:因为这是一个更大的代码,一旦解决了这个问题,我将用整个代码发布另一个问题,并讨论导致问题的原因

代码我正试图起诉以打开numlock:

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