« ▼ダイエット大作戦(天気が悪い) | トップページ | ▼ダイエット大作戦(ジョギング再開) »

2007年11月12日 (月)

◇Access VBA(データ部とアプリケーション部を分離する方法)

Accessネタは2回目です。皆さんはAccess VBAでモジュールやフォーム、クエリなどを修正する際に、誰かがアクセスしていて変更できなかったことはありませんか。Accessをネットワーク上で共有する際の運用方法にも関係しますが、フォームなどのアプリケーション部分とデータ部を切り離せば誰かがアクセスしていてもアプリの変更が可能になります。今回はその方法をご紹介します。ネットを”データベースを分割”、”分離”、”データベース分割ツール”といったキーワードで検索するとたくさん情報がありますが、意外と知られていない気がします。
以下はその設定方法と私の運用例を記します。
■設定方法
メニュー「ツール」→「データベースユーティリティ」→「データベース分割ツール」→「データベースの分割」→「バックエンドデータベースの作成」で保存先とファイル名を指定し、「分割」でmdbファイルが作成されます。
既存のA.mdb(アプリケーション部分)とA_be.mdb(データ部分)となり、A.mdbにはその時点で作成していた
  ・クエリ
  ・フォーム
  ・レポート
  ・マクロ
  ・モジュール
といったアプリケーション部分が格納されます。
さらに、テーブルに変わりテーブルへのAccessリンクが設定されます。
そしてA_be.mdbには実テーブルが格納されます。

■運用例
利用者に開放するmdbを本番DBとすると、テスト用DBが必要になります。そこで以下のように運用しています。
<本番用DB>
A.mdb ・・・・・ネットワーク上の公開し、利用者がPCにダウンロードして使用
A_be.mdb・・・・ネットワーク上の公開し共有

<開発用DB>
B.mdb ・・・・・フォームやモジュールを開発/テストし、A.mdbに上書き更新
B_be.mdb・・・・A.mdbを開発用にコピーし、ネットワーク上に格納。非公開

ここで注意が必要ですが、B.mdbがリンクしているバックエンドデータベースはB_be.mdbなので、そのままA.mdbに上書きするとA.mdbが開発用のB_be.mdbを参照することになってしまいますので、リンク先データベースを切り替える必要があります。
一般的な方法かどうかは分かりませんがオブジェクト「テーブル」で右クリックし、「テーブルのリンク」でA_be.mdbの各テーブルへのリンクを作成し、B_be.mdbへのリンクを削除し、リンク名を変更するといった面倒くさい手順になると思われます。テーブル数が多いととてもじゃないですが手作業は無理ですね。リンク先を容易に変更する機能が見当たらなかったので下記の通り自分で作成しました。この機能はB.mdbに実装しておくと便利になります。

Sub m_ChangeLink()
    Dim MyDb
   
    rtn = InputBox("リンク先を指定してください", "リンク切り替え", "c:\hogehoge_be.mdb")
    If rtn = "" Then Exit Sub
   
    Set MyDb = CurrentDb
    For Each oTb In dbs.TableDefs
'        MsgBox oTb.Name & " , " & oTb.connect
        If Not (oTb.Name Like "MSys*") Then
            oTb.connect = ";DATABASE=" & rtn & ";TABLE=" & oTb.Name
            oTb.RefreshLink
        End If
    Next
    Set MyDb = Nothing
    Set oTb = Nothing
End Sub

InputBoxでリンク先mdbをフルパスで指定します。For Each oTb In dbs.TableDefsで存在するテーブルリンク分処理を繰返し、リンク先を変更し、RefreshLinkで切替えます。参考にしてみてください。

« ▼ダイエット大作戦(天気が悪い) | トップページ | ▼ダイエット大作戦(ジョギング再開) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ▼ダイエット大作戦(天気が悪い) | トップページ | ▼ダイエット大作戦(ジョギング再開) »