INIファイルなしでAccessリンクテーブルを行う

AccessのリンクテーブルをずっとINIファイルを使用して行っていましたが
INIファイルだと32ビットとか64ビットとかのバージョンによるエラーが発生するのと
お客様に説明する際にわかりにくいという点があったので
ここ最近はテーブルを使って使用する事が増えました。

ただ、そのテーブルを直接お客様に操作してもらうのは大変なので、設定用の画面を作成してみました。
INIファイルでも設定テーブルでも、結局知りたいのはDB.accdbファイルをどこに配置するかだと思うので
共有フォルダに共有DB.accdbファイルを配置して後は各PCでAP.accdbファイルを配置して、各々参照するだけで使えるようになります。

ローカルテーブル作成

AP.accdbに下記のテーブルを作成する

テーブル名:t_system_setteing

フィールド名 データ型 説明
PK id 数値
database_path 短いテキスト(255)
t_system_setteing テーブルに1レコードダミーで作成しておきます。
id=1のレコード1件分だけ使います

システム設定画面作成

フォームを新規に作成します。

テキストボックス(txtDbPath)とボタンだけでもOKです

OKボタンのイベント処理

    ' SQL実行
    strSql = "SELECT * FROM t_system_setteing WHERE id=1"
    Set objRs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
    
    If objRs.RecordCount = 1 Then
        objRs.Edit
        objRs!database_path = Trim(Me.txtDbPath.Value)
        objRs.Update
    End If
    
    ' 後処理
    objRs.Close: Set objRs = Nothing
    
    gstrDbFullPath = Trim(Me.txtDbPath.Value)
    
    If funSetConnect("link_tbl") = False Then
        MsgBox "リンク更新に失敗しました。システム管理者に問合せしてください。", vbExclamation + vbOKOnly, "リンク更新"
        Exit Sub
    End If
    
    
    MsgBox "設定が変更されました。", vbInformation + vbOKOnly, "システム設定"
gstrDbFullPath はグローバル変数です。
標準モジュール作成して下記のように定義してください。
Public gstrDbFullPath As String

funSetConnect関数

' ----------------------------------------------------------------------------------
'     関数名   : funSetConnect
'     処理内容 : リンクテーブル接続
'     引  数  : pTblNm
'     戻り値  : 結果
' ----------------------------------------------------------------------------------
Public Function funSetConnect(pTblNm As String) As Boolean
Dim Db As Database
Dim lnkPath As String
Dim rec As Recordset
Dim tblNm As String
Dim tbl As DAO.TableDef

On Error GoTo Error
    
    funSetConnect = False
    
    Set Db = CurrentDb
    Set rec = Db.OpenRecordset(pTblNm, dbOpenDynaset)
    lnkPath = gstrDbFullPath

    With rec
        If .EOF = False Then .MoveFirst
        Do Until .EOF
            tblNm = rec.Fields(0)
            
            If ExistTable(tblNm) Then
                Db.TableDefs.Delete tblNm
            End If
            DoCmd.TransferDatabase acLink, "Microsoft Access", lnkPath, acTable, tblNm, tblNm, False
            .MoveNext
        Loop
    End With
       
    Db.Close
    
    Set rec = Nothing
    Set Db = Nothing
    
    
    ' 再表示
    RefreshDatabaseWindow
    
    
    funSetConnect = True
    
Exit Function
Error:
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical
End Function
lnkPath = gstrDbFullPath
としている所でテーブルからリンクテーブルのパスを取得して保持しています

まとめ

INIファイルを使わないでローカルテーブルに保持しておくほうが比較的便利だというのがわかります。テーブルも環境毎にデータを入れていったり区分を用意したりすると
本番環境(お客様環境様)、テスト環境様とわけたりして使用する事も可能と思いますし、出力フォルダやテンプレートフォルダも定義しておくと色々と応用ができそうです。

メニューに設定ボタンを配置してシステム設定画面の設定時にリンクテーブルを更新する処理を入れたり、起動時にリンクテーブルのチェック処理を入れてエラーの場合は自動的にシステム設定画面を表示したりして
視覚的に誘導するのも良いかなと思います。

良くあるのがシステムを再構築するとか、他の所でも使いまわししたいといった時に、基本的なファイルパスやDBファイルパスは一元管理してあった方が移行がしやすいです。
VBA上でフルパスをがんがん書いているシステムも割と多くて・・そうすると保守性が損なわれるので注意が必要です。

コメント

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