首页 文章

VBA - 从另一个工作簿中关闭或单击MsgBox中的“确定”,

提问于
浏览
2

嗨,我在Excel VBA中的以下代码,

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

我打开另一个工作簿(里面的代码是受保护的,所以我不能修改工作簿“B”)并单击工作表上的一个运行按钮,它返回一个带OK按钮的MsgBox .

我想知道如何使用VBA关闭此MsgBox或单击“确定”...我试图使用,

`application.DisplayAlert = false`

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

谢谢你的帮助!

1 回答

  • 1

    可能有一种使用 SendKeys 的方法 - 但 SendKeys 是出了名的气质 . 这是一种更可靠的方法:

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

    Private Sub CommandButton1_Click()
        Process
    End Sub
    

    其中 Process 实际上是重负荷的子 . 总的来说,我认为将事件处理程序作为调度程序主要用作子程序是个好主意 .

    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 不能直接控制何时处理此消息 . 在这种情况下,缺乏控制是一种好处 . VBA解释器移动到下一行,触发 MsgBox . 处理 SendKeys 消息时,消息框上的默认 Okay 按钮具有焦点,因此接收回车键 . 这甚至可以在盒子被绘制之前发生,使得它似乎永远不会出现在那里 - 但是在你有时间看它之前,最好将它想象为被摧毁 .

    在单击按钮的行之前必须有 SendKeys 行的原因是,一旦出现消息框,它将导致VBA解释器等到它被关闭 - 因此调用代码将暂停其执行直到消息框已关闭,因此 SendKeys 将不再处理,直到不再需要它为止 .

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

相关问题