• ベストアンサー

エクセル/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

質問者が選んだベストアンサー

  • ベストアンサー
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.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 どちらかにしなければいけないでしょう。 私なら後者の方法にしますね。

merlionXX
質問者

お礼

ありがとうございました。 うまくいきました。

その他の回答 (3)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

Sub 終了() ActiveWorkbook.Close End Sub を Sub 終了() Workbook_BeforeClose True End Sub で試してみてください

merlionXX
質問者

補足

ありがとうございます。 Sub 終了() Workbook_BeforeClose True End Sub を実行したところ、コンパイルエラー「SubまたはFunctionが定義されていません」となってしまいました。

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

Sub Auto_Close その別ルーチンをコール End Sub を標準モジュールに書いておけば、 ×ボタン押されてもセーブしてくれると思われます。 Auto_Closeマクロは終了時に自動で実行されるマクロですが、 ActiveWorkbook.Closeなどマクロから閉じるときは 実行されないマクロです。 同じ性質を持つAuto_Openなんてマクロもあります。 これは開くときに実行されるものです。

merlionXX
質問者

お礼

有難うございます。 もちろん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)
回答No.1

本当ですね。。原因まではちょっと私はわかりませんが、 Closeメソッド実行中ってところにポイントがありそう。 別の(Save)メソッドを呼ぶと働かない仕様なんでしょうかね。 Workbook_BeforeCloseイベントの中身をmy_saveルーチンとかにして sub my_close call my_save ActiveWorkbook.Close end sub とか作って、閉じるときはこれをコールするようにすれば 回避できると思います。

merlionXX
質問者

お礼

ありがとうございます。 はい、今は標準モジュールの別ルーチンにしているのですが、そうすると自作の終了ボタンで終了してくれない、つまり×で終了させられた場合困ったことになります。 やむを得ず、×はCanceL=True で殺しているのですが出来ればWorkbook_BeforeCloseイベントを利用したいと思い、質問しました。

