【入門編】【初心者】テーブルの「既定値」を年度ごとにVBAで一括更新し、新年度のデータ入力を効率化する – Access VBA解析バイブル

スポンサーリンク

こんにちは。Accessの迷宮に足を踏み入れた皆さん。
現場の最前線で何千ものテーブルを操ってきた私から、一つだけ確かなことをお伝えします。

「手作業でプロパティをポチポチ変えるのは、エンジニアの仕事ではありません」

年度が替わるたびに、全てのテーブルを開いて「既定値(DefaultValue)」を書き換える……そんな不毛な時間は今日で終わりにしましょう。今回は、Accessの心臓部である「DAO(Data Access Objects)」を叩いて、一瞬でテーブル定義を書き換える魔法のようなスクリプトを伝授します。

—

1. なぜ「VBAで制御」するのか?

初心者の頃は、テーブルのデザイン画面を開いて直接数値を打ち込みたくなります。しかし、テーブルが10個、20個と増えたとき、その作業は「ミスを誘発する時限爆弾」に変わります。

VBAで制御する最大のメリットは「再現性」と「高速性」です。
今回作るコードは、指定した年度を引数として渡すだけで、全テーブルの特定のフィールドを一括更新します。これこそが、脱・初心者への第一歩です。

—

2. 実践:年度更新を自動化する魔法のコード

それでは、さっそく実装してみましょう。標準モジュールに以下のコードを貼り付けてください。

Option Compare Database
Option Explicit

‘ 【解説】DAOを使ってテーブル定義を書き換えるメイン処理
Public Sub UpdateDefaultValues(ByVal targetField As String, ByVal newDefaultValue As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

Set db = CurrentDb

‘ 全テーブルをループして確認
For Each tdf In db.TableDefs
‘ システムテーブル(MSys~)は除外する
If Left(tdf.Name, 4) <> “MSys” Then

‘ そのテーブルに目的のフィールドが存在するかチェック
If FieldExists(tdf, targetField) Then
Set fld = tdf.Fields(targetField)

‘ 既定値を更新(DAOのプロパティ操作)
fld.DefaultValue = newDefaultValue

Debug.Print “更新完了: ” & tdf.Name & “.” & targetField & ” = ” & newDefaultValue
End If
End If
Next tdf

MsgBox “全テーブルの既定値更新が完了しました!”, vbInformation
End Sub

‘ 【補助関数】フィールドが存在するかを判定する安全装置
Private Function FieldExists(tdf As DAO.TableDef, fieldName As String) As Boolean
Dim fld As DAO.Field
On Error Resume Next
Set fld = tdf.Fields(fieldName)
FieldExists = (Err.Number = 0)
On Error GoTo 0
End Function

使い方

イミディエイトウィンドウ(Ctrl+G)で以下のように呼び出すだけです。
`UpdateDefaultValues “会計年度”, “2024”`

—

3. コードを読み解く「3つの鍵」

このコードがなぜ動くのか、その仕組みを理解しましょう。

1. DAO.TableDefオブジェクト: Accessのテーブル定義そのものを表す「設計図」のようなものです。これにアクセスすることで、中身を直接書き換えられます。
2. For Eachループ: 「全テーブルを一つずつ拾い上げる」という、自動化の基本動作です。
3. On Error Resume Next: これが「知的な防壁」です。もし対象のフィールドがないテーブルに遭遇しても、エラーで止めずにスキップさせるための、現場の知恵です。

—

4. ここで躓きやすい「罠」

初心者がよく陥るポイントを先回りして解説します。

  • データ型に注意: 既定値に文字列を入れる場合、`”2024″` ではなく `”‘2024′”` とシングルクォーテーションで囲む必要がある場合があります。フィールドの型(数値型かテキスト型か)を確認してください。
  • リンクテーブルの罠: 上記のコードは「ローカルテーブル」を想定しています。もしSQL Server等のリンクテーブルを操作する場合、`tdf.Connect` プロパティが空かどうかで判断を分ける必要があります。
  • 保存のタイミング: DAOでプロパティを変更すると即座に反映されます。元に戻す「Undo」は効かないので、必ずバックアップを取ってから実行してください。

—

最後に:エンジニアとしてのマインドセット

「コードを書く」ということは、単なる作業の代行ではありません。「次回の自分、あるいは未来の担当者が楽をするための仕組みづくり」です。

今日、このスクリプトを自分のものにできたなら、あなたはもう「マクロを記録する人」から「システムを設計する人」へと進化しました。

Accessのテーブル定義を自在に操れるようになると、業務の景色が変わります。次はこれを使って、インデックスの最適化や、フィールドの型の一括チェックにも挑戦してみてください。

困ったことがあれば、またいつでも聞きに来てくださいね。応援しています!

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