前回(https://teratail.com/questions/35437)で解決し切れなかったものが判明したため、再度質問させていただきます。
Excel VBAで、名称違いのほぼ同一内容のxlsブックを同時に開いているときに、片方のブックを終了しようとよくわからない挙動をするので、それの修正についての案をご教授ください。
片方のファイル(A)は不明なエラーのためにどんなタイミングでもApplication.Quitでエクセルごと終了。
もう片方のファイル(B)は単独時と複数展開時で処理内容を変更しています。
下記のコードは、最初のにAとBの両方にそれぞれ記載されているコード。
次にAのみ記載されているコード、共通コードのCanClose = True以降、System_CloseのEnd Subまで。
最後にBにのみ記載されているコード、共通コードのCanClose = True以降、System_CloseのEnd Subまでとなっています。
Excel2003 SP3
---共通部分--- ---ThisWorkbook--- Private Sub Workbook_BeforeClose(Cancel As Boolean) If CanClose = False Then System_Close End If If CanClose = False Then Cancel = True End If End Sub ---標準モジュール--- Public CanClose As Boolean Sub System_Close() Application.ScreenUpdating = False Dim CMsg, CStyle, CTitle, CResponse, CString CMsg = "Excelを終了します。よろしいですか?" CStyle = vbYesNo CTitle = "終了" Response = MsgBox(CMsg, CStyle, CTitle) If Response = vbYes Then ' [はい] がクリックされた場合、 MyString = "Yes" (起動時にアプリケーションの邪魔になるためにあらかじめ隠しておいたメニューバー等を表示させるApplication.CommandBars多数、関係なさそうなので割愛) Application.DisplayAlerts = False '変更保存のメッセージを表示させない Application.ScreenUpdating = True 'Excelを終了 CanClose = True ---ここまで共通---
A
------ Application.Quit Else ' [いいえ] がクリックされた場合、Msgboxを閉じる MyString = "No" End If End Sub
B
If Workbooks.Count = 1 Then ThisWorkbook.Saved = True Application.Quit Else ThisWorkbook.Close False End If Else ' [いいえ] がクリックされた場合、Msgboxを閉じる MyString = "No" End If End Sub
- AとBのブックを同時に起動させ、Bのブックをアクティブにして右上の閉じるボタンから終了すると、AのBeforeCloseに流れて一連の処理を行った後、BのBeforeCloseに流れてBが閉じる。これの処理をAに流れないようにしたい。
(追記)
Aと空白のブック(Excelの新規ブック作成機能で作成したブックに、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
のみ記述したもの)で検証(空白のブックをアクティブにしてから右上の閉じるボタンで終了しようとする)を行ったところ、こちらも先にAのBeforeCloseに流れて一連の処理を行った後、空白のブックのBeforeCloseに流れていました。
- Bと空白のブック(文字どうり新規ブックの作成機能で作成したばかりの何も編集していないブック)を同時に起動させ、空白のブックをアクティブにして右上の閉じるボタンから終了すると、Bのブックだけが終了し、Excel上で終了処理を受け付けない空白のブックが残る。
同様の案件として、空白のブックをアクティブにしてタスクバーからBのブックだけを終了させると、終了処理だけでなくセルの操作も受け付けない空白のブックが残る(Excel上のメニューバーなどは動作する)。
ThisWorkbook.Close Falseの処理に問題があるのかと思い、終了させる前にBをアクティブにするようにしたりIF文と追加して非アクティブ時の挙動について書き足したりしましたが成果無しでした。
1.は他のブックの処理実行時にAの方の処理に向かわないようにする(Aの優先度を下げる?)
2.はBの終了時に他のブックに影響を与えないようにする(少なくともBの終了処理後に他のブックも正常に終了させれるようにしたい、現状Bの終了処理後のブックはタスクマネージャを起動しないと終了できないのでそれの改善)
申し訳ありませんが問題解決へのお力添えをお願いします。
回答1件
あなたの回答
tips
プレビュー