こんにちは。現場の最前線でAccessと格闘している皆さん、お疲れ様です。
「仕様書が更新されていない」「今のテーブル構造とドキュメントが食い違っている」……そんな絶望的な状況に直面したことはありませんか? 運用保守において、ドキュメントの鮮度は命です。
今回は、Accessのデータベースエンジン(DAO)を直接操作して、「今のテーブル定義」を「Excel仕様書」として自動書き出しするという、業務自動化の第一歩にして最強の武器を紹介します。これさえマスターすれば、もう手作業で仕様書を更新する必要はありません。
—
なぜ「DAO」を使うのか?
Access VBAでデータベースを操作する際、避けて通れないのがDAO (Data Access Objects) です。
DAOはAccessの心臓部と直接会話するためのライブラリです。メニューから見る画面上の設定値だけでなく、裏側に潜む「テーブルの型」「フィールドのサイズ」「リレーションシップの定義」をすべてコードで引っ張り出すことができます。
準備:参照設定を忘れずに
このコードを動かすために、VBE(Visual Basic Editor)のメニューから以下の設定を行ってください。
1. `ツール` > `参照設定` を開く
2. `Microsoft Office 16.0 Object Library`(または使用環境のバージョン)にチェック
3. `Microsoft DAO 3.6 Object Library`(または `Office Access Database Engine Object Library`)にチェック
—
実装コード:テーブル定義抽出の神髄
このコードは、現在のデータベース内にある全てのテーブルを巡回し、その構造をExcelシートに書き出すツールです。
Option Compare Database
Option Explicit
‘ テーブル定義をExcelに書き出すメインプロシージャ
Public Sub ExportTableDefinitionToExcel()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim row As Long
Set db = CurrentDb
Set xlApp = CreateObject(“Excel.Application”)
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Sheets(1)
‘ ヘッダーの設定
xlSheet.Range(“A1:E1”).Value = Array(“テーブル名”, “フィールド名”, “データ型”, “サイズ”, “説明”)
row = 2
‘ 全テーブルをループ処理
For Each tdf In db.TableDefs
‘ システムテーブル(MSys~)を除外
If Left(tdf.Name, 4) <> “MSys” Then
For Each fld In tdf.Fields
xlSheet.Cells(row, 1).Value = tdf.Name
xlSheet.Cells(row, 2).Value = fld.Name
xlSheet.Cells(row, 3).Value = GetDataTypeName(fld.Type)
xlSheet.Cells(row, 4).Value = fld.Size
‘ プロパティから説明文を取得(存在しない場合はエラー回避)
On Error Resume Next
xlSheet.Cells(row, 5).Value = fld.Properties(“Description”).Value
On Error GoTo 0
row = row + 1
Next fld
End If
Next tdf
xlApp.Visible = True
MsgBox “仕様書の抽出が完了しました!”, vbInformation
End Sub
‘ データ型の定数から名前を返すヘルパー関数
Private Function GetDataTypeName(dataType As Integer) As String
Select Case dataType
Case 1: GetDataTypeName = “Yes/No”
Case 3: GetDataTypeName = “長整数型”
Case 10: GetDataTypeName = “テキスト型”
Case 8: GetDataTypeName = “日付型”
‘ 必要に応じてケースを増やす
Case Else: GetDataTypeName = “その他(” & dataType & “)”
End Select
End Function
—
ここがポイント!初学者がハマる罠
1. 「システムテーブル」という名の魔物
Accessを開くと見えないだけで、裏側には `MSysObjects` のようなシステム管理用のテーブルが無数に存在します。これらをループさせると、目的のテーブル以外まで書き出されてパニックになります。`If Left(tdf.Name, 4) <> “MSys”` という除外処理は、実務では必須の「おまじない」です。
2. 「Description」プロパティの罠
テーブル定義内の「説明」欄は、実は最初から存在しているわけではありません。誰かが入力しない限りオブジェクトとしては生成されないため、コードで読み取ろうとするとエラーで止まります。`On Error Resume Next` をうまく使い、エラーを無視して「値が空なら何も書かない」という賢い処理を挟むのがコツです。
3. オブジェクトの解放(メモリの節約)
今回は簡略化していますが、大規模なシステムを作る際は、最後に必ず `Set tdf = Nothing` や `Set db = Nothing` を行い、メモリを解放する癖をつけてください。Accessはメモリ管理がデリケートなため、ここを疎かにすると動作が重くなる原因になります。
—
さあ、次のステップへ
このコードが動けば、あなたはもう「手作業でドキュメントを書き写す人」から「データベース構造を支配するエンジニア」への第一歩を踏み出したことになります。
この仕組みを応用すれば:
- 変更点検知: 前回の仕様書と今回抽出したデータを比較して、変更があったフィールドを赤字にするツールを作る。
- ドキュメント自動生成: 特定の命名規則のテーブルだけを抽出し、納品用の仕様書フォーマットに流し込む。
Access VBAは、古い言語だなんて言わせません。システムの本質を理解し、その構造を自在に操るための最高のツールです。ぜひ、今日の業務で試してみてください。
「ここをもっと詳しく知りたい」「このエラーはどう対処すればいい?」といった疑問があれば、いつでも聞いてくださいね。応援しています!
