Vba 以编程方式关闭MsgBox

Vba 以编程方式关闭MsgBox,vba,excel,Vba,Excel,我在Excel文件“文件a”中有一个主宏,可以打开另一个Excel文件“文件B”。打开时,外接程序将数据导入“文件B”。我想在外接程序完成导入后关闭“文件B”,我正在寻找最好的方法 我已经编写了打开“文件B”(自动触发外接程序)和关闭文件的代码,但是当外接程序完成时,它会打开一个MsgBox通知用户。我正试图完全自动化一个内部流程,因此以编程方式取消MsgBox将是理想的选择 是否可以通过VBA关闭MsgBox?我知道我可以在VBA中创建定时MsgBox,但我没有创建此MsgBox(外接程序是)

我在Excel文件“文件a”中有一个主宏,可以打开另一个Excel文件“文件B”。打开时,外接程序将数据导入“文件B”。我想在外接程序完成导入后关闭“文件B”,我正在寻找最好的方法

我已经编写了打开“文件B”(自动触发外接程序)和关闭文件的代码,但是当外接程序完成时,它会打开一个MsgBox通知用户。我正试图完全自动化一个内部流程,因此以编程方式取消MsgBox将是理想的选择

是否可以通过VBA关闭MsgBox?我知道我可以在VBA中创建定时MsgBox,但我没有创建此MsgBox(外接程序是);我只想把它打发掉。如果需要,我愿意创建Word文件并从中调用宏,但不希望使用SendKeys。

由于“加载项”和Excel/VBA在同一上下文中运行,我们无法在同一VBA应用程序中启动它并监视其消息框,因为每个VBA应用程序都是单线程进程。然而,幸运的是,有一种解决方案可以利用不同VBA应用程序在不同上下文中运行这一事实,因此它们可以并行运行

我建议的解决方案是创建一个MS Word文档,专门用于监视和关闭该消息框。我们需要在Word(或任何其他office应用程序)中使用它,以便使监控代码和加载项代码在不同的上下文中并行运行

1-创建一个名为
mboxKiller.docm
的Word宏启用文档,并将其放在某个文件夹中;i、 e.
C:\SO
在我的例子中。将此代码放入本文档中并保存:

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Sub WaitAndKillWindow()
    On Error Resume Next
    Dim h As Long: h = FindWindow(vbNullString, "Microsoft Excel")
    If h <> 0 Then SendMessage h, 16, 0, 0 ' <-- WM_Close
    Application.OnTime Now + TimeSerial(0, 0, 1), "WaitAndKillWindow"
End Sub

Private Sub Document_Open()
    WaitAndKillWindow
End Sub
3-测试和使用。在普通类模块中,输入以下代码并测试程序

Sub Test() ' <-- run this for testing after finishing the setup
    Dim killer: Set killer = New mboxKiller
    simulateAddin
    simulateAddin
    simulateAddin
End Sub

' Procedure supposed to do some calculation then display a message box
Private Sub simulateAddin()
    Dim i As Long
    For i = 0 To 1000: DoEvents: Next ' simulates some calculations
    MsgBox "This is a message box to simulate the message box of the addin." & VbCrLf & _
    "It will be automatically closed by the Word app mboxKiller"
End Sub
Sub Test()”由于“加载项”和Excel/VBA在同一上下文中运行,我们无法在同一VBA应用程序中启动它并监视其消息框,因为每个VBA应用程序都是单线程进程。然而,幸运的是,有一种解决方案可以利用不同VBA应用程序在不同上下文中运行这一事实,因此它们可以并行运行

我建议的解决方案是创建一个MS Word文档,专门用于监视和关闭该消息框。我们需要在Word(或任何其他office应用程序)中使用它,以便使监控代码和加载项代码在不同的上下文中并行运行

1-创建一个名为
mboxKiller.docm
的Word宏启用文档,并将其放在某个文件夹中;i、 e.
C:\SO
在我的例子中。将此代码放入本文档中并保存:

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Sub WaitAndKillWindow()
    On Error Resume Next
    Dim h As Long: h = FindWindow(vbNullString, "Microsoft Excel")
    If h <> 0 Then SendMessage h, 16, 0, 0 ' <-- WM_Close
    Application.OnTime Now + TimeSerial(0, 0, 1), "WaitAndKillWindow"
End Sub

Private Sub Document_Open()
    WaitAndKillWindow
End Sub
3-测试和使用。在普通类模块中,输入以下代码并测试程序

Sub Test() ' <-- run this for testing after finishing the setup
    Dim killer: Set killer = New mboxKiller
    simulateAddin
    simulateAddin
    simulateAddin
End Sub

' Procedure supposed to do some calculation then display a message box
Private Sub simulateAddin()
    Dim i As Long
    For i = 0 To 1000: DoEvents: Next ' simulates some calculations
    MsgBox "This is a message box to simulate the message box of the addin." & VbCrLf & _
    "It will be automatically closed by the Word app mboxKiller"
End Sub

Sub Test()'什么类型的外接程序?您没有任何方法来修改它的调用方式?我可以手动调用外接程序,在计时器上或打开时(通过它们的所有设置,我不能通过VBA直接与它交互)什么类型的外接程序?你没有任何方法来修改它的调用方式?我可以手动调用外接程序,在计时器上或打开时(通过它们的所有设置,我不能直接通过VBA与它交互)意识到这涉及到一个MsgBox而不是一个不同的窗口,所以我不能在它上使用FindWindow。如果您可以编辑您的答案以澄清是否可以通过编程方式取消MSGBox,我将接受itI从word启动messagebox,并可以从VBA/Excel关闭它,如下所示:
h=WaitMyWindow(“Microsoft word”,10)如果h0,则发送消息h,16,0,0
(另请注意,Microsoft word是messagebox窗口的标题)。当WaitMyWindow函数运行时,它会暂停所有其他VBA代码。我已经更新了我的问题,以完美地展示我的最新尝试,谢谢!但是它没有退出,导致Word文件保持只读-请参阅我的上一次编辑。在
子类中粘贴代码时,我似乎有一个输入错误。\u Terminate()
。。必须是
killerDoc.Application.Quit
而不是
killerDoc.App.Quit
。该例程的目的是在类的mboxKiller对象超出范围时关闭word应用程序。意识到这涉及到一个MsgBox而不是另一个窗口,因此我不能在其上使用FindWindow。如果您可以编辑您的答案以澄清是否可以通过编程方式取消MSGBox,我将接受itI从word启动messagebox,并可以从VBA/Excel关闭它,如下所示:
h=WaitMyWindow(“Microsoft word”,10)如果h0,则发送消息h,16,0,0
(另请注意,Microsoft word是messagebox窗口的标题)。当WaitMyWindow函数运行时,它会暂停所有其他VBA代码。我已经更新了我的问题,以完美地展示我的最新尝试,谢谢!但是它没有退出,导致Word文件保持只读-请参阅我的上一次编辑。在
子类中粘贴代码时,我似乎有一个输入错误。\u Terminate()
。。必须是
killerDoc.Application.Quit
而不是
killerDoc.App.Quit
。该例程的目的是在类的mboxKiller对象超出范围时关闭word应用程序。