Excel VBA列出键绑定(OnKey?)

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

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

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

有没有办法让Excel列出当前的键绑定(用VBAmacros,我想)? 我看到了Word的解决scheme,检查“KeyBindings”集合。 虽然这不在Excel中工作。 Excel有不同的对象吗?

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

但是,如果您基本上想知道哪些过程在快捷方式上运行,但是您不确定并且不想通过个人工作簿,加载项等进行爬网,则可以创build一个dynamic断点总是停在第一行执行的VBA代码上。 要做到这一点,只需使用“ Add Watch对话框(在代码窗口中右键单击),input以下参数:

表达式:定时器,过程:所有模块:全部,观察类型:值改变时断开

然后,只需执行你感兴趣的快捷方式 – VBE将向你显示绑定它的例程。

您可以使用VBAmacros列出分配给macros的键。 事实certificate,尽pipe快捷键不能“直接”访问,但是如果导出模块,导出的文件中将列出任何快捷键。 然后可以parsing该文件以返回过程名称和关联的快捷键。

导出文件中具有此信息的行如下所示:

属性MacroShortCutKeys .VB_ProcData.VB_Invoke_Func =“ a \ n14”

上面的粗体信息是一个macros的名称和相关的快捷键。 我不知道最后的意义(我不确定这是否一致,因为我没有对此进行广泛的testing。

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

我只是将结果输出到立即窗口,但你也可以很容易地把它放在工作表上。

导出的文件存储在一个文件夹C:\ Temp中,并且当我们完成文件时,文件被删除。 如果C:\ Temp不存在,您将不得不创build它。 (这可能是在macros观,但我懒惰)。

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

编辑该例程只列出使用Excel工作表上的macros对话框分配的那些快捷方式。 它不会列出使用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 
Interesting Posts