Vba 发送密钥正在禁用NumLock 问题:

Vba 发送密钥正在禁用NumLock 问题:,vba,excel,sendkeys,num-lock,Vba,Excel,Sendkeys,Num Lock,当我使用SendKeys将数据从Excel应用程序复制到另一个(非Microsoft)应用程序时,我的Num Lock将被禁用 Sub Test() Range("A1:B71").Select SendKeys "^C" 'Copies Selected Text AppActivate "AccuTerm 2K2" SendKeys "2", True 'Enters to notes screen SendKeys "^M", True

当我使用
SendKeys
将数据从Excel应用程序复制到另一个(非Microsoft)应用程序时,我的Num Lock将被禁用

Sub Test()

    Range("A1:B71").Select
    SendKeys "^C" 'Copies Selected Text

    AppActivate "AccuTerm 2K2"
    SendKeys "2", True    'Enters to notes screen
    SendKeys "^M", True   'Confirms above (Enter key)
    SendKeys "^V", True   'Pastes into client application

    Application.Wait (Now + TimeValue("0:00:05"))
    'Providing time for client application to finish
    'pasting...

    SendKeys "^M", True   'Next three enters are to
    SendKeys "^M", True   '...exit notes section
    SendKeys "^M", True
    AppActivate "Microsoft Excel"

    Range("B52:B62").Clear  'Clears the Template
    Range("B52").Select     'Resets Cell Position

End Sub
首选分辨率:
如何防止代码禁用NumLock?或者在代码完成后如何重新启用NumLock?

使用此选项可重新启用NumLock。我忘了我在网上哪里找到的。不是我写的

NumLockClass

将其放在类模块中

Option Explicit

' API declarations
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function GetVersionEx Lib "Kernel32" _
        Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long

    Private Declare PtrSafe Sub keybd_event Lib "user32" _
        (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwflags As Long, ByVal dwExtraInfo As Long)

    Private Declare PtrSafe Function GetKeyboardState Lib "user32" _
        (pbKeyState As Byte) As Long

    Private Declare PtrSafe Function SetKeyboardState Lib "user32" _
        (lppbKeyState As Byte) As Long
#Else
    Private Declare Function GetVersionEx Lib "Kernel32" _
        Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long

    Private Declare Sub keybd_event Lib "user32" _
        (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwflags As Long, ByVal dwExtraInfo As Long)

    Private Declare Function GetKeyboardState Lib "user32" _
        (pbKeyState As Byte) As Long

    Private Declare Function SetKeyboardState Lib "user32" _
        (lppbKeyState As Byte) As Long
#End If

' Type declaration
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type


'Constant declarations
Const VK_NUMLOCK = &H90
Const VK_SCROLL = &H91
Const VK_CAPITAL = &H14
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2

Property Get value() As Boolean
'   Get the current state
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    value = keys(VK_NUMLOCK)
End Property

Property Let value(boolVal As Boolean)
    Dim o As OSVERSIONINFO
    Dim keys(0 To 255) As Byte
    o.dwOSVersionInfoSize = Len(o)
    GetVersionEx o
    GetKeyboardState keys(0)
'   Is it already in that state?
    If boolVal = True And keys(VK_NUMLOCK) = 1 Then Exit Property
    If boolVal = False And keys(VK_NUMLOCK) = 0 Then Exit Property
'   Toggle it
    'Simulate Key Press
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'Simulate Key Release
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or _
      KEYEVENTF_KEYUP, 0
End Property

Sub Toggle()
'   Toggles the state
    Dim o As OSVERSIONINFO
    o.dwOSVersionInfoSize = Len(o)
    GetVersionEx o
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    'Simulate Key Press
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'Simulate Key Release
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or _
      KEYEVENTF_KEYUP, 0
End Sub
像这样使用它:

Dim numLock As New NumLockClass
If numLock.value = False Then numLock.value = True  'turn it back on

使用此选项可重新启用numlock。我忘了我在网上哪里找到的。不是我写的

NumLockClass

将其放在类模块中

Option Explicit

' API declarations
#If VBA7 And Win64 Then
    Private Declare PtrSafe Function GetVersionEx Lib "Kernel32" _
        Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long

    Private Declare PtrSafe Sub keybd_event Lib "user32" _
        (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwflags As Long, ByVal dwExtraInfo As Long)

    Private Declare PtrSafe Function GetKeyboardState Lib "user32" _
        (pbKeyState As Byte) As Long

    Private Declare PtrSafe Function SetKeyboardState Lib "user32" _
        (lppbKeyState As Byte) As Long
