2013
11
29

[ExcelVBA] UserFormの×(閉じる)ボタンへの対策方法いろいろ

ユーザーフォームから処理を実行させたいとき、×ボタンを押されたときの検出方法ってないのかなーと思い立ったところから、方法をまとめてみたtipsです。


背景

このようなUserFormを作ったとして。

131129-1

ボタンをふたつ作って、それぞれこういう役割をさせたいとします。

で、実際使う人に動作確認してもらったら、ちょっと気づいたことがありました。処理を中断したいとき、PCに苦手な人ほど、用意した「Cancel」ボタンを押さずに右上の×ボタンを押してしまうんですよね。

理由を聞いてみたら、「キャンセルを選ぶのもなんか怖い」とか「よくわかんないときは×を押しちゃう」というような。怖いのか。うーん悩ましい。

で、こんなツイートをしてたら親切に教えて頂けました!@riatwさん、@Mako_Misakiさん、非常に助かりました♡ありがとうございますー!

せっかくなので、今まで使ったことのある対策方法を含めて、いくつかある手段をまとめてみます。

案1.QueryCloseイベントで×ボタン検出

Module1

UserForm1

今回教えて頂いた方法です。QueryCloseイベントを使って×ボタンを検出、その場合は終了させます。(Me.Hideとか Unload Meなどの、Formを閉じるだけだとModuleに戻って処理に進んでしまうので、Endで終了させてしまいます。)キャンセルボタンも同様に。

案2.Public変数で条件分け

Module1

UserForm1

Public変数でフラグを用意しておいて、OKボタンを押された時だけフラグを立てておく。Formが閉じられてModuleに戻ってきたときにフラグが立っていなかったら終了、のような感じ。QueryCloseを知らなかった時はこんな方法で書いてましたw

変数宣言の種類についてはこちらをご参照ください。

案3.OKボタンのClickイベントに処理を書く

Module1

UserForm1

これなら、OKボタンを押されたときだけ処理が走るので、キャンセルボタンと×ボタンは、ただフォームが閉じるだけになります。処理が長い場合や、いろんなところから使い回したい場合はModuleにSubプロシージャをつくっておいてCallで呼び出せばいいかなと。

案4.×ボタンを非表示に

Module1

UserForm1

そもそも×ボタンをなくしちゃえば押されることもあるまい!という方法。

こちらを参考にさせていただきました!
131129-2

走らせてみると、こんな感じ。(2007以降では未確認です。)

追記:2013でも同じように動きました!

いかがでしたでしょうか。個人的には1,3あたりが好きな気がします。どなたかの参考になれたら幸いですー!

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 618
  • RSSを登録

公開日:2013/11/29
更新日:2014/05/12


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top