VBA

【VBAフォームのコントロールの一括クリア】

VBA ユーザーフォーム

ユーザーフォームのコントロールクリア

例えば、テキストボックスが3つの画像の様な簡単なフォームがあったとします。

入力用として使用していて、登録が終わりテキストボックスを空にしたい場合、皆さんは、どの様に処理しますか?

単純なコードで、一つずつ空文字を代入する下記の様な処理をされているのではないでしょうか?

Private Sub CommandButton1_Click()
    TextBox1.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
End Sub

上記のコードでも問題はありませんが、例えばテキストボックスが100個あった場合、テキストボックスを空にするだけで100行のコードを書かなければいけません。

ループで処理する

繰り返し同じ処理をする場合、コントロールもループで処理をするのが定番です。

サンプルとしてテキストボックスが100個あった場合のコードを書いておきます。

Private Sub CommandButton1_Click()
    For i = 1 To 100
        UserForm1.Controls("TextBox" & i).Value = ""
    Next i
End Sub

テキストボックスの名前は、必ず同名で最後の番号は連番で付けてください。

これでコントロールが何個あっても、ループのカウンターを変更してあげるだけで対応可能になりました。

簡単ですね。

ループ処理2

上で紹介したループ処理には、コントロールの名前を同一ルールで付ける必要がありました。

実際にフォームを作成し、大量のコントロールを配置すると、上記の様なルールで名前を付けてしまうと、コードの見通しが悪くなりメンテナンスが大変になってしまいます。

皆さんも、「txtName」や「TextBoxName」など、コントロール名から、何の項目を入力するためのコントロールか連想できる名前を付けると思います。

その様な場合に、一括でコントロールをクリアできるコードを例として記載します。

Private Sub CommandButton1_Click()
    Dim ctrl As Control
    For Each ctrl In Controls
        If TypeName(ctrl) = "TextBox" Then
            ctrl.Value = ""
        ElseIf TypeName(ctrl) = "ComboBox" Then
            ctrl.ListIndex = -1
        End If
    Next
End Sub

いかがでしょうか?
行っていることは、そんなに複雑ではなくControl型の変数を宣言し、フォーム上のコントロール全てをFor Eachでループしながら代入し、コントロールのTypeで処理を分けています。

上記のコードの場合、TextBoxなら空文字代入、ComboBoxならList未選択の状態にする。
という動作をします。

当然、全てのコントロールに対し使用できます。

すごい便利ですね。

フォームコントロールクリアまとめ

今回はサクッと簡単な内容でしたが、意外に忘れやすい処理なので記事にしてみました。

コントロールを初期状態に戻すのに、長々とコードを記述するのは面倒なだけではなく、メンテナンス性も非常に悪くなってしまうので、以下に簡潔なコードを書くかが大事です。

一つ一つの関数を短くまとめることで、再利用性が高くメンテナンス性の高いコードを作成することが出来ます。

皆さんも、後から読み返すことを考えながらコードを記述してください。