Excel VBA列出键绑定(OnKey?)

Excel VBA列出键绑定(OnKey?),excel,shortcut,key-bindings,hotkeys,vba,Excel,Shortcut,Key Bindings,Hotkeys,Vba,我正在使用大量Excel vba脚本,其中一些脚本绑定到Ctrl键组合 我知道如何在Excel的用户界面中一次设置一个脚本:打开vba脚本列表(Alt-F8),选择一个脚本,然后单击“选项”。然后可以将脚本绑定/解除绑定到Ctrl键组合。但是,可以将多个脚本绑定到同一个键,Excel将选择一个脚本(可能是它以某种方式找到的第一个脚本),并忽略其他绑定 因此,我想将Ctrl-e分配给一个脚本,但首先我必须从数百个脚本的列表中找到它当前绑定到的其他脚本 有没有办法让Excel列出当前的键绑定(我想是

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

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

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

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

搜索了一段时间后,我无法通过编程方式获取所有键绑定的列表

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


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

您可以使用VBA宏列出分配给宏的键。结果表明,尽管无法“直接”访问快捷键,但如果导出模块,任何快捷键都会列在导出的文件中。然后可以解析该文件以返回过程名称和关联的快捷键

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

属性宏快捷键.VB\u ProcData.VB\u Invoke\u 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

我已经确定了两个有用的事实:(1)优先级首先是使用OnKey方法从VBA中设置的任何设置,然后是(Alt-F8)宏选项中设置的任何绑定(如果一个单个键已绑定到多个宏,则这些绑定似乎以不可预测的顺序被选中),最后,该键将找到其“默认”绑定(如果有)如果使用VBA和OnKey方法绑定一个键,那么至少不会出现Alt-F8方法在多个赋值上的不可预测行为。任何时候执行OnKey绑定,它都会清除同一个键的任何其他绑定。太棒了。我想知道Excel是否有某种“调试一切”功能模式。据我所知不是。但这是相当巧妙的,可能是事实上的“调试一切”。