Turning NUMLOCK on at the end of a macro run

前端 未结 4 1883
暖寄归人
暖寄归人 2021-01-06 07:01

What code does: I have a code that moves the mouse around the screen, takes printscreens and pastes it to excel.

Problem: For some

相关标签:
4条回答
  • 2021-01-06 07:35

    I found this solution so far the best and does not interfere with NUMLOCK. Put below code in a module and call it from anywhere in your project. The script object overwrites the SendKeys in VBA.

    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 
    

    I found it in below thread:

    SendKeys() permission denied error in Visual Basic

    0 讨论(0)
  • 2021-01-06 07:46

    You can set the keystate directly with a couple of Windows API calls. Ported from the 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
    

    Call it like this:

    Sub Example()
        'Turn Numlock off.
        ToggleNumlock False
        'Turn Numlock on.
        ToggleNumlock True
    End Sub
    
    0 讨论(0)
  • 2021-01-06 07:52

    You almost had it! The correct coding is: Application.Sendkeys ("{NUMLOCK}")

    0 讨论(0)
  • 2021-01-06 07:53

    First of all, Copy and paste the following code in your Excel Sheet’s Module (Ex:-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
    

    Then, Copy and Paste the following in your Sheet's Code (Ex:- 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
    

    Now Chill!!! For Each SelectionChange you make, Excel Refreshes itself and It makes sure that Numlock is On Always. Replace "Capslock" instead of Numlock if you need it so as the case may be.

    Thanks. Sashi Elit :)

    0 讨论(0)
提交回复
热议问题