【入門編】【中級】リレーションシップの複雑な依存関係をグラフ化して可視化するVBAツール – Access VBA解析バイブル

スポンサーリンク

Accessの深淵を覗く:リレーションシップの「見えない絆」を可視化せよ

こんにちは。Accessの迷宮を探索するエンジニアの皆さん。

普段、Accessの「リレーションシップ画面」で線と線を繋いで満足していませんか?その線は、データベースの「生存戦略」そのものです。しかし、システムが巨大化すると、その線はスパゲッティのように絡まり合い、全貌を把握することが困難になります。

今日は、DAO(Data Access Objects)を駆使し、プログラムの手でデータベースの「地図(依存関係グラフ)」を自動生成する技術を伝授します。これさえ理解すれば、あなたはAccessのデータ構造を完全に掌握したと言っても過言ではありません。

—

1. なぜ「コード」でリレーションを解析するのか?

GUIの画面で見るリレーションシップ図は、あくまで「人間用」です。しかし、大規模開発の現場では、以下のような課題に直面します。

  • 「このテーブルを削除したら、どこに影響が出る?」
  • 「現在定義されている依存関係を、設計書として自動出力したい」

これらは、`Relation`オブジェクトを走査するプログラムを書くことで解決できます。Accessの裏側には、`Database.Relations`というコレクションが隠されています。ここを紐解くのが、真のエンジニアの第一歩です。

—

2. 依存関係を抽出するVBAコード

以下のコードは、現在のデータベース内にあるすべてのリレーションシップを走査し、どのテーブルがどのテーブルに依存しているかを「テキスト形式」でイミディエイトウィンドウに出力するツールです。

Public Sub VisualizeRelationships()
Dim db As DAO.Database
Dim rel As DAO.Relation
Dim fld As DAO.Field

Set db = CurrentDb

Debug.Print “— データベース依存関係マップ —”

‘ Relationコレクションを走査
For Each rel In db.Relations
‘ リレーションの名称と、結ばれているテーブル名を取得
Debug.Print “【関係性】: ” & rel.Name
Debug.Print ” 親テーブル: ” & rel.Table
Debug.Print ” 子テーブル: ” & rel.ForeignTable

‘ どのフィールド同士が繋がっているかを走査
For Each fld In rel.Fields
Debug.Print ” [” & fld.Name & “] -> [” & fld.ForeignName & “]”
Next fld

Debug.Print “——————————–”
Next rel

Set db = Nothing
MsgBox “解析完了!イミディエイトウィンドウを確認してください。”, vbInformation
End Sub

コードの解説

  • `CurrentDb`: 実行中のデータベース環境を指すDAOの入り口です。
  • `For Each rel In db.Relations`: Accessが内部で保持している全てのリレーション情報を一つずつ取り出します。
  • `rel.Table` & `rel.ForeignTable`: ここが肝です。前者が「親(主キー側)」、後者が「子(外部キー側)」です。この二つを繋ぐことで、データの親子関係が明確になります。

—

3. 陥りやすいエラーと「プロの注意点」

このコードを書く際、初心者が必ずと言っていいほどハマる罠があります。

罠①:`Relation`がない場合

リレーションシップが一つも定義されていないデータベースで実行してもエラーにはなりませんが、何も出力されません。「動いていない?」と不安になるかもしれませんが、それはデータが定義されていないだけです。

罠②:外部キーのフィールド名が異なる場合

`fld.Name`(親側のフィールド名)と`fld.ForeignName`(子側のフィールド名)が異なるケースは多々あります。これを取り違えると、設計書が逆になります。常に「親→子」の方向性を意識してください。

罠③:パフォーマンスの重み

テーブル数が数千単位になるような巨大なDBでループを回すと、メモリ消費が激しくなることがあります。実務では、`For Each`のループ内で重い処理をせず、一度変数に格納してから処理を行うのが鉄則です。

—

4. さあ、次のステップへ

このコードを応用すれば、以下のような発展的なツールが作成可能です。

1. テキストファイルへの書き出し: `Print #`ステートメントを使い、解析結果をCSVやMarkdownファイルとして保存する。
2. Graphviz連携: 出力結果を「DOT言語(グラフ記述言語)」の形式に整形すれば、MermaidやGraphvizを使って、自動的にリレーション図を画像生成することさえ可能です。

プログラムで構造を可視化するということは、「見えないものが見えるようになる」という魔法を手に入れることです。

「マクロの記録」を卒業し、DAOという強力な武器を手にしたあなたなら、もうAccessを恐れる必要はありません。ぜひ、このコードをベースに、自分だけの「データベース解析ツール」を育ててみてください。

ここをクリアしたあなたは、もう中級者の入り口に立っています。応援していますよ。次のステップでお会いしましょう!

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