我知道这个问题之前已经引起注意,但我无法解决。 我有一个调用子按钮的按钮,在该子按钮中我想确保数字锁定始终打开。 第一次,即如果数字锁关闭,则会将其打开。如果它已经打开,单击该按钮一两次会使数字锁定保持打开状态,但单击第三次则会关闭数字锁定。再次单击可将其关闭。再次单击可将其再次打开。所以每点击 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}"
我删除了所有有关数字锁定开关等的代码,并尝试这样做,至少现在在我的机器上有效:我只需按两次键即可。明天我会在我的办公室机器上检查一下。
更新于2021-07-19 在我的办公室(Windows 64 本地化意大利语,Excel 2010)中,我遇到了与数字锁定切换相同的问题,但数字键盘上的逗号也变成了一个点(在意大利,它是 3,14 而不是 3.14)。我放弃。感谢所有试图帮助我的人。 MS 必须真正修复 sendkeys。
基于这篇文章您可以使用以下代码打开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
问题就在这里,简单的修正似乎就可以了。
私有函数 KeyState(lKey As Long) As Boolean ' KeyState = CBool(GetKeyState(lKey)) KeyState = CLng(GetKeyState(lKey)) = 1 结束功能