質問者
Excelのブックを閉じるとVBAの実行が止まる

質問
-
Office365のExcelで気が付いたのですが、ExcelのVBAでブックを開き、そのブックが閉じるのを監視して、閉じたら別の作業をする流れを作っていました。
具体的には、ブックを開いた後、Win32 API で Sleep させつつ、Workbookのコレクションをチェックして、閉じたことを検知するようなロジックを書いたのですが、ブックを閉じるとVBAが停止してしまいます。
ところが、おなじVBAがExcel2010ではちゃんと動くのです。この回避策はあるのでしょうか?
簡単な検証コードでも同じ動作になりました。
Option Explicit
’ API定義
Private Declare Sub Sleep Lib "kernel32" (ByVal dwms As Long)
Dim flg As Boolean
' 実行用ボタンのVBA
Sub ボタン1_Click()
Dim lCount As Long
lCount = 0
flg = True
Do While flg
DoEvents
ThisWorkbook.Worksheets(1).Range("A1").Value = Time$
ThisWorkbook.Worksheets(1).Range("A2").Value = CStr(lCount)
lCount = lCount + 1
If lCount = 30 Then
Workbooks.Add
End If
DoEvents
Sleep (100)
DoEvents
Loop
End Sub
’ マクロ中止用ボタンの処理
Sub ボタン2_Click()
flg = Not True
End Sub
すべての返信
-
>おなじVBAがExcel2010ではちゃんと動くのです
2010が手元にないので動作確認はしていませんが、
2013になるときに、
インスタンスが云々といった変更が行われているからじゃないかと思います。
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2016/12/19/excel2013-changes-to-sdi/深くは読んでいませんが、後半の説明を参考に
新たなブック(や既存のブック)を開くコードを直せば耐えられるのかもしれません。
※当方のスキルが浅く、無責任な返答です。m(_ _)mVBAは
「マクロで開いたならマクロで閉じてよぉ」と言っている気がします。私だったら
次のようなコードを使いマクロで閉じます。Option Explicit
' API定義
Private Declare Sub Sleep Lib "kernel32" (ByVal dwms As Long)Dim wb As Workbook
Dim flg As Boolean' 実行用ボタンのVBA
Sub ボタン1_Click()
Dim lCount As Long
lCount = 0
flg = TrueDo While flg
DoEventsThisWorkbook.Worksheets(1).Range("A1").Value = Time$
ThisWorkbook.Worksheets(1).Range("A2").Value = CStr(lCount)lCount = lCount + 1
If lCount = 30 Then
Set wb = Workbooks.Add
End If
DoEventsSleep (100)
DoEvents
Loop
End Sub' マクロ中止用ボタンの処理
Sub ボタン2_Click()
flg = Not True
End SubSub ボタン3_Click()
wb.Close
End Sub