我在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正确运行,而不是关于它是否被上下文菜单项或键盘快捷键调用?
答案 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()"代替。