AccessのリンクテーブルをずっとINIファイルを使用して行っていましたが
INIファイルだと32ビットとか64ビットとかのバージョンによるエラーが発生するのと
お客様に説明する際にわかりにくいという点があったので
ここ最近はテーブルを使って使用する事が増えました。
ただ、そのテーブルを直接お客様に操作してもらうのは大変なので、設定用の画面を作成してみました。
INIファイルでも設定テーブルでも、結局知りたいのはDB.accdbファイルをどこに配置するかだと思うので
共有フォルダに共有DB.accdbファイルを配置して後は各PCでAP.accdbファイルを配置して、各々参照するだけで使えるようになります。
ローカルテーブル作成
AP.accdbに下記のテーブルを作成する
テーブル名:t_system_setteing
フィールド名 | データ型 | 説明 | |
PK | id | 数値 | |
database_path | 短いテキスト(255) |
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, "システム設定"
標準モジュール作成して下記のように定義してください。
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
としている所でテーブルからリンクテーブルのパスを取得して保持しています
まとめ
INIファイルを使わないでローカルテーブルに保持しておくほうが比較的便利だというのがわかります。テーブルも環境毎にデータを入れていったり区分を用意したりすると
本番環境(お客様環境様)、テスト環境様とわけたりして使用する事も可能と思いますし、出力フォルダやテンプレートフォルダも定義しておくと色々と応用ができそうです。
メニューに設定ボタンを配置してシステム設定画面の設定時にリンクテーブルを更新する処理を入れたり、起動時にリンクテーブルのチェック処理を入れてエラーの場合は自動的にシステム設定画面を表示したりして
視覚的に誘導するのも良いかなと思います。
良くあるのがシステムを再構築するとか、他の所でも使いまわししたいといった時に、基本的なファイルパスやDBファイルパスは一元管理してあった方が移行がしやすいです。
VBA上でフルパスをがんがん書いているシステムも割と多くて・・そうすると保守性が損なわれるので注意が必要です。
コメント