上下文菜单和键盘快捷键以相同的方法返回不同的结果

我在Excel 2013中有一个vba子(“ sub ”),它打开另一个工作簿,从中读取一些数据,返回这些数据并closures新打开的工作簿。 可以通过键盘快捷键上下文菜单中的一个条目运行这个子文件。

这个调用(这是“UTILS.sub”)工作得很好:

' Add the sub-call to a new context menu entry Call UTILS.addContextMenuEntry("Caption", 2556, "UTILS.sub") 

但是这个电话不会:

 ' Add the sub-call to a new keyboard shortcut App.OnKey "+^{M}", "UTILS.sub" 

如果我用键盘快捷方式调用sub ,它会中断而不会出错。 我已经设法解决了特定的代码行,通过debugging打破它:

 '[...] Application.ScreenUpdating = False ' Open the external Workbook Set wbHandle = Workbooks.Open("wb.xls", ReadOnly:=True) MsgBox "Debug" '[...] 

wb.xls打开(并显示),但MsgBox“debugging”不。 “打开”行之后没有任何内容会运行,并且此行之后没有任何断点。 另一个奇怪的事情:如果我在该行之前debugging带有断点的调用,它完全可以正常工作。

如何让sub运行正确,而不是关于它被上下文菜单项或键盘快捷方式调用?

我不完全确定这种行为是什么原因,但我怀疑,通过键盘快捷键或上下文菜单调用的macros实际上是通过Application.Run或其他可以重置内部执行状态的其他东西。

简单的解决方法似乎是通过一个“包装”子传递执行:

 Public Sub bar() foo End Sub Public Sub foo() Dim bar As Workbook Set bar = Workbooks.Open("C:\Book1.xls", ReadOnly:=True) MsgBox "foo" End Sub 

通过键盘快捷启动foo不会显示消息框,但调用bar会。

我自己find了我的问题的答案: stackoverflow.com/questions/17409524/

显然,如果通过包含[SHIFT]键的键盘快捷方式调用子程序,excel将无法处理“Workbooks.Open()”方法。 解决scheme:改用“Workbooks.Add()”。