【问题标题】:Is there a way via excel vba to check the contents of a msgbox displayed by an external macro?有没有办法通过 excel vba 检查外部宏显示的 msgbox 的内容?
【发布时间】:2020-06-03 07:47:43
【问题描述】:

假设我正在创建一个宏,该宏需要调用另一个我无权更改其代码的 Excel 应用程序的宏。

现在,在调用其他 excel 应用程序的宏中,每当其他 excel 应用程序显示 MSGBOX 时,除非我单击该 MSGBOX,否则我的宏中的进程将停止。

现在我希望能够在显示的 MSGBOX 中获取消息,并且能够单击其“确定”按钮。

这可以通过 vba 实现吗(这意味着没有用户交互)?

顺便说一句,我正在使用 Application.Run 来运行另一个 Excel 应用程序的宏,这将创建另一个实例。(因为它在任务管理器中生成了 2 个 MS Excel 进程)

【问题讨论】:

  • 当你说“外部宏”是什么意思?是否有“外部应用程序”在您的计算机上运行,​​但不在 Excel 中?我想强调的是,这是可能的,但在同一会话 VBA 显示 MsgBox 的情况下是不可能的。当出现这样的消息时,VBA 将暂停。您需要另一个应用程序等待,拦截并按下按钮...\
  • 假设你的意思是你从你的宏中调用另一个工作簿中的另一个宏,并且另一个宏显示一个消息框,那么不,你不能做任何事情,因为它不是您当前正在执行的代码。您只能从另一个 Excel 实例执行某些操作,但即便如此,您也无法将消息框的内容传递给仍在运行的原始宏,甚至无法使其重新获得控制权并读取它,因为您的第一个 Excel 中的代码将被完全阻止,直到其他宏完成为止。
  • Q 对我来说似乎很清楚@jaypax123,但是为了那些似乎不确定的人的利益,您可以将用于调用另一个宏的代码添加到您的 Q
  • 它可能(无法测试 ATM)。推测,这可能允许您在第一个实例中继续执行代码,而另一个宏运行。然后使用 Windows API 挂钩 MsgBox
  • @chrisneilsen 不管是不是同一个Excel实例,怎么不等它完成就调用另一个宏继续执行呢?

标签: excel vba


【解决方案1】:

我可以使用 SendKeys 做我想做的事。 基本上我所做的是:

SendKeys "^c" 'copies the text inside the MsgBox
SendKeys "~" 'clicks the "OK" button
Application.Run (OtherExcel.xlsm!Module1.Function)

我不知道为什么,但它有效。我现在需要做的就是从剪贴板中获取复制的文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2019-08-16
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多