テキストボックスの入力値をクリアするためのコマンドボタンを作るには?

Question 34.4 Previous Next
質問します
'------------------------------------------------------------------------------
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox1 = "" Then
    MsgBox "何か入力してください。", vbExclamation
    Cancel = True
    End If
End Sub
'------------------------------------------------------------------------------
この時、CommandButton1にキャンセルするようにプログラムされていた場合も MsgBoxのメッセイジが出ますが、メッセイジが出ないようにできますか。
私は、CommandButton1に空白の時のメッセイジと数字列の判定を行うため
'------------------------------------------------------------------------------
Private Sub txtnen_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If txtnen = "" Then
        MsgBox "コードが空白です", vbExclamation
        Cancel = True
    ElseIf IsNumeric(txtnen) = False Then
        MsgBox "コードは数値で入力してください", vbExclamation
        txtnen.Value = ""
        txtnen.SetFocus
        Cancel = True
    End If
End Sub
'------------------------------------------------------------------------------
と書いています。しかし、データーのキャンセルとか他のフォームに移動するとき空白のメッセイジが出るので困っています。 いい方法があったら教えてください。
Answer   Copyright (C) 2000.11.28 永井善王
ユーザーフォームにテキストボックスとコマンドボタンを配置して、コードを入力したいのですね。

処理概要は、TextBox1の Exitイベントプロシージャーでテキストボックスの入力値により、メッセージを表示します。
 1. 何も入力されていなければ、"コードが空白です"
 2. 数値以外が入力されたら、"コードは数値で入力してください" と表示した後、入力値をクリアする

そして解決したい問題点は、次の 2点ですね。
 1. 入力値をキャンセル(クリア)するためのコマンドボタンをクリックしたときに、"空白"メッセージを表示したくない
 2. ユーザーフォームを閉じたときに、"空白"メッセージを表示したくない
この問題を解決するために、イベントの発生順序を理解しておきましょう。

数値以外の入力 ユーザーが、誤入力をキャンセルするためにクリアボタンをクリックするタイミングには、2つあります。
(A) 例えば aaa とキー入力した後に Enterキーを押してからクリックする
(B) 例えば aaa とキー入力した直後にクリックする
左図は、(A) の場合です。フォーカスが、Enterキーを押すことによって CommandButton1に移動しています。(B)のケースでは、TextBox1に残ります。

イベントの発生順序としては、(B)のケースでは、直ちに CommandButton1の Clickイベントが発生します。
しかし (A)のケースでは、
TextBox1の Exitイベントが、Clickイベントより先に発生することを、忘れてはいけません。
Exitイベントは、別のコントロールにフォーカスを移す直前に実行されます。直前に行っていた処理を中途半端にしたままで、次の処理に移るわけにはいきません。順番に処理しましょう。

第1の問題点は、このことが原因していると思いますが、"数値で入力・・・"メッセージでなくて "空白"メッセージが表示される点は、よくわかりません。
(A)のケースで "数値で入力・・・"メッセージが表示されるのは当然と考えて、その直後でクリアボタンをクリックするか Enterキーを押せば、簡単にクリアできるように仕組んでおくことでは、不十分でしょうか。一連の操作をリズミカルに行えるように工夫しておけば、ユーザーに、いやな感じを与える恐れは無かろうかと思います。
(B)のケースでは、メッセージを表示することなく、直ぐにクリアすることが可能です。
第2の問題である「ユーザーフォームを閉じたときに "空白"メッセージを表示しない」について、考えてみましょう。
閉じるボタン「×」をクリック
メッセージが表示されるかどうかは、ユーザーが閉じるボタン「×」をクリックしたときにフォーカスがどこにあるかで、変りませんか。
フォーカスがテキストボックスには無い場合、つまり、テキストボックスに正しく入力し終わってから「×」ボタンを押したときは、メッセージは表示されないはずです。
フォーカスがテキストボックスに有る場合、つまり右上図のように、テキストボックスに何も入力しないで、「×」ボタンを押したときにはメッセージは表示されてします。その理由は先ほど学んだとおりですので、理解できますね。
空白メッセージ
左図のようにユーザーが理解しやすいメッセージ、つまり、「(終わるなら構いません)」などと書き添えて、違和感を持たれないように工夫すれば良いかと思いますが、いかがでしょうか。

もし、あなたが Internet Explorer 4.0以上と、Excel 97以上がインストールされたパソコンで、このHPを見ているのでしたら、
ここをクリック すればエクセルが起動して、サンプルブックが開きます。(ダウンロードすることも可能です)
サンプルブックが開いたら、[ファイル]-[名前を付けて保存]して、[ファイル]-[閉じる]で一旦終了します。

後で改めてExcel を起動し、ダウンロードしたブックを開いてボタンをクリックすれば、マクロを動かして確認できます。

サンプルブックのダウンロードは ここをクリック  (YNxv9g0260_TextBox.xls 56KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。
Internet Explorerから直接開いて実行すると、正しく動作しないようです。

Excel VBA Macro