[[20190122211724]] 『ブックの[x]でエクセル終了を無効にしたい』(amaryllis) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ブックの[x]でエクセル終了を無効にしたい』(amaryllis)

会社で使用しているExcelはマクロが組み込んでおり、そのマクロで処理している。

で、Excelのファイルを開いている状態で、マクロにより「終了」ボタンで終了しているが、たまに間違えて右上の[x]をクリックしてしまった。
その時、マクロの関係で、他に開いていたExcelファイルが応答なしで強制終了してしまう。

そこで、右上の[x]を無効にするマクロを調べてみたら、
https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel2010%E6%9C%80%E5%B0%8F%E5%8C%96%E6%9C%80/8c818442-048a-43d1-963d-e375daf383c9

これを見つけた。
質問者が掲示したコード(回答者が回答したコードではない)をExcel2010の標準モジュールにコピペしました。

そのマクロで再度Excelファイルを開いて[X]ボタンは無効になったとは良いが、そのファイルを終了後、マクロを含んでないファイル(.xlsx)を開いても[X]ボタンは無効のままになっていました。
[X]ボタンを無効にするファイルだけにして、他のファイルは普通に[X]で終了したい。

もう1つは、マクロで無効にした[X]ボタンをクリックした時は、MsgBoxで「[X]ボタンで終了出来ません」とメッセージを出したい。
コピペで入れたマクロにMsgBoxを入れたら、[X]ボタンを押すまでもなく、そのファイルを開いた途端メッセージが出てしまう。

あと、そのマクロに対してはExcel2010でとなっていますが、うちの会社では、今年度中(来月?)に使用しているPCがWindows 7からWindows 10に変わる予定が入っており、Windows 10のOffice 2016になるので、Excel2016にも対応するマクロでお願いしたいです

< 使用 Excel:Excel2010、使用 OS:Windows7 >


マクロで無効にした[X]ボタンをクリックした時は、MsgBoxで「[X]ボタンで終了出来ません」とメッセージを出したい。

マクロでの[X]ボタンを無効はやめて、
ThisWorkbookのモジュールに下記のコードを記述。

 Private Sub Workbook_BeforeClose(Cancel As Boolean)   
     Cancel = True
     MsgBox "[X]ボタンで終了出来ません"    
 End Sub

閉じるためのコマンドボタンのクリック時に下記のコードを。

 Private Sub CommandButton1_Click()
     Application.EnableEvents = False
      Application.Quit
 End Sub

(hatena) 2019/01/23(水) 22:29


hatenaさん、回答をありがとうございます。
明日、会社でやってみます。

あと、
>閉じるためのコマンドボタンのクリック時のマクロ……。

図形をボタンにして、閉じるためのマクロは、既に入っています。
(amaryllis) 2019/01/23(水) 23:51


会社でやってみたら、
Private Sub Workbook_BeforeClose(Cancel As Boolean)は、
最初から入っていました。
つまり、こうなってます。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayFullScreen = False
Call 他のマクロ
ActiveWorkBook.Close False
End Sub

Application〜の上にhatenaさんが回答して頂いたマクロを入れました。
あと、閉じるためのマクロは、
図形にしたのを「終了」ボタンにしたマクロは、最初から入っていると言いました通りに
Sub 終了()
Call 他のマクロ
ActiveWorkbook.Close False
End Sub

保存せずに終了するマクロですが、図形で作成したボタン「終了」をクリックするとMsgBoxが表示されてしまい、終了出来ませんでしたので、
ActiveWorkbook.Close savechanges:=False
に変更したら、「終了」ボタンで閉じられました。

ところが、
Private Sub Workbook_BeforeClose(Cancel As Boolean)
を回答してもらった通りに入れました。
再度、Excelを起動して、[X]ボタンをクリックしてみたら、MsgBoxが2回表示されてしまいます。
[X]ボタンをクリックでMsgBoxを1回だけ表示されるようにするにはどうしたら良いでしょうか?
(amaryllis) 2019/01/24(木) 13:17


