エクセルの終了ボタン(右上の×)を無効にするには?

Question 39.1 拙著「500連発 第2弾」 Previous Next
詳細は こちら エクセル(アプリケーションそのもの)の終了ボタン(右上、×ボタン)をマクロ実行中に無効にする、または非表示にすることは可能でしょうか?
色々探してみましたが、見つけられませんでした。よろしくお願いします。
Answer   Copyright (C) 2001.3.1 永井善王
最初に確認させてください。下図の 「閉じる」ボタンのことをお尋ねでしょうか。
アプリケーションウィンドウの閉じるボタン
無効にしたい理由は、
 (1) ユーザーによって Excelが終了されてしまうことを防止する
 (2) 直下にある「閉じる」ボタンとクリックし間違えることを防止する
どちらでしょうか。
アプリケーションウィンドウのコントロールメニューボックス
別に詮索するつもりはないのですが、右図のコントロールメニューボックスにも対策しなければ、片手落ちになるかと思ったからです。これと同じものは、コントロールメニュー領域で右クリックした場合にも表示されますし。
しかし、これらはきっと連動しているでしょうから、「閉じる」機能を止めてしまえばよい筈です。

【A案】
左右のコントロールメニューを含む矩形の領域は、Excelが管理しているウインドウではなくて、Windowsが管理しているアプリケーションウィンドウであることをご存知のようですね。
このウィンドウを VBAから操作するためには、Win32APIを利用することになると思います。このWin32APIは、VBAに比べると一段と難しくなるようです。
いろいろ探されたようですが、VBAではなくて Win32APIで探してみられたら、きっと見つかるかと思います。良い本が出版されているようです。
もし私が詳しければ、もっとお教えできるのですが、残念ながら A案は以上です。
【B案】
VBAだけで実現する可能性を検討します。成功体験がある訳ではないですが、条件が整えばできるかも知れません。
ヒントは、Excelを終了しようとすると直前にブックが閉じられることです。
ブックを閉じる直前に発生するイベントを無効にすると、エクセルの終了ボタンも無効になる場合があるようです。しかし、開いたブックの内容が何も変更されなかった場合は、無効にならないようです。
整える条件は、下記の 3点ほどかと思います。

ThisWorkbookのコード画面で下記のように作成すれば、ユーザーの操作は勿論、マクロからでも、ブックは閉じれなくなります。
Cancel = 1 を消さない限り、パソコンの再起動が必要になるでしょう。
--------------------------------------------------------------------------
 ブックを閉じれないようにするイベントマクロ
--------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = 1                              'キャンセルする
End Sub
--------------------------------------------------------------------------
このイベントマクロを、ユーザー操作で閉じる場合にだけキャンセルするように、言い換えるとマクロから閉じるときはキャンセルしないように改良します。当然ですが、ブックを閉じるためのマクロを、別に作成しておく必要があります。

2番目の条件は、エクセルの終了ボタンを無効にするために、開いたブックに何らかの変更を加えておくことでしょう。例えば、Auto_Openプロシージャーを利用して、ブックを開くと自動的に新しいワークシートを追加しておくとか、正規のシートには手を加えない方法で実現する必要があります。

3番目の条件は、エクセルを終了させる機能を確保することかと思われます。もしも、そのブックを上書き保存するのであれば、2番目の条件で何らかの変更を加えたものを、元どおりにしなければなりません。

実現までには、いろいろ試行錯誤が必要かと思います。結果が判明しましたら、私にも教えてください。
蛇足ですが類似例の解説があります。ひょっとして参考になるかも知れません。

[FAQ]-[画面制御]のページの
メニューバーのリセット機能を止めるには」 の中の、
 ・ Excel画面のクライアント領域と非クライアント領域
 ・右クリックを無効にする
 ・ユーザーの操作を制約するなど

[FAQ]-[その他]のページの
ユーザーフォームの右上の[×ボタン]を無効にするには

 

Excel VBA Macro