VBA - 在另一个工作簿的 MsgBox 中关闭或单击“确定”,
VBA - Closing or clicking OK in MsgBox from another workbook,
您好,我在 Excel VBA、
中使用以下代码
Sub A ()
Workbooks.open ("A.xls")
ActiveWorkbook.Worksheets("1").Select
ActiveSheet.CommandButton1.value = true
End Sub
我正在打开另一个工作簿(里面的代码受到保护,所以我不能修改工作簿 "B")并单击工作表上的 运行 按钮,它 returns 带有确定按钮的 MsgBox。
我想知道如何使用 VBA 关闭此 MsgBox 或单击 "OK" ...我尝试使用
`application.DisplayAlert = false`
在打开工作簿之前 "B" 但这不起作用..
感谢您的帮助!
可能有一种使用 SendKeys
的方法——但是 SendKeys
是出了名的喜怒无常。这是一个更可靠的方法:
1) 如果您还没有像这样组织它,请让按钮的 click-event 处理程序成为一个 1 行子程序,如下所示:
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
这种方法将完全绕过按钮和 运行 按钮通常触发的代码,但 运行 它在静音模式下。
On Edit:要使用 SendKeys
,您可以执行以下操作。放行
Application.SendKeys "~"
前行
ActiveSheet.CommandButton1.value = True
~
是 Enter
的字符快捷方式。 SendKeys
本身并不发送击键,而是将某些内容放在 Windows 消息队列中。 VBA 无法直接控制何时处理此消息。在这种情况下,缺乏控制是一个好处。 VBA 解释器移动到下一行,这触发了 MsgBox
。在处理 SendKeys
消息时,消息框上的默认 Okay
按钮具有焦点,因此接收到回车键。这甚至可能发生在盒子被粉刷之前,使 MsgBox
看起来似乎从未存在过——但最好将其视为在您有时间看到它之前就被摧毁了。
之所以需要在单击按钮的行之前添加 SendKeys
行,是因为一旦消息框出现,它会导致 VBA 解释器等待直到关闭-- 因此调用代码将暂停执行,直到消息框关闭后,因此 SendKeys
直到不再需要时才会被处理。
我不太相信 SendKeys
。我怀疑有时当你 运行 代码时,新激活的 sheet 中的 A1
会收到回车键(将选择从 A1
转移到 A2
) 在消息框出现之前。我不确定这是否会发生,但如果确实发生,解决方法可能是将 SendKeys
移动到 VBScript 程序。在单击按钮之前启动此程序(window 最小化并且不等待 return)。 VBScript 程序在使用 SendKeys
之前可以暂停 0.5 秒。该脚本将 运行 在不同的线程中运行,因此不会被消息框阻止。
您好,我在 Excel VBA、
中使用以下代码Sub A ()
Workbooks.open ("A.xls")
ActiveWorkbook.Worksheets("1").Select
ActiveSheet.CommandButton1.value = true
End Sub
我正在打开另一个工作簿(里面的代码受到保护,所以我不能修改工作簿 "B")并单击工作表上的 运行 按钮,它 returns 带有确定按钮的 MsgBox。
我想知道如何使用 VBA 关闭此 MsgBox 或单击 "OK" ...我尝试使用
`application.DisplayAlert = false`
在打开工作簿之前 "B" 但这不起作用..
感谢您的帮助!
可能有一种使用 SendKeys
的方法——但是 SendKeys
是出了名的喜怒无常。这是一个更可靠的方法:
1) 如果您还没有像这样组织它,请让按钮的 click-event 处理程序成为一个 1 行子程序,如下所示:
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
这种方法将完全绕过按钮和 运行 按钮通常触发的代码,但 运行 它在静音模式下。
On Edit:要使用 SendKeys
,您可以执行以下操作。放行
Application.SendKeys "~"
前行
ActiveSheet.CommandButton1.value = True
~
是 Enter
的字符快捷方式。 SendKeys
本身并不发送击键,而是将某些内容放在 Windows 消息队列中。 VBA 无法直接控制何时处理此消息。在这种情况下,缺乏控制是一个好处。 VBA 解释器移动到下一行,这触发了 MsgBox
。在处理 SendKeys
消息时,消息框上的默认 Okay
按钮具有焦点,因此接收到回车键。这甚至可能发生在盒子被粉刷之前,使 MsgBox
看起来似乎从未存在过——但最好将其视为在您有时间看到它之前就被摧毁了。
之所以需要在单击按钮的行之前添加 SendKeys
行,是因为一旦消息框出现,它会导致 VBA 解释器等待直到关闭-- 因此调用代码将暂停执行,直到消息框关闭后,因此 SendKeys
直到不再需要时才会被处理。
我不太相信 SendKeys
。我怀疑有时当你 运行 代码时,新激活的 sheet 中的 A1
会收到回车键(将选择从 A1
转移到 A2
) 在消息框出现之前。我不确定这是否会发生,但如果确实发生,解决方法可能是将 SendKeys
移动到 VBScript 程序。在单击按钮之前启动此程序(window 最小化并且不等待 return)。 VBScript 程序在使用 SendKeys
之前可以暂停 0.5 秒。该脚本将 运行 在不同的线程中运行,因此不会被消息框阻止。