【入門編】【初心者】テーブルのプロパティから「定型入力」をVBAで一括設定し、電話番号や郵便番号の入力を統一する – Access VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリとAccessを使い倒していると、こんな悩みにぶつかったことはありませんか?

「新しいテーブルを作ったはいいものの、電話番号や郵便番号の『定型入力(InputMask)』を設定し忘れて、ユーザーによって書式がバラバラ……」
「数え切れないほどのテーブルとフィールドを開いてポチポチ手作業で設定するのは、さすがに手が痛くなるしミスも起きる……」

手作業での設定は、エンジニアにとっての「悪」です。人間がやるべきではありません。こういう面倒で退屈な作業は、すべてVBA(Visual Basic for Applications)に片付けさせましょう!

今回は、テーブルのプロパティをVBAで自在に操り、「定型入力」を一括で設定してデータ品質をガッチリ標準化する極意を伝授します。ここをクリアすれば、Access VBAの基本と「データベースをプログラムで支配する感覚」がグッと身につきますよ。ぜひ最後までついてきてくださいね!

—

1. なぜ「定型入力(InputMask)」をVBAで設定するのか?

実務でAccessデータベースを運用していると、次のような絶望的なカオスに直面します。

  • 電話番号が `03-1234-5678` の人もいえば、 `0312345678` や `(03)1234-5678` の人もいる。
  • 郵便番号にハイフンが入っていたり、入っていなかったりする。

これでは、後からクエリで集計したり、Excelや外部システムと連携させたりするときに、データが一致せず大爆発を起こします。

これを防ぐのが、フィールドの「定型入力」プロパティです。しかし、これをテーブルの数だけ手動で設定するのは修行でしかありません。VBAを使えば、一瞬で、全テーブルの特定のフィールドに対して、一糸乱れぬ正確さで定型入力ルールを適用できます。

—

2. 押さえておくべきVBAの基本概念:TableDef と Field

VBAでテーブルの構造(定義)をいじるためには、Accessの裏側にあるDAO(Data Access Objects)という仕組みを使います。

難しい言葉は置いといて、イメージはこうです。

  • TableDef(テーブルデフ): テーブルの設計図そのもの。
  • Field(フィールド): 設計図の中にある個別の列(「電話番号」や「郵便番号」など)。

VBAを使って、「テーブルの設計図を開き、特定の列を探し出して、定型入力のハンコを押す」というイメージャリーを持てば、コードは簡単に読めるようになります。

—

3. 【実践】定型力を一括設定する魔法のコード

それでは、実際に動くコードを見てみましょう。
今回は、データベース内にあるすべてのテーブルを巡回し、「電話番号」や「郵便番号」という名前(または特定の条件)に一致するフィールドを見つけ出して、自動的に定型入力を設定するジェントルなプロシージャを書きました。

標準モジュールに貼り付けて、そのまま実行してみてください。

Sub ApplyInputMaskAutomatically()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim updatedCount As Long

‘ 現在のデータベースを参照する
Set db = CurrentDb
updatedCount = 0

‘ データベース内のすべてのテーブルをループ処理する
For Each tdf In db.TableDefs
‘ システムテーブル(MSysで始まるもの)やリンクテーブルは除外する
If (tdf.Attributes & dbSystemObject) = 0 And (tdf.Attributes & dbAttachedTable) = 0 Then

‘ テーブル内のすべてのフィールドをループ処理する
For Each fld In tdf.Fields

‘ エラー対策:プロパティが存在しない場合の対策としてOn Error Resume Next
On Error Resume Next

‘ フィールド名に「電話番号」が含まれている場合
If fld.Name Like “電話番号” Or fld.Name Like “Tel” Then
‘ 電話番号の定型入力: 00-0000-0000 (プレースホルダーは’_’)
fld.Properties(“InputMask”) = “00-0000-0000;0;_”
updatedCount = updatedCount + 1
Debug.Print “設定完了(電話): ” & tdf.Name & “.” & fld.Name

