0

これは以前に注目されたことは知っていますが、解決できません。サブを呼び出すボタンがあり、そのサブでnumlockが常にオンになっていることを確認したい。初めて、つまり numlock がオフの場合、オンになります。すでにオンになっている場合は、ボタンを 1 回または 2 回クリックすると numlock がオンのままになりますが、3 回クリックすると numlock がオフになります。もう一度クリックするとオフになります。もう一度クリックすると、再びオンになります。したがって、3回クリックするたびにオフになります。修正方法がわかりません。Excel 2019 ビットと Windows 10 64 ビットを使用しています。コードは次のとおりです。

Private Declare PtrSafe 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


Public Sub ToggleNumlock(choice As Boolean)
Application.Volatile

If choice = True Then
    If NumLock = False Then SendKeys "{NUMLOCK}", True
Else
    If NumLock = True Then SendKeys "{NUMLOCK}", True

End If
End Sub

私が持っているボタンによってトリガーされたサブで:

Application.SendKeys "{F2}"

そして、私が持っている直後

      If NumLock = False Then
       ToggleNumlock (True)
      End If

トラブルの原因は Sendkeys でしょうか? 必要なので、回避策はありますか?ありがとうございました。

私のコードへの更新:

ActiveSheet.Range(CurrentCell).Value = "=" 
ActiveSheet.Range(CurrentCell).Select
Application.SendKeys "{F2}", True
Application.SendKeys "=", True
Application.SendKeys "{F2}"

numlock on off などに関するすべてのコードを削除しました。これを試してみると、少なくとも私のマシンでは今のところ機能します。キーを 2 回押すだけです。明日、オフィスのマシンでこれを確認します。

UPDATED 2021-07-19 私のオフィス (Windows 64 ローカライズされたイタリア語、Excel 2010) では、numlock を切り替えるのと同じ問題がありますが、テンキーのコンマもポイントになります (イタリアでは 3.14 ではなく 3.14 です)。あきらめる。私を助けようとしたすべての人に感謝します。MS は実際に送信キーを修正する必要があります。

4

1 に答える 1

2

この記事に基づいて、次のコードで Num Lock をオンにすることができます

Option Explicit
'https://www.vbarchiv.net/tipps/details.php?id=563

Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer


Private Declare Sub keybd_event Lib "user32" ( _
    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long)
 
Private Const VK_NUMLOCK = &H90
Private Const KEYEVENTF_KEYUP = &H2

Sub pressNumLock()
    ' press NUM-Lock drücken
    ' first key down and then key-up
    keybd_event VK_NUMLOCK, 1, 0, 0
    keybd_event VK_NUMLOCK, 1, KEYEVENTF_KEYUP, 0
End Sub

Sub NumLockOn()
    ' activate NUM-Lock (in case it is not activated)
    If Not (GetKeyState(vbKeyNumlock) = 1) Then
        pressNumLock
    End If
End Sub
于 2021-07-18T13:47:50.900 に答える