excel vba 锁 ecs 键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel vba 锁 ecs 键相关的知识,希望对你有一定的参考价值。

参考技术A ESC是VBA程序运行的中止键,不能被禁止。

Excel VBA 列出键绑定 (OnKey ?)

【中文标题】Excel VBA 列出键绑定 (OnKey ?)【英文标题】:Excel VBA to list key bindings (OnKey ?) 【发布时间】:2013-05-27 13:42:48 【问题描述】:

我正在使用大量 Excel vba 脚本,其中一些脚本绑定到 Ctrl 键组合。

我知道如何在 Excel 的用户界面中一次设置一个:拉出 vba 脚本列表 (Alt-F8),选择一个脚本,然后单击选项。然后,您可以将脚本绑定/取消绑定到 Ctrl 键组合。但是,您可以将多个脚本绑定到同一个键,Excel 会选择一个(可能是它以某种方式找到的第一个)并忽略其他绑定。

所以,我想将 Ctrl-e 分配给一个脚本,但首先我必须从数百个脚本列表中找到它当前绑定的其他脚本。

有没有办法让 Excel 列出当前的键绑定(我想是使用 VBA 宏)? 我已经看到了一个 Word 解决方案,它检查“KeyBindings”集合。但是,这在 Excel 中不起作用。 Excel 有不同的对象吗?

【问题讨论】:

我已经确定了两个有用的事实: (1) 优先级首先是使用 OnKey 方法从 VBA 进行的任何设置,然后是 (Alt-F8) 宏选项中设置的任何绑定(如果单选的话,这些选项似乎以不可预知的顺序被选中key 已绑定到多个宏。),最后,key 将找到它的“默认”绑定,如果有的话。 (2) 如果使用 VBA 和 OnKey 方法来绑定一个键,那至少不会有困扰 Alt-F8 方法的多个分配的不可预知行为的痛苦。任何时候执行 OnKey 绑定,它都会清除同一个键的所有其他绑定。 【参考方案1】:

搜索了一段时间后,我找不到任何以编程方式获取所有键绑定列表的可能性。

但是,如果您基本上想知道哪个程序在快捷方式上运行,但您不确定并且不想爬过您的个人工作簿、加载项等,您可以创建一个动态的断点总是在执行的 VBA 代码的第一行停止。为此,只需使用Add Watch 对话框(右键单击代码窗口中的某处)输入以下参数:

然后,只需执行您感兴趣的快捷方式 - VBE 就会向您显示绑定到它的例程...

【讨论】:

太棒了。我想知道 Excel 是否有某种“调试一切”模式。从来没听说过。但这很巧妙,可能是事实上的“调试一切”。【参考方案2】:

您可以使用 VBA 宏列出分配给宏的键。事实证明,虽然快捷键不能“直接”访问,但如果你导出一个模块,任何快捷键都会在导出的文件中列出。然后可以解析该文件以返回过程名称和相关的快捷键。

导出文件中包含此信息的行如下所示:

属性 MacroShortCutKeys.VB_ProcData.VB_Invoke_Func = "a\n14"

上面加粗的信息是宏的名称,以及相关的快捷键。我不知道结尾的 \n14 的重要性(我不确定它是否会保持一致,因为我没有对此进行广泛的测试。

运行下面的宏需要您在信任中心设置中将选项设置为信任对 VBA 项目对象模型的访问;并且您在 VBA 中设置了代码中列出的引用。

我刚刚将结果输出到即时窗口,但您也可以轻松地将其放在工作表上。

导出的文件存储在文件夹 C:\Temp 中,完成后将删除该文件。如果 C:\Temp 不存在,则必须创建它。 (这可以在宏中完成,但我很懒)。

如果宏没有快捷键,则不会列出。

编辑 该例程仅列出使用 Excel 工作表上的“宏”对话框分配的那些快捷方式。它不会列出使用 Application.OnKey 方法分配的快捷键。还不知道如何获得这些。

Option Explicit
'MUST set to Trust Access to the VBA Project Object Model
'  in Excel Options
'Set reference to:
'Microsoft Visual Basic for Applications Extensibility
'Microsoft Scripting Runtime
'Microsoft VBScript Regular Expressions 5.5
Sub MacroShortCutKeys()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As CodeModule
    Dim LineNum As Long
    Dim ProcKind As VBIDE.vbext_ProcKind
    Dim sProcName As String, sShortCutKey As String
    Const FN As String = "C:\Temp\Temp.txt"
    Dim S As String
    Dim FSO As FileSystemObject
    Dim TS As TextStream
    Dim RE As RegExp, MC As MatchCollection, M As Match

Set RE = New RegExp
With RE
    .Global = True
    .IgnoreCase = True
    .Pattern = "Attribute\s+(\w+)\.VB_ProcData\.VB_Invoke_Func = ""(\S+)(?=\\)"
End With

Set FSO = New FileSystemObject
Set VBProj = ActiveWorkbook.VBProject
For Each VBComp In VBProj.VBComponents
    Select Case VBComp.Type
        Case Is = vbext_ct_StdModule
            VBComp.Export FN
            Set TS = FSO.OpenTextFile(FN, ForReading, Format:=TristateFalse)
            S = TS.ReadAll
            TS.Close
            FSO.DeleteFile (FN)
            If RE.Test(S) = True Then
                Set MC = RE.Execute(S)
                For Each M In MC
                    Debug.Print VBComp.Name, M.SubMatches(0), M.SubMatches(1)
                Next M
            End If
    End Select
Next VBComp
End Sub

【讨论】:

以上是关于excel vba 锁 ecs 键的主要内容,如果未能解决你的问题,请参考以下文章

怎么用vba给excel 加密

Excel 请问如何破解VBA工程不可查看

Excel(VBA)自定义右键单击菜单以启动宏

使用VBA控制Excel中的Tab键行为

excel vba 运行时错误

当键盘上没有中断键时,excel VBA中断执行[关闭]