【问题标题】:Context-menu and keyboard shortcut return different results on the same method上下文菜单和键盘快捷键在同一方法上返回不同的结果
【发布时间】:2016-09-20 13:16:42
【问题描述】:

我在 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" 没有。 “打开”行之后没有任何东西运行,并且在该行之后没有断点将被命中。另一件奇怪的事:如果我在该行之前使用断点调试 sub 的调用,则一切正常。

如何让 sub 正确运行,而不考虑它是由上下文菜单条目还是键盘快捷键调用的?

【问题讨论】:

标签: vba excel keyboard


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不完全正确 - 只要您不在快捷方式中使用 Shift 键,它就可以正常工作。
    猜你喜欢
    • 2013-01-24
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多