質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

11442閲覧

ExcelVBA ブックを複数起動状態での終了処理エラーについて

KEN_aivan

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2016/05/24 03:56

編集2016/05/24 06:03

前回(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
  1. AとBのブックを同時に起動させ、Bのブックをアクティブにして右上の閉じるボタンから終了すると、AのBeforeCloseに流れて一連の処理を行った後、BのBeforeCloseに流れてBが閉じる。これの処理をAに流れないようにしたい。

(追記)
Aと空白のブック(Excelの新規ブック作成機能で作成したブックに、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
のみ記述したもの)で検証(空白のブックをアクティブにしてから右上の閉じるボタンで終了しようとする)を行ったところ、こちらも先にAのBeforeCloseに流れて一連の処理を行った後、空白のブックのBeforeCloseに流れていました。

  1. Bと空白のブック(文字どうり新規ブックの作成機能で作成したばかりの何も編集していないブック)を同時に起動させ、空白のブックをアクティブにして右上の閉じるボタンから終了すると、Bのブックだけが終了し、Excel上で終了処理を受け付けない空白のブックが残る。

同様の案件として、空白のブックをアクティブにしてタスクバーからBのブックだけを終了させると、終了処理だけでなくセルの操作も受け付けない空白のブックが残る(Excel上のメニューバーなどは動作する)。
ThisWorkbook.Close Falseの処理に問題があるのかと思い、終了させる前にBをアクティブにするようにしたりIF文と追加して非アクティブ時の挙動について書き足したりしましたが成果無しでした。

1.は他のブックの処理実行時にAの方の処理に向かわないようにする(Aの優先度を下げる?)
2.はBの終了時に他のブックに影響を与えないようにする(少なくともBの終了処理後に他のブックも正常に終了させれるようにしたい、現状Bの終了処理後のブックはタスクマネージャを起動しないと終了できないのでそれの改善)

申し訳ありませんが問題解決へのお力添えをお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/05/24 05:31

質問です。 Private Sub Workbook_BeforeClose(Cancel As Boolean) は、どのブックに含まれているのでしょうか? 空白のブックが影響を受けるという事は、空白のブックにも含まれているのでしょうか? そもそも、どんな状態の時に、どんな動作をすることを目指しているのでしょうか。 ゴールを明確にしないと、適切な回答は得られないと思います。
KEN_aivan

2016/05/24 06:19

追記させていただきました。 Private Sub Workbook_BeforeClose(Cancel As Boolean)はAとBに記載されています。空白のブックは1.での追記の分を除き、作成したての文字どうり何も書かれていないブックとなっています。
guest

回答1

0

ベストアンサー

また回答させていただきます。
Excel2003の環境がなく2010での確認です。
回答内容としては前回と同様です。

AのBeforeCloseに流れて

Bの方で、ThisWorkbook.CloseをやるとWorkbook_BeforeCloseイベントが二重に発生するので、やめることをお勧めします。
この二回目のイベントですが、2010の環境ではBの方に上がります。
2003の環境では、本当にAのイベントでしょうか?

終了処理を受け付けない空白のブックが残る

これも前回の回答通りです。
ブックが複数ある状態では、Application.DisplayAlertsFalseのまま処理を継続しているためです。
前述のThisWorkbook.Closeの代わりにApplication.DisplayAlerts=Trueとしてください。

投稿2016/05/24 05:31

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEN_aivan

2016/05/24 06:20 編集

今回も返答ありがとうございます。 >AのBeforeCloseに流れて とりあえず、ThisWorkbook.Closeの件についてはこちらも把握しており、このExcelアプリケーションも2007以降での使用を前提に作成していますので、その辺りは受注元に説明させていただきますのでいったんスルーのほうをお願いします。 2003環境では、 Bの閉じるボタン押下→AのWorkbook_BeforeCloseイベントが発生→BのWorkbook_BeforeCloseイベントが発生→Bのブックが閉じ、Aのブックが残る という流れになっています。 その後Aのブックを終了しようとすると、本来表示されないはずの保存確認ウィンドウが表示されてしまうので、何とかAのほうに流れないようにしたいのですが・・・ >終了処理を受け付けない空白のブックが残る Application.DisplayAlertsをTrueにしてしまうと、利用者に保存確認ウィンドウが表示されてしまうので、予期せぬエラーを防ぐためにも保存確認ウィンドウは表示されないようにしていただけると助かります。
ttyp03

2016/05/24 06:26

改善方法を質問されているのに、スルーしていては解決できないと思うのですが。 Application.DisplayAlertsについても、System_Close()時にFalseにしていたのを元に戻すだけなので何ら問題ないと思うのですが。
ttyp03

2016/05/24 06:32

追記です。 右上の×ボタン(Excel自体の)は、Excel2003では全ブックを閉じる動きのようですね。 なのでBを閉じても、Aのイベントが発生するのだと思います。 Excel2007からはアクティブのブックしか閉じないので動きが異なりますね。 正しく動作確認するには2007を使った方が良いと思いますよ。
KEN_aivan

2016/05/24 08:36

手戻り発生でこれどころじゃなくなり、次いつ着手できるかわからないので閉めさせていただきます。解答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問