‘ フィールド名に「郵便番号」が含まれている場合
ElseIf fld.Name Like “郵便番号” Or fld.Name Like “Zip” Then
‘ 郵便番号の定型入力: 000-0000 (プレースホルダーは’_’)
fld.Properties(“InputMask”) = “000-0000;0;_”
updatedCount = updatedCount + 1
Debug.Print “設定完了(郵便): ” & tdf.Name & “.” & fld.Name

End If
On Error GoTo 0 ‘ エラー番兵を解除

Next fld
End If
Next tdf

‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“合計 ” & updatedCount & ” 件のフィールドに定型入力を適用しました。”, _
vbInformation, “一括設定完了”

‘ オブジェクトの解放
Set db = Nothing
End Sub

コードのここがポイント!

1. `dbSystemObject` の除外: Accessが内部で使うシステムテーブル(`MSysObjects`など)をいじるとデータベースが壊れます。それを華麗にスルーするお作法です。
2. `Like` 演算子によるあいまい検索: 完全一致ではなく `電話番号` とすることで、「会社電話番号」「担当者TEL」などの揺れにも柔軟に対応できるようにしています。
3. 定型ルールの書式 (`00-0000-0000;0;_`):

  • 第1引数:入力のルール(`0`は数字必須の意味)。
  • 第2引数:データをテーブルに保存する際、記号(ハイフンなど)を一緒に保存するか(`0`は一緒に保存する)。
  • 第3引数:入力画面で表示するプレースホルダー(未入力部分の文字。`_`なら `___-____-____` と表示されます)。

—

4. 初学者が絶対にハマる「トラップ」と回避策

VBAでテーブルのプロパティを操作するとき、初心者が100%と言っていいほど直面するエラーがあります。それが「プロパティが見つからないエラー(実行時エラー ‘3270’)」です。

なぜエラーになるのか?

Accessのフィールドは、新しく作られた瞬間には「InputMask(定型入力)」というプロパティの箱自体が存在しないことがあります。箱がないのに「中に文字を入れろ!」と命令するので、VBAが怒り出すわけです。

華麗なる回避策:プロパティの動的追加

もしプロパティが存在しない場合に備えて、コード内で「なければ作り、あれば書き換える」というスマートな処理を組み込むのが、プロの技です。

先ほどのコードを、より堅牢(ロバスト)にした発展形がこちらです。

‘ プロパティを安全に設定するための汎用プロシージャ
Sub SetPropertySafe(fld As DAO.Field, propName As String, propType As Integer, propValue As Variant)
On Error GoTo ErrorHandler

‘ まず代入を試みる
fld.Properties(propName) = propValue
Exit Sub

ErrorHandler:
‘ エラー番号3270(プロパティが見つからない)の場合のみ新規作成する
If Err.Number = 3270 Then
Dim prop As DAO.Property
Set prop = fld.CreateProperty(propName, propType, propValue)
fld.Properties.Append prop
Set prop = Nothing
Else
MsgBox “予期せぬエラー: ” & Err.Description, vbCritical
End If
End Sub

この関数を用意しておけば、どんなプロパティ操作も怖くありません!オブジェクト指向の真髄を見た気がしませんか?

—

おわりに:Access VBAを使いこなす第一歩

今回は、テーブルのプロパティである「定型入力」をVBAで一括設定し、データの品質を標準化する手法を解説しました。

手作業という泥臭い世界から抜け出し、コード一発でデータベース全体を美しく整える快感は、エンジニアにとって最高のトニックです。「ここをクリアすれば、Access VBAの基本はバッチリですよ!」と言った意味、少し感じていただけたのではないでしょうか。

ぜひ、あなたの開発現場にあるデータベースでも試してみてください。業務効率が劇的に変わることを保証します。それでは、次のスマートな自動化の世界でお会いしましょう!

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