【Access VBA】外部Accessデータベースの指定テーブルにリンクする

【Access VBA】外部Accessデータベースの指定テーブルにリンクする

外部Accessデータベースの指定テーブルにリンクする

この記事では「外部データベースの指定テーブルにリンクする」ために利用可能な LinkExternalDbTable というユーザー定義関数について紹介します。

この情報が読者のお役に立てば幸いです。

解決できること

Microsoft Access の中でここで紹介する LinkExternalDbTable をマクロの中で呼び出すと %USERPROFILE% からの相対パスで指定された Access の外部データベース指定テーブルへのリンクを作成することができます。

ここに %USERPROFILE% は Windows であらかじめ定義されている環境変数で Windows PCを使っている利用者のデフォルトのフォルダパスを表しています。この環境変数については必要に応じて以下の記事を参照下さい。

【Windows業務効率化】バッチファイルの基本テクニックを知ろう

読んでほしい方

こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。

 

LinkExternalDbTable 関数 の紹介

説明

%USERPROFILE% からの相対パスで指定された Access の外部データベース 上のテーブルへのリンクを作成することができます。

 

参照オブジェクト

この関数を利用するためにはこの関数の実行前に データベースツール > Visual Basic > ツール > 参照設定

【Access VBA】外部Accessデータベースの指定テーブルにリンクする

の中で

  • Microsoft Office 16.0 Access Database engine

にチェックを入れる必要があります。

利用例

Access のマクロ定義例えば “M0000_Call_LinkExternalDbTable” の中で

【Access VBA】外部Accessデータベースの指定テーブルにリンクする

 

つまり


If LinkExternalDbTable("Tools\accdb\Make_T0000_東京都コロナ発症状況_マスタ.accdb","T0000_東京都コロナ発症状況_マスタ")=0
If 文の最後

のように LinkExternalDbTableを “Tools\accdb\Make_T0000_東京都コロナ発症状況_マスタ.accdb“、”T0000_東京都コロナ発症状況_マスタ” といったパラメータを付けて呼び出します。

この “M0000_Call_LinkExternalDbTable” のでデザインビューを閉じて、この

M0000_Call_LinkExternalDbTable” マクロをダブルクリックすると

【Access VBA】外部Accessデータベースの指定テーブルにリンクする

 

このマクロが実行されこの中で  LinkExternalDbTableが実行されると、ナビゲーションウインドウ上に”T0000_東京都コロナ発症状況_マスタ“へのリンクが現れ、この”T0000_東京都コロナ発症状況_マスタ” を 「開く(O)」 で見ると

 

【Access VBA】外部Accessデータベースの指定テーブルにリンクする

 

のように  “T0000_東京都コロナ発症状況_マスタ”   テーブルのデータシートビューでこのテーブルの内容が確認可能であることがわかります。

引数

属性 意味
 リンクしたいデータベースのファイル名 文字型 %USERPROFILE%からの相対パスでリンクしたいデータベースのファイル名
テーブル名 文字型 リンクしたいデータベースのファイル名内のテーブル名

戻り値

意味
0 正常終了
1 異常終了

VBAコード

Function LinkExternalDbTable(external_db_name As String, external_table_name As String) As Integer
    
    Const C_SUCCESS As Integer = 0
    Const C_FAILURE As Integer = 1
    
    Dim isTable As Boolean
    
    isTable = False
    
    ' 現在のデータベースにテーブルが存在するかチェックします
    For Each tbl In CurrentDb.TableDefs
        If tbl.Name = external_table_name Then
            isTable = True
            Exit For
        End If
    Next
    
    If isTable = True Then
        DoCmd.DeleteObject acTable, external_table_name
    End If
    
    On Error GoTo exitWithFailure
    
    Dim absoluteExternalDbName As String
    absoluteExternalDbName = Environ("UserProfile") & "\" & external_db_name
    
    ' テーブルをリンクします
    DoCmd.TransferDatabase acLink, "Microsoft Access", absoluteExternalDbName, acTable, external_table_name, external_table_name
    
    Application.RefreshDatabaseWindow
    
    LinkExternalDbTable = C_SUCCESS
    Exit Function
    
exitWithFailure:
    LinkExternalDbTable = C_FAILURE
    
End Function

VBAコードの簡単な説明

行番号 説明
1 関数名と関数の戻り値の型(Integer:整数型)、入力パラメータ external_db_name (String:文字列型)、 external_table_name(String:文字列型)の名前、型を定義しています。
3-4 このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは32行目、36行目ででこの関数の戻り値が C_SUCCESS(0:成功)、C_FAILURE(1:失敗)であることが明確にわかるようなコーディングの仕方になります。
6-20 入力パラメータ external_db_name で指定されたテーブルが現在のデータベースに存在するかどうかを確認し、もし存在していたら isTableTrueを設定します。この処理はもし現在既にリンクが存在する場合にこのリンクを削除します。
22 この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。
24-25

Environ 関数を利用して利用者の %USERPROFILE% に相当する絶対パス名を取得します

27-28 DoCmd.TransferDatabase を使ってターゲットとなるデータベースファイル external_db_name 内の external_table_name テーブルへのリンクを作成します
30 このデータベースのナビゲーションウインドウの表示をリフレッシュし、 external_table_name テーブルを表示する
32-33 この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。
35-38 この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。

まとめ

この記事では「外部データベースの指定テーブルにリンクする」ために利用可能な LinkExternalDbTable というユーザー定義関数について紹介しました。この情報が読者のお役に立てば幸いです。


ライブラリ一覧