導入:なぜこのテクニックが重要なのか
業務でユーザーフォームを使用する際、入力済みのデータを一括で削除して「次の入力」に備える操作は非常に頻繁に行われます。各テキストボックスに対して個別に「TextBox1.Value = “”」と記述していくのは、数が多ければ多いほど非効率ですし、メンテナンス性も著しく低下します。今回紹介する「ループ処理による一括クリア」を習得すれば、フォームの設計変更にも強い、スマートなコードが書けるようになります。
基礎知識:ControlsコレクションとTypeName関数
ユーザーフォーム上のすべてのコントロールは、Controlsコレクションという箱の中に格納されています。このコレクションに対して「For Each…Next」ステートメントを使うことで、配置されているすべての部品を順番に操作することが可能です。
また、フォームにはテキストボックス以外にもラベルやボタンなどが混在していることが一般的です。そこでTypeName関数を使用します。これは対象が「何という種類のコントロールか」を文字列で返す関数であり、これを用いることで「テキストボックスだけを対象に処理を実行する」という条件分岐をスマートに実現できます。
実装/解決策
具体的な手順は以下の通りです。
1. ユーザーフォームのモジュールを開きます。
2. クリア処理を行いたいタイミング(コマンドボタンのクリック時など)に、以下のロジックを組み込みます。
3. コレクション内の各コントロールを順次確認し、TypeNameが「TextBox」であるものだけを空文字(””)に置き換えます。
サンプルプログラム
ユーザーフォーム上のコマンドボタン(btn_Clearなど)に以下のコードを記述してください。
Sub ClearAllTextBoxes()
‘ コントロールを格納する変数を宣言
Dim Ctrl As Control
‘ フォーム上のすべてのコントロールに対してループ処理を実行
For Each Ctrl In Me.Controls
‘ コントロールの型名が”TextBox”であるか判定
If TypeName(Ctrl) = “TextBox” Then
‘ テキストボックスであれば値を空にする
Ctrl.Value = “”
End If
Next Ctrl
‘ 最後に最初のテキストボックスにフォーカスを戻すと親切です
‘ Me.TextBox1.SetFocus
End Sub
応用・注意点:現場で役立つ補足
この手法には、さらに実務で役立つ応用テクニックがあります。
1. 特定のテキストボックスだけ除外したい場合
もし「ID欄だけはクリアしたくない」といった要件がある場合は、コントロールのTagプロパティを活用しましょう。デザイン画面のプロパティウィンドウで、クリア対象外のテキストボックスのTag欄に「Exclude」などと入力しておき、コード内で「If TypeName(Ctrl) = “TextBox” And Ctrl.Tag <> “Exclude” Then」と条件を追加するだけで柔軟な制御が可能です。
2. コンボボックスも同時にクリアしたい場合
もしコンボボックスの値も一緒に消したい場合は、条件式を「If TypeName(Ctrl) = “TextBox” Or TypeName(Ctrl) = “ComboBox” Then」と拡張するだけでOKです。
3. 注意点
このコードは「フォームモジュール内」に記述してください。標準モジュールから操作する場合は「Me」が使えないため、フォーム名を明示的に指定する必要があります。現場では、フォーム内のボタンに直接記述するこの方法が最もシンプルで保守しやすいでしょう。
