Excel VBA禁用快捷键有时会禁用数据输入

5ssjco0h  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(225)

为什么我的代码偶尔会随机禁用数据输入,但即使我隔离它并删除所有其他宏,大多数时间也能正常工作?
代码禁用了几乎所有的快捷键,但不应该影响简单的数据输入。

Option Explicit
Rem mod__ShortCutKeys

' Ctrl = "^"
' Alt = "%"
' Shift = "+"
' Combinations ("^", "%", "+", "^%", "^+", "%+", "^%+")

Rem Declare Variables
Dim Ctrl As String
Dim Alt As String
Dim Shift As String
Dim CtrlAlt As String
Dim CtrlShift As String
Dim AltShift As String
Dim CtrlAltShift As String

Dim KeyArray As Variant
Dim Key As Variant
Dim i As Long

Rem Public Sub ShortCutKeysInitializeVariables
Public Sub ShortCutKeysInitializeVariables()

    Ctrl = "^"
    Alt = "%"
    Shift = "+"
    CtrlAlt = "^%"
    CtrlShift = "^+"
    AltShift = "%+"
    CtrlAltShift = "^%+"

    KeyArray = Array(Ctrl, Alt, Shift, CtrlAlt, CtrlShift, AltShift, CtrlAltShift)

End Sub

Rem Public Sub ShortCutKeysDisable
Sub ShortCutKeysDisable()

    Rem Calls
    Call ShortCutKeysInitializeVariables

    ' Combinations
    For Each Key In KeyArray
        For i = 1 To 255
            On Error Resume Next
            Application.OnKey Key & Chr(i), ""
        Next i
    Next Key

    ' Functions keys
    For i = 1 To 12
        On Error Resume Next
        Application.OnKey "{F" & i & "}", ""
    Next i

    ' Combinations & Functions keys
    For Each Key In KeyArray
        For i = 1 To 12
            On Error Resume Next
            Application.OnKey Key & "{F" & i & "}", ""
        Next i
    Next Key

End Sub

灵感来源:Disable key or key combination
为什么这个代码会阻止我输入任何数据?只是偶尔发生。
我所说的数据输入是指,如果我选择了一个单元格,并试图在该单元格中键入数据(大写或小写),它不会做任何事情。即使双击单元格进入编辑模式,该问题仍然存在。
关闭并打开文件可以解决问题,但偶尔会返回。
Excel 2021 Pro Plus LTSC

eagi6jfj

eagi6jfj1#

正如注解中所述,Application.Onkey不应该对编辑模式下的按键行为有任何影响,所以这告诉我,这可能是Excel/VBA的一个bug。
这可能是由于您设置了很多OnKey目标,导致一些处理按键的进程行为不稳定,甚至有时会挂起。
有一件事可以尝试,那就是减少你设置的组合键的数量。您尝试仅在第一个循环中设置1,785(7 x 255)OnKey目标!
如果你的目标是键盘快捷键,你当然可以将字符的范围从32减少到255,因为我真的怀疑你的键盘可以输出不可打印的ascii字符。您甚至可以考虑将其减少到32到127,这取决于您的键盘上是否有重音字符。
如果这还不足以修复它,您可以尝试将Application.OnKey组合重置为原始状态,并重新禁用所有快捷方式,以查看是否正确重置。
例如,您可以修改过程的版本,利用传递Application.OnKey "...", Null将重置传递的键的行为的事实:

Sub ShortCutKeysToggle(Enabled As Boolean)

    Dim Proc As Variant
    If Enabled Then
        Proc = Null
    Else
        Proc = ""
    End If

    ShortCutKeysInitializeVariables

    ' Combinations
    For Each Key In KeyArray
        For i = 32 To 255
            On Error Resume Next
            Application.OnKey Key & Chr(i), Proc
        Next i
    Next Key

    ' Functions keys
    For i = 1 To 12
        On Error Resume Next
        Application.OnKey "{F" & i & "}", Proc
    Next i

    ' Combinations & Functions keys
    For Each Key In KeyArray
        For i = 1 To 12
            On Error Resume Next
            Application.OnKey Key & "{F" & i & "}", Proc
        Next i
    Next Key

End Sub

然后,你可以有以下过程来切换或重置键时,你得到的错误,你有。

Sub ShortCutKeysEnable()
    ShortCutKeysToggle True
End Sub

Sub ShortCutKeysDisable()
    ShortCutKeysToggle False
End Sub

Sub ShortCutKeysReset()
    ShortCutKeysToggle True
    ShortCutKeysToggle False
End Sub

更新:以下部分现在无关紧要,因为解决问题的不是关闭并重新打开文件,而是关闭并重新打开Excel应用程序。

如果这不起作用,你提到关闭和打开文件解决了这个问题,所以你总是可以有一个宏,关闭文件,重新打开它。

Sub CloseAndReopenActiveWorkbook()
    
    Application.ScreenUpdating = False
    
    Dim FileName As String
    FileName = ActiveWorkbook.FullName
    
    ActiveWorkbook.Close SaveChanges:=True
    Workbooks.Open FileName:=FileName
    
    Application.ScreenUpdating = True

End Sub
5jdjgkvh

5jdjgkvh2#

1.确保代码被放置在适当的模块中并被正确执行。请仔细检查是否从代码或Excel工作簿中的适当位置调用ShortCutKeysDisable过程。
1.检查Excel工作簿中是否存在任何冲突的代码或宏。如果有其他宏或外接程序操作快捷键,则它们可能会干扰ShortCutKeysDisable过程的行为。
1.检查代码中是否有错误或不一致之处。确保语法正确,所有变量和对象都正确声明和使用。检查代码中是否有任何错别字或缺少的字符。
1.请考虑在新的空白Excel工作簿中测试代码,以隔离与当前工作簿中现有设置或配置的任何潜在冲突。
1.如果问题仍然存在,请尝试在其他计算机或Excel安装上运行代码,以查看问题是否特定于您的环境。

相关问题