脱・手作業!Access VBAで「全テキストボックスを一括クリア」する究極の作法
こんにちは。システム開発の現場で長くコードを書き続けていると、ふと初心者の頃に書いた「泥臭いコード」を思い出します。
例えば、フォーム上のテキストボックスをクリアしたいとき、こんな風に書いていませんか?
‘ 悪い例:これではコントロールが増えるたびにコードが壊れる
Me.txt氏名 = “”
Me.txt住所 = “”
Me.txt電話番号 = “”
‘ …以下100行続く(悪夢)
一つずつ名前を指定する。これは初心者が必ず通る道ですが、今日で卒業しましょう。
Access VBAには、フォーム上の部品をまとめて管理する「コレクション」という強力な武器があります。これを使えば、どんなにコントロールが増えても、コードはたったの数行で済みます。
今日は、プロの現場でも通用する「Controlsコレクションをループで回す」という極意を伝授します。
—
1. 魔法の言葉「Controlsコレクション」を知る
Accessのフォーム上にあるボタンやテキストボックスは、すべて「コントロール」と呼ばれます。そして、そのフォームが持っているすべてのコントロールを束ねているのが「Controlsコレクション」です。
イメージとしては、フォームという「巨大な箱」の中に、コントロールという「引き出し」がずらりと並んでいる状態です。私たちは、その引き出しを一つずつ開けて、「中身は空っぽか?」と確認していけばいいのです。
—
2. 実践:汎用的な初期化ロジック
以下が、フォーム上のすべてのテキストボックスを動的にクリアするコードです。これをそのまま標準モジュールやフォームのボタンクリックイベントに実装してみてください。
Public Sub ClearAllTextBoxes(frm As Form)
Dim ctrl As Control
‘ フォーム内のすべてのコントロールに対してループ処理を行う
For Each ctrl In frm.Controls
‘ コントロールの型(ControlType)がテキストボックスであるか判定
If ctrl.ControlType = acTextBox Then
‘ 値をクリアする(Nullを代入するのがAccessの作法)
ctrl.Value = Null
End If
Next ctrl
End Sub
このコードの「賢い」ポイント
1. For Each … In …: コレクションの要素を一つずつ取り出すための構文です。これを使えば、インデックス番号(0, 1, 2…)を気にする必要はありません。
2. ControlTypeの判定: `If ctrl.ControlType = acTextBox` が肝です。これがないと、ボタンやラベルまでクリアしようとしてエラーになります。「テキストボックスだけを狙い撃ちする」ためのフィルタリングですね。
3. Nullの代入: `””`(空文字)でも動くことはありますが、データベースの世界では「値がない」ことを示す `Null` を使うのが最も安全で、Accessの仕様に忠実です。
—
3. 陥りやすい「落とし穴」と回避術
初心者がこのコードを書いていて、よく遭遇するエラーがあります。
- 「読み取り専用です」エラー:
計算結果を表示しているコントロール(コントロールソースに `=Sum([金額])` などが入っているもの)に対して値を代入しようとするとエラーになります。
- 対策: `If ctrl.Locked = False Then` という条件を追加し、「ロックされていない(編集可能な)ものだけクリアする」といった工夫をすると、より堅牢なコードになります。
- サブフォームの存在:
このコードは「今のフォーム」だけを見ます。サブフォームの中身は「別のフォーム」として管理されているため、このループでは届きません。サブフォームをクリアしたい場合は、サブフォームのオブジェクトに対して同様の処理を再帰的に呼び出す必要があります。
—
4. なぜ「動的」にやる必要があるのか?
「一つずつ書くのと何が違うの?」と思われるかもしれません。答えは「保守性の圧倒的な差」です。
もし半年後に「住所2」という新しい項目が増えたとき、一つずつ書くコードだと、あなたはすべてのVBAファイルを修正して回らなければなりません。しかし、この `For Each` を使ったコードなら、何もしなくていいのです。
プログラムは「変更に強い」ことが正義です。
—
まとめ:ここをクリアすれば、あなたはもう脱初心者
今回紹介した「コレクションのループ」と「型によるフィルタリング」をマスターすれば、Access VBAの世界がガラリと変わります。
- コンボボックスもクリアしたい? → `acComboBox` を追加すればOK。
- チェックボックスをオフにしたい? → `acCheckBox` を探して `False` を代入すればOK。
プログラミングとは、面倒な作業をコードに押し付けて、自分はもっとクリエイティブなことに時間を使うための道具です。
まずはこのコードをコピーして、あなたのフォームで試してみてください。一瞬で画面がまっさらになる快感を味わえば、きっとVBAがもっと好きになるはずですよ。
何か詰まったら、いつでも聞いてくださいね。応援しています!
