- ベストアンサー
エクセル/BeforeCloseイベントで保存できない!?
エクセル2000です。 以下の_BeforeCloseイベントのマクロ(非常に簡略化してますが)ですが、標準モジュールに設定した Sub 終了() ActiveWorkbook.Close End Sub から終了させた場合、ActiveWorkbook.Saveの部分だけが働かないようです。 エクセル画面右上の×で終了させた場合は保存されます。 どうしてでしょうか? Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheet1 If .Range("A1") <> .Range("B1") Then ret = MsgBox("変更を保存しますか?" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "新:" & .Range("A1") _ + Chr(&HD) + Chr(&HA) + "旧:" & .Range("B1"), vbYesNo + vbQuestion, " 確認") If ret = vbYes Then ActiveWorkbook.Save '←なぜ保存されないの?! MsgBox "保存しました" ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If Else ThisWorkbook.Saved = True ActiveWorkbook.Close (False) End If End With End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Workbook_BeforeClose はPrivateなプロシージャなので、 違うモジュールから直接は呼べません。 しかもワークブックは特別なモジュールなので、 publicにしてもコンテナでコールしなければいけません。 標準モジュールのルーチンから終了させたいなら2つ方法があって、 1.Workbook_BeforeClose自身をPrivate→Publicにして sub 終了 Thisworkbook.Workbook_BeforeClose True End sub とする。 2.Thisworkbookモジュールのなかに Sub 終了2 Workbook_BeforeClose True end sub を書いて、標準モジュールの終了から sub 終了 Thisworkbook.終了2 end sub どちらかにしなければいけないでしょう。 私なら後者の方法にしますね。
その他の回答 (3)
- hige_082
- ベストアンサー率50% (379/747)
Sub 終了() ActiveWorkbook.Close End Sub を Sub 終了() Workbook_BeforeClose True End Sub で試してみてください
補足
ありがとうございます。 Sub 終了() Workbook_BeforeClose True End Sub を実行したところ、コンパイルエラー「SubまたはFunctionが定義されていません」となってしまいました。
- kenpon24
- ベストアンサー率64% (66/102)
Sub Auto_Close その別ルーチンをコール End Sub を標準モジュールに書いておけば、 ×ボタン押されてもセーブしてくれると思われます。 Auto_Closeマクロは終了時に自動で実行されるマクロですが、 ActiveWorkbook.Closeなどマクロから閉じるときは 実行されないマクロです。 同じ性質を持つAuto_Openなんてマクロもあります。 これは開くときに実行されるものです。
お礼
有難うございます。 もちろんAuto_Closeも存じておりますが、こちらをつかうと 質問で掲示したコードでは省略しましたが以下の別な問題が発生するのです。 Call 画面戻す’←これが働かない If Workbooks.Count = 1 Then Application.DisplayAlerts = False Application.Quit Else ActiveWorkbook.Close (False) End If Sub 画面戻す() For Each myCB In Application.CommandBars myCB.Enabled = True Next myCB Exit Sub End Sub 多分、起動時に For Each myCB In Application.CommandBars myCB.Enabled = False Next myCB Exit Sub としてるため、×ボタンが、BOOKの終了ではなく、エクセル自体の終了しか画面に表示されていないためではないかと思います。 そのため、BOOKを2つ開いていた場合、こちらを終了させると、もう一つの本来、ツールバーが見えていなければいけない方のツールバーが消えたままになってしまうんです。
- kenpon24
- ベストアンサー率64% (66/102)
本当ですね。。原因まではちょっと私はわかりませんが、 Closeメソッド実行中ってところにポイントがありそう。 別の(Save)メソッドを呼ぶと働かない仕様なんでしょうかね。 Workbook_BeforeCloseイベントの中身をmy_saveルーチンとかにして sub my_close call my_save ActiveWorkbook.Close end sub とか作って、閉じるときはこれをコールするようにすれば 回避できると思います。
お礼
ありがとうございます。 はい、今は標準モジュールの別ルーチンにしているのですが、そうすると自作の終了ボタンで終了してくれない、つまり×で終了させられた場合困ったことになります。 やむを得ず、×はCanceL=True で殺しているのですが出来ればWorkbook_BeforeCloseイベントを利用したいと思い、質問しました。
お礼
ありがとうございました。 うまくいきました。