背景

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

131129-1

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

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

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

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

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

追記:推奨案

この記事を書いた当時、「可読性の良い」「メンテナンス性の良い」プログラミングというものがイマイチわかってなくて、×ボタンがクリックされたか検出してみたり、Publicなフラグを持たせてみたり、×ボタン消してみちゃったり、なんかいろいろ頑張ってましたが、今更考えると作法の良いものではありませんでした。

こちらの記事に書きましたが、まずは命名規則が大事! プロシージャは動詞+名詞の「何をするのか想像がつく」名称にしたり、モジュールやフォームもデフォルトのModule1、UserForm1のままにしておかないで、目的を表す名称にしておくこと。それと、適切な名称を付けたモジュールやフォームの中身はそれに関する記述だけにして、なんでもかんでも詰め込まないこと。

あと、Formは値のチェックと受け渡しをする場所であって、処理は分離してたほうが良いだろうな思うようになりまして、今回の件は、以下のように書くのが一番いいんじゃないかなと。

MainForm(UserForm)

Task(Module)

以下、ちょっと恥ずかしいですが、何かの役に経つかもしれないので、当時書いた内容を残しておきます。

案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 652
  • RSSを登録

公開日:2013/11/29
更新日:2017/06/19


コメントを残す




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


back to top