• 締切済み

VBAで、数式バーとステータスバーが復帰しない点について

お世話になります。 以前にも、同じ内容の質問をさせていただき、そのあともいろいろと 試してみたのですが、どうもはっきりわかりません。 Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayStatusBar = True Application.DisplayFormulaBar = True MsgBox "ここ通る" End Sub 上記のように、数式バーとステータスバーを 復帰させる処理を書き、実際に終了させるときに 処理を通るのですが、Application.Quitで閉じようとした場合には 正しくバーが復帰されるのですが、Thisworkbook.Closeで 閉じた場合には、バーが復帰されません。もちろん、 そのあとのMsgboxは両方とも表示されているため、 この処理に飛んではいるのですが…。 どういうわけか、処理を通っているのにもかかわらず、バーが 復帰しないのはなぜなのでしょうか。 Excel2000です。 以上、よろしくお願いいたします。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

ThisWorkbook.Close や ActiveWorkbook.Close 、Workbooks("XXX.xls").Close いずれを実行しても、閉じるBookの BeforeClose イベントを他マクロから呼ぶ事になります。 イベントプロシージャの場合、この『他マクロから呼び出す』時うまくいかない事例が多いです。 イベント自体は発生し、エラーなくコードも通るが、 ある種のステートメントが無視される...といった感じですね。 『Excel でプログラムでブックを保存すると、メニュー コマンドが BeforeSave イベントで実行されません。』 http://support.microsoft.com/kb/898511/ja 『[XL2000] プログラムを使用するドリブンと Workbook_Activate イベントが火事されません。』 http://support.microsoft.com/kb/294810/ja #機械翻訳版だから仕方ないでしょうけど...火事って? X( BeforeClose イベントの中味についても 他BookのOpenメソッドが効かなかったり、 ご質問のケースと同様にApplicationのプロパティ設定が効かなかったりします。 『Workbook_BeforeCloseについて』 http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200810/08100154.txt そういう仕様だという事を踏まえてコードを組み立てたほうが良いですよ。 #Application.Quit は Applicationを終了させるついでに全Bookクローズ処理がされるという事で #多分意味合いが違ってくるのでしょう。(?自信なし) 具体的には、BeforeClose イベント内ではなく、『他マクロから呼び出す』側のマクロに Application.DisplayStatusBar = True Application.DisplayFormulaBar = True ThisWorkbook.Close と記述するようにしたほうが良いです。 どうしても、という事であれば姑息な方法ですが ThisWorkbook.Close の替わりに Sub CloseTest()   ThisWorkbook.Activate   Application.CommandBars.FindControl(ID:=106).accDoDefaultAction End Sub などとして手動操作をエミュレートするようなマクロを実行すれば、 出来なくもない...といった所でしょうか。

tatapata
質問者

お礼

ありがとうございました。 何か腑に落ちない点が残りますが、仕方がないという ことで妥協するしかないということみたいですね。 強制的にはできなくはないのですが、やはりきれいなコードを 書こうと思っていると、どうしても残念に思えてなりませんが…。 とはいえ、そのようなこともあると解っただけでも 救われました。 ありがとうございました。 また何かありましたら、よろしくお願いいたします。

関連するQ&A