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

2024-04-05

为什么我的代码会随机偶尔禁用数据输入,但即使我隔离它并删除所有其他宏,大多数时间仍然可以工作?

该代码禁用了几乎所有快捷键,但不应影响简单的数据输入。

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

灵感来自:禁用按键或组合键 https://stackoverflow.com/questions/30117337/disable-key-or-key-combination

为什么这段代码会阻止我输入任何数据?随机发生且仅有时发生。

我所说的数据输入的意思是,如果我选择了一个单元格并尝试在该单元格中键入数据(大写或小写),它不会执行任何操作。即使我双击单元格进入编辑模式,该问题仍然存在。

关闭并打开文件可以解决该问题,但该问题偶尔会出现。

我正在使用:Excel 2021 Pro Plus LTSC


正如评论中所说,Application.Onkey当您处于编辑模式时,不应对按键行为产生任何影响,因此这告诉我这可能是 Excel/VBA 的错误。

这可能是由于您设置了很多OnKey目标,它会导致一些处理按键的进程表现不稳定,甚至有时会挂起。

可以尝试的一件事是减少您设置的组合键数量。您正在尝试设置1,785(7 x 255)OnKey仅在第一个循环中的目标!

如果您的目标是针对键盘快捷键,那么您当然可以将字符范围从 32 减少到 255,因为我真的怀疑您的键盘是否可以输出不可打印的 ASCII 字符 https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/chr-function#:%7E:text=Numbers%20from%200%E2%80%9331%20are%20the%20same%20as%20standard%2C%20nonprintable%20ASCII%20codes。您甚至可以考虑将其减少到 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

UPDATE:以下部分现在无关紧要,因为它不是关闭并重新打开文件来解决问题,而是关闭并重新打开 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA 禁用快捷键有时会禁用数据输入 的相关文章

  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • 复制一张工作表上的静态范围,然后根据单元格中的单个值粘贴到另一张工作表中的动态范围

    我对这个问题分为三个部分 我在 Sheet1 A1 中有一个带有周数的单元格 我在 Sheet1 B1 F1 中有一个需要复制的静态范围 然后 我需要将该值粘贴到 Sheet2 中的动态范围中 偏移量为行的周数 这是我正在为我经常使用的工作
  • 在 MS Word 中运行外部 vba 代码

    我可以将外部代码链接到 Word 文档吗 我有很多带有宏的 Word 文档 VBA 代码 全部使用相同的代码 我希望代码从外部源运行 而不是从所有这些文档中运行 这样 如果我必须更新代码 我只有一个地方需要更新 您可以创建一个模板并将其放入
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 将html表格保存到excel中[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须编写一个程序 定期读取网页并将
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Excel VBA - 添加自定义数字格式

    我有一个在 Excel 外部生成的文件 其中包含许多百分比 所有这些百分比都有一位小数 当导入到 Excel 中时 Excel 会在百分比中添加第二位小数 这似乎是 Excel 中百分比的某种默认格式 它只是添加了一个 0 我想将所有两位小
  • numpy NPV 和 Excel NPV 有区别吗?

    我的 Excel 中有一行包含 11 个值 TotalSavings 0 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 贴现率为 0 08 我在 Excel 中使用 计算 NPVNPV
  • Excel 工作表名称的有效字符

    在 Java 中 我们使用以下包以编程方式创建 Excel 文档 org apache poi hssf 如果您尝试设置工作表的名称 不是文件 而是内部 Excel 工作表 在以下情况下您将收到错误消息 名称超过 31 个字符 该名称包含以
  • VBA在多个文件夹中搜索特定子文件夹并移动其中的所有文件

    你能帮助我吗 我想要一个宏vba来搜索SPECIFIC例如 所有存在并移动其文件的文件夹和子文件夹之间的子文件夹 Xfolder P Desktop Folder1 subfolder SUBFOLDER1 Xfolder 我正在使用 VB
  • 使用宏打开受信任文档或启用宏时 Excel 崩溃

    正如标题所示 我无法使用宏打开受信任的文档 Excel 立即崩溃 制作文档的副本允许其打开 因为该副本不受信任 并且我可以检查 VB 编辑器中的宏 但启用宏会导致另一次崩溃 为什么会发生这种情况以及我可以采取什么措施来解决它 我今天遇到了类
  • 如何通过电子邮件发送 Excel 文件?

    我有一个 excel 文件 Excel 2003 xls 格式 我想用 c 通过电子邮件发送它 我的代码成功发送它 但是当我尝试打开响应文件时 它似乎编码错误 例如 这里是响应文件名 utf 8 B RWxzesOhbW9sw6FzXzIw
  • Excel - 在一列中查找重复项,然后将数量求和到另一列中?

    查找一列中的重复项 然后将数量求和到另一列中 https i stack imgur com AADjd png DATA RESULT A 1 A 11 A 1 B 7 A 9 C 5 B 2 D 4 B 2 E 8 B 3 C 5 D
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 替换字符串变量中的多个字符 (VBA)

    如何替换字符串变量中的多个内容 这是我在 VBA 中的示例函数 Private Function ExampleFunc ByVal unitNr As String If InStr unitNr OE gt 0 Then unitNr
  • VBA / HTML / jQuery 选择自动完成 - 在列表中选择

    我正在尝试使用 Excel 中的 VBA 在网站的列表中选择一个值 这不是一个 正常列表 该网站使用 jQuery 选择自动完成 如下所示 example http davidwalsh name demo jquery chosen ph
  • 如果 Excel 中的表格包含单元格引用,如何对其进行排序?

    我在工作表 1 中有一个 Excel 数据表 它引用了许多其他工作表中的各种不同单元格 当我尝试对工作表进行排序或过滤时 引用会随着单元格的移动而发生变化 但是 我不想手动进入每个单元格并在各处插入 符号 因为有些引用是连续的 我可能想稍后
  • 跳过行:将数据从 SSIS 导出到 Excel 文件

    我正在尝试使用 SSIS 将数据从 SQL Server 数据库导出到 Excel 文件中 我希望从第 6 行插入数据 第 5 行有标题 我可以映射标题名称Excel 目标编辑器 通过编写 SQL 命令到 SQL 表头 SELECT FRO

随机推荐