ただ単にそのままコードを挿入するのではなく、
一応、それぞれのコマンドの意味を調べてから、
適切な位置に挿入、また、
以前のコードと矛盾するところは修正する必要があります。

私の提示したコードは、ブックが閉じるときに発生するイベントをキャンセルして閉じないようにしています。
そして、閉じるためのコマンドボタンでのみ閉じることができるようにしています。

ですので、Workbook_BeforeClose は私の回答のコードだけにしてください。

現状のWorkbook_BeforeCloseのコードは、閉じるボタンの方へ移動してください。

 Private Sub Workbook_BeforeClose(Cancel As Boolean)   
     Cancel = True
     MsgBox "[X]ボタンで終了出来ません"    
 End Sub

 Sub 終了() 
     Application.DisplayFullScreen = False 
     Call 他のマクロ 
     Application.EnableEvents = False 'イベント抑制、これがないとWorkbook_BeforeCloseが発動する
     ActiveWorkbook.Close False
     Application.EnableEvents = True  'イベントを許可
 End Sub 

また、右上の[x]を無効にするマクロは不要になりますのですべて削除してください。
[x]を無効にしても、Alt+F4 や タスクバーから閉じることはできますので、あまり意味がないかと。

(hatena) 2019/01/24(木) 13:50


言われた通りにやったら、出来ました。
[x]をクリックしても他のファイルが強制終了にならなくなりました。
これで、MsgBoxで表示するまでもなく正常に閉じられるので、良いです。
ありがとうございました。

あと、
>[x]を無効にしても、Alt+F4 や タスクバーから閉じることはできますので、あまり意味がないかと。

確かそうですね。
うちの会社の職制たちがデータを見るんで、あまりもAlt+F4 や タスクバーから閉じる職制はいないと思います。
一応、2番目の[x](1番目の[x]がActiveWorkbook.Close False)をクリックしてみると、保存しますか?というダイアログ画面が出ました。
まあ、今回の件の追加質問ではなく、気になっていたので、クリックしてみた。

1番目の[x]がActiveWorkbook.Close Falseだけど、(←Excel2016も?)
2番目の[x]って、マクロあるのかな(今使用のExcel2010のみ?)?
気になって質問しました。すいません。
(amaryllis) 2019/01/24(木) 20:59


1番目の[x]、2番目の[x] とは何のことでしょうか。

複数のブックを開いているということでしょうか。

ActiveWorkbook というのは文字通りアクティブなブックということです。

[x]をクリックしたらそのブックがアクティブになります。
そして、そのブックが閉じられようとして、 Workbook_BeforeCloseイベントが発生します。
そのブックのWorkbook_BeforeCloseにコードが記述されていたら、そのコードが実行されます。
Cancel=True と記述されていたら、閉じるイベントがキャンセルされて、閉じられないようになります。

そのブックにWorkbook_BeforeCloseのコードがなければ何も起こりません。そのまま閉じられます。

こんな説明で理解できましたか。
(hatena) 2019/01/25(金) 00:47


>1番目の[x]、2番目の[x] とは何のことでしょうか。

Excel2016は最小化、最大化、[X]が1つずつですが、Excel2010は2つずつあるでしょう。その事です。

(amaryllis) 2019/01/25(金) 05:20


エクセルアプリケーションの終了ボタンとブックの終了ボタンのことですね。

2010はないので、動作確認できませんが、
どちらをクリックしても "[X]ボタンで終了出来ません" メッセージができて閉じることができないように思いますが、閉じてしまうということですか。

複数のブックを開いていたら、他のブックは閉じられるかもしれませんが、Workbook_BeforeClose に Cancel=True があるブックは閉じられないはずだと思います。

実物がないので私には確認しようがないですが。
(hatena) 2019/01/25(金) 09:17


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.