同じコンテキストで実行し、Excel/VBA「インを追加」、我々はそれを起動することはできませんし、各VBAアプリケーションがシングルスレッドのプロセスであるため、同じ VBAアプリケーション内でのメッセージボックスを監視。しかし、幸いにも、異なるVBAアプリケーションが異なるコンテキストで実行されるため、並列に実行できるという事実を利用できるソリューションがあります。
私の提案する解決策は、そのメッセージボックスの監視と終了専用のMS-Word文書を作成することです。監視コードとアドインのコードを別々のコンテキストで並行して実行するには、Word(または他のオフィスアプリケーション)でこれが必要です。
1- mboxKiller.docm
という名前のWordマクロを有効にするドキュメントを作成し、それをいくつかのフォルダに配置します。私の例ではC:\SO
です。 ThisDocument
にこのコードを配置し、保存します。
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
2 - ExcelワークブックのVBAで、クラスモジュールを作成し、このコードでmboxKiller
の名前:
Private killerDoc As Object
Private Sub Class_Initialize()
On Error Resume Next
Set killerDoc = CreateObject("Word.Application").Documents.Open(Filename:="C:\SO\mboxKiller.docm", ReadOnly:=True)
If Err.Number <> 0 Then
If Not killerDoc Is Nothing Then killerDoc.Close False
Set killerDoc = Nothing
MsgBox "could not lauch The mboxKiller killer. The message-box shall be closed manuallt by the user."
End If
End Sub
Private Sub Class_Terminate()
On Error Resume Next
If Not killerDoc Is Nothing Then killerDoc.Application.Quit False
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
どのようなアドインですか?あなたはそれが呼び出される方法を変更する方法がありませんか? –
私はタイマーやオープン時に手動でアドインを呼び出すことができます(すべての設定を通じて、私はVBAから直接対話できません) –