【AccessVBA】別のAccessファイルのテーブルへTransferDatabaseでリンク

Accessアプリケーションを作成する際に、フォーム・レポート・ソースコードなどプログラムを動かすためのファイルと、マスターデータ用のテーブルなどを格納するためのファイルを分けておくと、メンテナンスしやすくなる場合があります。

他にもAccessアプリケーションの保守性を高める手段はいくつかありますが、今回は別のAccessファイルに分離したテーブルに対してリンクを作成する方法(TransferDatabase)を紹介したいと思います。

  1. Accessファイルへのリンクテーブルの作成方法
  2. Accessファイルへのリンクテーブルの更新方法
  3. 実用例

さっそく見ていきましょう。

1.Accessファイルへのリンクテーブルの作成方法

別のAccessファイルに含まれるテーブルへのリンクの作成方法は以下の通りです。

DoCmd.TransferDatabase acLink, _
                       "MICROSOFT ACCESS", _
                       "テーブルを参照したいAccessファイルのフルパス", _
                       acTable, _
                       "参照したいテーブルの名前", _
                       "リンクテーブルの名前"

本来TransferDatabaseはリンク制御以外にImportやExportも実行できますし、その対象データベースもODBCやシェアポイントなど選択できます。今回は別のAccessデータベースファイルに含まれるテーブルへのリンク作成ですので、第一、第二、第四引数は上記の例の通りです。

2.Accessファイルへのリンクテーブルの更新方法

テーブルへのリンクの作成は、リンク元のテーブルの構造やデータ量などによって非常に時間がかかる場合があります。そんな時には、あらかじめリンクテーブルを作成しておいて、パスが変わった場合などにそのリンク情報を更新(RefreshLink)する方法が有効です。

TableDef.Connect = ";DATABASE=テーブルを参照したいAccessファイルのフルパス" & _
                   ";TABLE=参照したいテーブルの名前"
TableDef.RefreshLink

TableDefというものが出てきました。ここでは詳細の説明はしませんが、Accessのテーブルそのもの(格納されたレコードではない)をプログラムから操作する際に使うものです。このままコピペしても動きませんので、実用例のサンプルコードを紹介しますね。

3.実用例(サンプルコード)

サンプルコードの前に、前提を書いておきますね。

  • プログラムを実行するAccessファイルをCodeDB.mdbとする
  • 参照したいテーブルを含んだAccessファイルをDataDB.mdbとする
  • CodeDB.mdbとDataDB.mdbは同じフォルダに存在する
  • CodeDB.mdbに「リンク名」と「オリジナル名」の2つの項目を持つ「リンクテーブルマスター」というテーブルが存在する

上図のイメージで、CodeDB.mdbにDataDB.mdbのテーブルへのリンクを作成していきます。ソースとなるテーブルの名前はリンクテーブルマスターの「オリジナル名」に設定し、何という名前でリンクするかを「リンク名」に設定しておきます。

Public Function ReLinkTable() As Long
    Dim objTableDef As Object
    Dim objRS       As Object
    Dim bolFlag     As Boolean
'リンクテーブルの情報が格納されたマスターテーブルを開く
    Set objRS = CurrentDb.OpenRecordset("リンクテーブルマスター", _
                                        dbOpenForwardOnly, _
                                        dbReadOnly)
'マスターテーブルのレコードでループ
    Do Until objRS.EOF
        bolFlag = True
        'CodeDB.mdbに存在するテーブルでループ
        For Each objTableDef In CurrentDb.TableDefs
            If objTableDef.Name = objRS.Fields("リンク名") Then
                'リンクテーブルが存在した場合はリンク情報の更新を実施
                objTableDef.Connect = ";DATABASE=" & strGetCurrentPath & "DataDB.mdb" & _
                                      ";TABLE=" & objRS.Fields("オリジナル名")
                objTableDef.RefreshLink
                bolFlag = False
                Exit For
            End If
        Next objTableDef
        If bolFlag Then
            'リンクテーブルが存在しなかった場合はリンクを作成
            DoCmd.TransferDatabase acLink, _
                                   "MICROSOFT ACCESS", _
                                   strGetCurrentPath & "DataDB.mdb", _
                                   acTable, _
                                   objRS.Fields("オリジナル名"), _
                                   objRS.Fields("リンク名")
        End If
        objRS.MoveNext
    Loop
    objRS.Close
    Set objTableDef = Nothing
    Set objRS = Nothing
End Function

サンプルコード内に登場する「strGetCurrentPath」は【AccessVBA】開いているAccessファイルの場所を取得するで紹介したカレントパスを取得する関数です。

上記のサンプルコードをCodeDB.mdbの起動時に動くように設定しておくと、Accessファイルの置き場所が変わっても自動でリンクを再作成してくれます。

最後に、先に述べた通りテーブルのデータ量などに依存してリンクの作成時間が長くなる場合があります。アプリケーションをリリースする前にあらかじめリンクテーブルを作成しておき、その後はリンクの更新だけが実行されるようにしておきましょう。