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

时间:2016-01-16 04:06:04

标签: excel-vba msgbox vba excel

嗨,我在Excel VBA中使用以下代码,

end

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

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

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

1)如果您还没有像这样组织它,请将按钮的click-event处理程序设置为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本身不发送击键,而是在Windows消息队列上放置一些内容。 VBA对此消息的确切处理时间没有任何直接控制权。在这种情况下,缺乏控制是一种好处。 VBA解释器移动到下一行,触发MsgBox。在处理SendKeys消息时,消息框上的默认Okay按钮具有焦点,因此接收回车键。这甚至可以在绘制框之前发生,使MsgBox似乎永远不存在 - 但最好在有时间看之前将其视为被摧毁。

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

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