#Else
    Private Declare Function GetVersionEx Lib "Kernel32" _
        Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long

    Private Declare Sub keybd_event Lib "user32" _
        (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwflags As Long, ByVal dwExtraInfo As Long)

    Private Declare Function GetKeyboardState Lib "user32" _
        (pbKeyState As Byte) As Long

    Private Declare Function SetKeyboardState Lib "user32" _
        (lppbKeyState As Byte) As Long
#End If

' Type declaration
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type


'Constant declarations
Const VK_NUMLOCK = &H90
Const VK_SCROLL = &H91
Const VK_CAPITAL = &H14
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2

Property Get value() As Boolean
'   Get the current state
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    value = keys(VK_NUMLOCK)
End Property

Property Let value(boolVal As Boolean)
    Dim o As OSVERSIONINFO
    Dim keys(0 To 255) As Byte
    o.dwOSVersionInfoSize = Len(o)
    GetVersionEx o
    GetKeyboardState keys(0)
'   Is it already in that state?
    If boolVal = True And keys(VK_NUMLOCK) = 1 Then Exit Property
    If boolVal = False And keys(VK_NUMLOCK) = 0 Then Exit Property
'   Toggle it
    'Simulate Key Press
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'Simulate Key Release
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or _
      KEYEVENTF_KEYUP, 0
End Property

Sub Toggle()
'   Toggles the state
    Dim o As OSVERSIONINFO
    o.dwOSVersionInfoSize = Len(o)
    GetVersionEx o
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    'Simulate Key Press
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    'Simulate Key Release
    keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or _
      KEYEVENTF_KEYUP, 0
End Sub
像这样使用它:

Dim numLock As New NumLockClass
If numLock.value = False Then numLock.value = True  'turn it back on


您可以尝试查看
shell
,看看是否可以这样打开程序。关于numlock,我有一个类模块,我将在下面很快发布。只是想一想,如果你把这行代码打断:
Application.SendKeys“2^M^V”
分成3行怎么办?使用
“~~~%{TAB}”
分解发送键时也可以执行相同的操作。不要把两个放在同一行上(ALT-TAB除外)。此外,我有时也会使用sendkeys,它也会为我打开/关闭NumLock/CapsLock。我想这只是SendKeys的一部分。另外,尝试在sendkeys之后添加
,True
,即
Application.sendkeys“~”,True
。另外,如果您将myTxt设置为字符串//myTxt=“%{TAB}”/…Sendkeys myTxt,True@findwindow,则当我要运行脚本时,程序已经打开了。我不经常使用shell,所以我不确定如何在窗口之间切换。不过,我即将实现您的NumLockClass-谢谢!我从来没有使用过
shell
,所以我不知道它是如何工作的。在谷歌搜索了2秒钟后才找到它。我的想法是用代码打开它,这样你就可以将它设置为一个对象,并且放弃
sendkeys
。你可以尝试查看
shell
,看看你是否可以用这种方式打开你的程序。关于numlock,我有一个类模块,我将在下面很快发布。只是想一想,如果你把这行代码打断:
Application.SendKeys“2^M^V”
分成3行怎么办?使用
“~~~%{TAB}”
分解发送键时也可以执行相同的操作。不要把两个放在同一行上(ALT-TAB除外)。此外,我有时也会使用sendkeys,它也会为我打开/关闭NumLock/CapsLock。我想这只是SendKeys的一部分。另外,尝试在sendkeys之后添加
,True
,即
Application.sendkeys“~”,True
。另外,如果您将myTxt设置为字符串//myTxt=“%{TAB}”/…Sendkeys myTxt,True@findwindow,则当我要运行脚本时,程序已经打开了。我不经常使用shell,所以我不确定如何在窗口之间切换。不过,我即将实现您的NumLockClass-谢谢!我从来没有使用过
shell
,所以我不知道它是如何工作的。在谷歌搜索了2秒钟后才找到它。我的想法是用代码打开它,这样你就可以将它设置为一个对象,然后放弃发送键。天哪,这太棒了。如上所述,我认为使用
SendKeys
会导致按键切换,因为我不明白为什么会这样。我必须把它纳入我的代码中。干杯:人们在和我说话的时候总是提起他,我不知道为什么阿尔弗雷德出卖了你=P@KDavis你给它起名字了吗?
NumLockClass
?天哪,这太棒了。如上所述,我认为使用
SendKeys
会导致按键切换,因为我不明白为什么会这样。我必须把它纳入我的代码中。干杯:人们在和我说话的时候总是提起他,我不知道为什么阿尔弗雷德出卖了你=P@KDavis你给它起名字了吗?