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

时间:2016-09-20 13:16:42

标签: excel vba excel-vba keyboard

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

此调用(这是“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 ,它会中断而不会出错。我已经设法计算出特定的代码行,它通过调试来破解:

'[...]

Application.ScreenUpdating = False

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

'[...]

wb.xls打开(并显示),但MsgBox“Debug”没有。 “Open”-line确实运行后没有任何内容,并且此行之后没有断点。另一个奇怪的事情:如果我在该行之前使用断点调试 sub 的调用,那么一切都运行良好。

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

2 个答案:

答案 0 :(得分:0)

确切确定这种行为的原因是什么,但我怀疑通过键盘快捷键或上下文菜单调用的宏实际上是通过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

答案 1 :(得分:0)

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

显然,如果通过键盘快捷键(包括[SHIFT]键)调用sub,则excel无法处理" Workbooks.Open()" -method。解决方案:使用" Workbooks.Add()"代替。