【问题标题】:VBA - Closing or clicking OK in MsgBox from another workbook,VBA - 从另一个工作簿中关闭或单击 MsgBox 中的确定,
【发布时间】:2016-01-16 04:06:04
【问题描述】:

您好,下面是 Excel VBA 中的代码,

Sub A ()
    Workbooks.open ("A.xls")
    ActiveWorkbook.Worksheets("1").Select
    ActiveSheet.CommandButton1.value = true
End Sub

我正在打开另一个工作簿(里面的代码受到保护,因此我无法修改工作簿“B”)并单击工作表上的运行按钮,它会返回一个带有确定按钮的 MsgBox。

我想知道如何使用 VBA 来关闭这个 MsgBox 或点击“确定”...我尝试使用,

`application.DisplayAlert = false` 

在打开工作簿“B”之前,但这不起作用..

感谢您的帮助!

【问题讨论】:

    标签: excel msgbox vba


    【解决方案1】:

    可能有一种使用SendKeys 的方法——但SendKeys 是出了名的喜怒无常。这是一种更可靠的方法:

    1) 如果您还没有像这样组织它,请将按钮的单击事件处理程序设置为 1 行子代码,如下所示:

    Private Sub CommandButton1_Click()
        Process
    End Sub
    

    Process 是实际执行繁重工作的子。总的来说,我认为让事件处理程序主要用作 subs 的调度程序是个好主意。

    2) 按以下方式更改Process(或您选择的任何名称)的代码:

    a) 修改第一行的样子

    Sub Process(Optional Verbose As Boolean = True)
    

    b) Process 有类似的东西

    MsgBox "Processed!"
    

    替换为

    If Verbose Then MsgBox "Processed!"
    

    3) 在上面给出的代码中,替换行

    ActiveSheet.CommandButton1.value = true
    

    逐行

    Application.Run "A.xls!Process", False
    

    这种方法将完全绕过按钮并运行按钮通常触发的代码,但在静默模式下运行。

    编辑时:要使用SendKeys,您可以执行以下操作。放线

    Application.SendKeys "~" 
    

    前行

    ActiveSheet.CommandButton1.value = True
    

    ~ 是Enter 的字符快捷方式。 SendKeys 本身并不发送击键,而是将某些内容放在 Windows 消息队列中。 VBA 对何时处理此消息没有任何直接控制。在这种情况下,缺乏控制是一种好处。 VBA 解释器移到下一行,触发MsgBox。在处理SendKeys 消息时,消息框上的默认Okay 按钮具有焦点,因此接收回车键。这甚至可能在盒子被涂漆之前发生,这使得MsgBox 似乎从未存在过——但最好在你有时间看到它之前将其视为已被销毁。

    在单击按钮的那一行之前必须有SendKeys 行的原因是,一旦出现消息框,它将导致 VBA 解释器等待它关闭——因此调用代码将暂停它会在消息框关闭之前执行,因此在不再需要之前不会处理SendKeys。

    我不太信任SendKeys。我怀疑有时当您运行代码时,新激活的工作表中的A1 会在消息框出现之前收到回车键(将选择从A1 转移到A2)。我不确定这是否会发生,但如果它确实可以解决,可能是将SendKeys 移动到 VBScript 程序。在单击按钮之前启动此程序(窗口最小化且不等待返回)。 VBScript 程序在使用SendKeys 之前可以说暂停0.5 秒。该脚本将在不同的线程中运行,因此不会被消息框阻止。

    【讨论】:

    • 嘿约翰,我生成 MsgBox 的“B”文件就像一个黑盒子,我无法控制它,我只是从该文件调用一个小函数,因为输出将在我的主要 excel 中用于其他一些功能。只是当“B”文件调用完成时,它会给我一个烦人的 MsgBox 弹出窗口,告诉我该过程已完成..我想自动单击“确定”继续...
    • 哇,我找到了一种方法,如果我在调用 VBA 函数之前发送 application.sendkeys "~",那么 MsgBox 永远不会出现......但是为什么?
    • @lukieleetronic 我添加了我认为是对正在发生的事情的解释。 SendKeys 解决方案很少完全令人满意,但有时它们是不可避免的。
    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多