Excel VBA列出键绑定(OnKey?)

Mar*_*ain 6 excel vba hotkeys shortcut key-bindings excel-vba

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

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

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

有没有办法让Excel列出当前的键绑定(我猜想用VBA宏)?我见过Word的解决方案,它检查了"KeyBindings"集合.但是,这不适用于Excel.Excel有不同的对象吗?

Pet*_*ert 7

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

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

表达式:计时器、过程:全部模块:全部、监视类型:值更改时中断

然后,只需执行您感兴趣的快捷方式 - VBE 将向您显示与其绑定的例程...

  • 杰出的。我想知道 Excel 是否有某种“调试一切”模式。从来没听说过。但这非常巧妙,并且可能是事实上的“调试一切”。 (2认同)

Ron*_*eld 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)