【入門編】【中級】テーブルの「定型入力」をVBAで一括設定し、電話番号や郵便番号の入力を統一する – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:テーブル定義を「コード」で支配する極意

こんにちは。システム開発の現場で、泥臭いデータの不整合と長年戦ってきたエンジニアです。

Accessを使っていると、最初は画面(GUI)からのポチポチ作業で十分かもしれません。しかし、テーブルが10個、20個と増え、さらに「電話番号の入力形式がバラバラで集計できない!」といった事態に直面したとき、GUIの限界を感じるはずです。

今回は、DAO(Data Access Objects)というAccessの心臓部を直接叩き、テーブル定義をVBAで一括制御する「プロの作法」を伝授します。ここをクリアすれば、あなたはもう「Accessの達人」への入り口に立っていますよ。

—

なぜ「GUI」ではなく「VBA」で設定するのか?

結論から言うと、「再現性」と「品質」のためです。

手動で100個のフィールドを設定すれば、必ず1つはミスが混じります。しかし、VBAなら一度書いたロジックは何度でも同じ精度で実行可能です。データベースの設計変更は「手作業」から「自動化」へシフトさせる。これが大規模開発における鉄則です。

—

現場で使える「定型入力(InputMask)」一括設定コード

まずは、特定のテーブルの指定フィールドに対し、電話番号のマスク(例: `000-0000-0000`)を一括適用するコードを見てみましょう。

Public Sub ApplyInputMaskToTable()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim prp As DAO.Property

‘ 現在のデータベースを操作対象にする
Set db = CurrentDb
‘ 対象テーブルを指定(例: “T_顧客マスタ”)
Set tdf = db.TableDefs(“T_顧客マスタ”)

‘ フィールドを指定(例: “電話番号”)
Set fld = tdf.Fields(“電話番号”)

On Error Resume Next ‘ プロパティがない場合のエラーを回避
‘ 定型入力の設定
fld.Properties(“InputMask”) = “000-0000-0000;0;_”

‘ プロパティが未作成の場合はここで作成して追加する
If Err.Number = 3270 Then
Set prp = fld.CreateProperty(“InputMask”, dbText, “000-0000-0000;0;_”)
fld.Properties.Append prp
End If
On Error GoTo 0

‘ 変更を反映
tdf.Fields.Refresh

MsgBox “定型入力の設定が完了しました!”, vbInformation
End Sub

コードの重要ポイントを噛み砕く

1. DAOの階層構造: `Database` -> `TableDef` -> `Field` -> `Property` という「親から子へ」の依存関係を理解してください。オブジェクトを一つずつ辿ることで、Accessの構造を深く知ることができます。
2. エラー処理(`On Error Resume Next`): ここが重要です。実は、Accessのフィールドには「デフォルトでプロパティが存在しない」場合があります。いきなり値を代入しようとするとエラーで落ちるため、「なければ作る」という柔軟な姿勢がプロのコードです。
3. 定型入力マスクの書き方: `000-0000-0000;0;_` の `0` は数字入力を強制し、セミコロン後の `0` は「入力用記号もテーブルに保存する」という意味です。ここを調整することで、用途に応じた制御が可能です。

—

陥りやすい罠:ここだけは気をつけろ!

初心者の方がよくハマるポイントが2つあります。

  • 排他制御の壁: テーブルが「開いている」状態でVBAを実行すると、プロパティの書き換えに失敗します。一括更新を行う際は、必ず対象のテーブルを閉じた状態で実行するようにしましょう。
  • データ型の不一致: 定型入力は「テキスト型」のフィールドにのみ有効です。数値型フィールドに無理やり適用しようとするとエラーになるため、事前に `If fld.Type = dbText Then` のようなチェックを入れるのが、堅牢なシステムを作るコツです。

—

さあ、一歩先の世界へ

今回のテクニックを使えば、郵便番号、社員番号、日付など、あらゆるフィールドのルールを「たった一つのプロシージャ」で統一できるようになります。

「面倒な作業はすべて機械に任せる」。この感覚を掴めば、Access VBAは単なるツールから、あなたの強力な武器へと進化します。

もしコードが動かなかったら、まずは焦らず `tdf.Name` をイミディエイトウィンドウで出力し、正しくテーブルが掴めているか確認してみてください。一つずつ検証する、その丁寧な積み重ねが、やがて確固たる技術力になります。

応援していますよ。何かわからないことがあれば、またいつでも聞いてくださいね。

タイトルとURLをコピーしました