嗨,我在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”之前,但这不起作用..
感谢您的帮助!
答案 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秒。该脚本将在不同的线程中运行,因此消息框不会阻止它。