• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAのWorkbook_BeforeSaveイベントについての疑問)

VBAのWorkbook_BeforeSaveイベントについての疑問

このQ&Aのポイント
  • エクセル2000のVBAのWorkbook_BeforeSaveイベントについての疑問です。質問者はThisWorkbookモジュールに記述をし、終了時にSheet2を表示するように設定しています。しかし、標準モジュールの終了マクロを使用して終了すると、Sheet2が表示されず、MsgBoxメッセージが表示されます。なぜなのか疑問です。
  • VBAのWorkbook_BeforeSaveイベントについて、エクセル2000での使用時に疑問があります。ThisWorkbookモジュールに記述をし、Sheet2を表示するように設定しています。しかし、終了マクロを使用して終了すると、Sheet2が表示されず、MsgBoxメッセージが表示されます。なぜ終了マクロを使用すると正しく動作しないのか疑問です。
  • エクセル2000のVBAのWorkbook_BeforeSaveイベントについての質問です。ThisWorkbookモジュールに記述をし、終了時にSheet2を表示するように設定しています。しかし、終了マクロを使用して終了すると、Sheet2が表示されず、MsgBoxメッセージが表示されます。なぜなのか疑問です。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >Close メソッドでもWorkbook_BeforeSaveイベントでできるのはメッセージボックスの表示とセルへの値の代入だけという理解でいいのでしょうか? 私には、断言できないし、あまり、こういう部分は触れてこなかったですね。 以前も書いたような気がしますが、私は、正直、このBeforeSave イベントに関しては、あまり凝った作り方をしません。 しょせん、Close メソッドで送るなら、その前の処理をしたほうがよいとおもうのです。Workbook_BeforeSaveの範囲って、出来る部分と出来ない部分があったのでは、コードが成り立ちません。 >ThisWorkbookモジュールに以下の記述をし、終了時保存する場合にはSheet2を表に出すようにしました。 それを、あえて、そのまま活かして、終了と保存を別に別けて書いてみました。 '「標準モジュール」 '--------------------------------------------------- Sub 終了()  ThisWorkbook.RunAutoMacros xlAutoClose  ThisWorkbook.Close False End Sub Sub Auto_Close()   Worksheets("Sheet2").Select   If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Value = Time()   MsgBox "保存します。" & ActiveSheet.Name   Worksheets("Sheet1").Range("B65536").End(xlUp).Offset(1).Value = Time()   ThisWorkbook.Save   End If End Sub '「ThisWorkbook モジュールへ」 '--------------------------------------------------- Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)   If Not IsError(Application.Caller) Then    Exit Sub   End If   Worksheets("Sheet2").Select   Worksheets("Sheet1").Range("A65536").End(xlUp).Offset(1).Value = Time()   MsgBox "保存します。" & ActiveSheet.Name   Worksheets("Sheet1").Range("B65536").End(xlUp).Offset(1).Value = Time() End Sub まあ、これはもう織り込み済みということでしたら、無視してしまって構わないです。

merlionXX
質問者

お礼

> しょせん、Close メソッドで送るなら、その前の処理をしたほうがよいとおもうのです。 おっしゃるとおりですね。 ありがとうございます。 今後ともご指導くださいますようお願いいたします。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 この話は、ここの掲示板でも一度ならず出ていたような気がしますが、 「どうしてでしょうか? 」という解答としては、「仕様だから」ということになりますね。 たぶん、どこかヘルプに書かれていたような気がしますが、一旦、Close メソッドを送り出してしまうと、その後に、通常のユーザーのVBAプロシージャでは、処理は出来ないということです。だから、実際に、Close メソッドの前の部分に、処理用のコードを入れるしかないと思います。 私は、これは、Application 側が用意した範囲のものしか使えないのだろうと思っています。

merlionXX
質問者

お礼

Wendy02さま、いつもありがとうございます。 Close メソッドを送り出してしまうと、その後にVBAプロシージャでは、処理出来ないのなら、セルに値を入れられたりメッセージボックスが出せるのはなぜなんだろうとあらためて不思議に思います。 いろいろ試してみたら、 ThisWorkbook.CloseでやってもWorkbook_BeforeSaveで働いてくれたのは、Sheets("Sheet1").Range("D1").Value = Application.UserNameなどのセルへの値の代入とMsgBoxだけでした。 ActiveWindow.DisplayWorkbookTabs = False Cells.Interior.ColorIndex = 6 Columns("C:C").EntireColumn.ColumnWidth = 2 などは不可で でした。Close メソッドでもWorkbook_BeforeSaveイベントでできるのはメッセージボックスの表示とセルへの値の代入だけという理解でいいのでしょうか?

関連するQ&A