関連するQ&A

  • エクセルVBAで保存がうまくいきません

    エクセル2000です。 下記のようなVBAを記述しました。 「はい」なら別名保存 「いいえ」なら上書き保存のつもりです。 問題点 Sheets("AAA").Range("I9")の文字列内に.(半角ピリオド)があるとファイルに拡張子がつきません。 どうしたらよいのでしょうか?非常に困っています。 Sub 保存ボタン() Dim myYN As Integer Dim DRtn As Boolean Dim fn As String, fn2 As String fn = Sheets("AAA").Range("I9").Value & "_保存" fn2 = ThisWorkbook.Name myYN = MsgBox("現在の入力内容を別名で保存しますか?" _ + Chr(&HD) + Chr(&HA) + "別名保存なら「はい」" _ + Chr(&HD) + Chr(&HA) + "上書保存なら「いいえ」を選択します。" _ + Chr(&HD) + Chr(&HA) + "", vbYesNoCancel + vbQuestion, " 別名保存") If myYN = vbCancel Then Exit Sub 'キャンセルなら終了 If myYN = vbNo Then fn = fn2 '上書保存ならファイル名はそのまま DRtn = Application.Dialogs(xlDialogSaveAs).Show(ARG1:=fn, ARG2:=1) If DRtn = False Then Exit Sub 'ファイル名を消されたらキャンセル ThisWorkbook.Save '保存 ThisWorkbook.Close '閉じる End Sub

  • EXECLの変更を保存せずにブック強制的に閉じる方法を

    困り果てています VISTAとXPでマクロで EXECLの変更を保存せずにブック強制的に閉じる方法を 教えていただきたいのですがテストをしてみたマクロは 下記のようなものですがですがうまく動作しません シートの中にスピンボタンがありセルの中の数字を 変えると変更を保存しますか? となります。 Sub Auto_Close() ThisWorkbook.Saved = True End Sub Sub 例1434()   ActiveWorkbook.Saved = True ActiveWorkbook.Close End Sub Sub 13() ThisWorkbook.Close SaveChanges:=False End Sub Sub CloseBook() Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End Sub Sub CloseBook2() ActiveWorkbook.Close savechanges:=False End Sub いずれもだめでした 良い方法をお教えください。

  • EXECLの変更を保存せずにブック強制的に閉じる方法を

    困り果てています VISTAとXPでマクロで EXECLの変更を保存せずにブック強制的に閉じる方法を 教えていただきたいのですがテストをしてみたマクロは 下記のようなものですがですがうまく動作しません シートの中にスピンボタンがありセルの中の数字を 変えると変更を保存しますか? となります。 Sub Auto_Close() ThisWorkbook.Saved = True End Sub Sub 例1434()   ActiveWorkbook.Saved = True ActiveWorkbook.Close End Sub Sub 13() ThisWorkbook.Close SaveChanges:=False End Sub Sub CloseBook() Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End Sub Sub CloseBook2() ActiveWorkbook.Close savechanges:=False End Sub いずれもだめでした 良い方法をお教えください。

  • エクセルVBAの自己消滅で

    エクセル2000です。 以下のコードでこのVBAを書いたBOOK本体はパソコン内からきれいさっぱり消滅してくれます。ところがメール(OutLook)に添付して送付したものを、OutLook上で開いた場合は消滅してくれません。 OutLook上で開いた場合でも消滅させる方法はないでしょうか? Sub TEST01() Application.Interactive = False MsgBox "申し訳ありませんがこれから消滅させていただきます。" _ + Chr(&HD) + Chr(&HA) + "と、止めないでください。" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "Bye-bye!", , " Ψ(`▽´)Ψ " ActiveWorkbook.Save ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly Kill ActiveWorkbook.FullName Application.Quit End Sub

  • ファイルの別名保存の方法

    こんにちは。 Excelの素人です。blg.を参考に、ファイルの別名保存ボタンを作りましたが、別名保存後うまく終了してくれません。 現象は終了マクロから名前をつけて保存してもファイルが終了しません。もう一度ボタンをクリックするといきなり終了します。 素人の悲しさで、どこを修正すればよいのか悩んでいます。 Sub 別名保存後終了() If ThisWorkbook.Saved = False Then strFilename = ThisWorkbook.Path & "\" & _ "データ作成" & "_" & _ Format(Date, "yyyymmdd") & ".xls" strFilename = Application.GetSaveAsFilename( _ FileFilter:="Excelファイル,*.xls", _ InitialFileName:=strFilename, _ Title:="Excelファイルの保存") If strFilename = "False" Then If MsgBox("保存せずに終了します。よろしいですか?", _ vbOKCancel + vbInformation, _ "終了確認") = vbOK Then ThisWorkbook.Saved = True ThisWorkbook.Close Else Exit Sub End If Else ActiveWorkbook.SaveAs strFilename End If Else ThisWorkbook.Close End If End Sub 宜しくお願いします。

  • Excel VBAでのSaveCopyAsの挙動

    Excel 2016/2019を使っています。よろしくお願いします。 ブックに変更があった場合にバックアップを保存したいので、 上書きにならないように日付と連番をつけてバックアップ専用フォルダにSaveCopyAsを使って保存しようとしています。 明示的に「保存」アイコンをクリックすると期待通りの動作が行われます。しかし、保存せずに「x」印をクリックして閉じてしまった場合でも、変更があるならバックアップファイルを作りたいのですが、SaveCopyAsを通っているのにバックアップファイルが作成されません。 記載したコードは以下のとおりです。 ThisWorkbookオブジェクトに対して、 Public Sub Workbook_beforeClose(Cancel As Boolean) '変更があれば(ThisWorkBookを)保存 If ThisWorkBook.Saved = False Then ThisWorkBook.Save End If End Sub 'ThisWorkBookの保存時にバックアップを作成 Private Sub Workbook_BeforeSave(省略) If ThisWorkbook.Saved = False Then 'バックアップファイルのフルパスを作成  ThisWorkbook.SaveCopyAs "バックアップファイルフルパス" End Sub 何かヒントをお持ちの方みえられましたらご教示いただければ幸いです。

  • EXCELで保存済みにしたい

    EXCELのマクロである処理をするプログラムを作っています。 その中でVBAでListBoxに項目を動的に追加しています。 ListBoxに項目を追加すると終了時、 「ListBox.xlsへの変更を保存しますか?」の確認ダイアログが出ています。 このメッセージを出したくないのですがどうしたらよいですか? 以下がそのソースです。 '------------------------------------------------------ Option Explicit 'ListBox1に項目を追加 Private Sub CommandButton1_Click() ListBox1.AddItem ("りんご") ListBox1.AddItem ("みかん") ThisWorkbook.Saved = True End Sub '保存済みの確認 Private Sub CommandButton2_Click() MsgBox ThisWorkbook.Saved End Sub 'セルを変更しても保存済みにする Private Sub Worksheet_Change(ByVal Target As Range) ThisWorkbook.Saved = True End Sub '--------------------------------------------------------- セルの変更はWorksheet_Changeイベントで  ThisWorkbook.Saved = True で確認ダイアログが出ないようにしています。 よろしくお願いします。

  • エクセルVBAでメッセージボックスの表示方法について

    エクセル97です。 Sub エラー表示() A$ = Worksheets("Sheet1").Range("L10") B$ = Worksheets("Sheet1").Range("L11") C$ = Worksheets("Sheet1").Range("L12") D$ = Worksheets("Sheet1").Range("L13") E$ = Worksheets("Sheet1").Range("L14") F$ = Worksheets("Sheet1").Range("L15") If Worksheets("Sheet1").Range("L9") = False Then MsgBox "条件設定に下記のエラーがあります。" _ + Chr(&HD) + Chr(&HA) + "ご確認ください。" _ + Chr(&HD) + Chr(&HA) + A$ _ + Chr(&HD) + Chr(&HA) + B$ _ + Chr(&HD) + Chr(&HA) + C$ _ + Chr(&HD) + Chr(&HA) + D$ _ + Chr(&HD) + Chr(&HA) + E$ _ + Chr(&HD) + Chr(&HA) + F$ _ + Chr(&HD) + Chr(&HA) + "", vbCritical, "確認!!" End If End Sub 上記のようなメッセージを表示するマクロを作りました。 Sheet1のセルL10~L15に計算でエラーを表示させ、どれか一つでもエラーがあれば、メッセージボックスが出るようにしたのですが、たとえば、セルL10とL15のみのエラーだとメッセージボックスが途中、4行分も空いてしまい、かっこうが悪いのです。 改行せずに、続けて表示させようかとも思いましたが、それもあまり形がよくありません。 こんな場合、表示されてないセルの行を自動的に詰めるような方法はないのでしょうか?

  • 【Excel VBA】 ブッククローズ時の動作について

    環境: WindowsXP Office2003 ThisWorkBookモジュールに、 Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ブックの保存を要求しない ThisWorkbook.Saved = True End Sub と記述しているのですが、保存の有無を聞かれます。 しかしながら、ブックにより聞かれない場合もあります。 原因として考えられるのは、どのようなことでしょうか?

  • Workbook_BeforeClose イベントで

    Win2000Pro SP-4、Office2000 SP-3使用しています。 ExcelVBAのブックを閉じる時のイベントで、オートフィルタの解除と再設定を行い、上書き保存するコードを記述いたしました。 しかし実行後ファイルを開いてみるとオートフィルタの解除だけされており、再設定がされておりませんでした。 上書き保存のコードを省くと再設定されていました。 標準モジュールに同じコードを記述して実行した場合も同様の結果になりました。 解決法がおわかりの方がいらっしゃいましたらお教えくださいませ。 以下のコードをThisWorkbook内に記述しました。 Private Sub Workbook_BeforeClose(Cancel As Boolean)  Application.ScreenUpdating = False    Worksheets(1).AutoFilterMode = False    Range("10:10").AutoFilter    Range("B11").Select    ActiveWorkbook.Close SaveChanges:=True  Application.ScreenUpdating = True End Sub よろしくお願いいたします。

専門家に質問してみよう