経理システムでも販売システムでも、使い続けているとどんどん重くなっていきます。
快適に運用するためにはデータの整理が必要ですが、うっかり大切なデータを削除してしまっては元も子もありません。
AccessにはDBの分割という機能があります。
テーブルをフォームやレポートのオブジェクトから切り離したDBに移行し、ソースDBとはリンクテーブルとして連結するという機能です。リンク元のパスはソース側から自由に変更できますので、必要に応じてテーブルを切り替えて運用することができるのです。
AccessDBの分割手順と、その際の注意事項やDBの切替え方法についてまとめました。
手動で行う場合と、VBAで制御するコードも併せてご紹介します。
1.AccessDBの分割手順
「データベースツール」の「Accessデータベース」をクリックします。

DBの分割ツールが起動します。
分割DBの保存場所とDB名を指定します。完了メッセージが出て終了です。

テーブル名の前に 矢印が付きます。
リンクテーブルのマークです。

「リンクテーブルマネージャー」から
リンクDBの保存場所とDB名を確認することができます。

2.リンクテーブルへ変更後の注意事項
2.1 ソースDBからデザインの変更はできない
リンク先のソースDBからリンクテーブルのデザインの変更はできなくなります。
インデックスキーやフィールドの追加などの修正はリンク元のDBから行うことになります。
データ内容の修正はできます。

2.2 テーブル検索のVBAを修正
テーブルの検索処理で次のようなコードでは実行時エラーが出ます

Dim rsdb As DAO.Recordset
Set rsdb = CurrentDb.OpenRecordset("T_DB")
rsdb.Index = "Primarykey" ’実行時エラー
rsdb.Seek "=", 1
If rsdb.NoMatch = True Then
Me.DBFile = ""
Else
Me.DBFile = rsdb![DB_Path] & "\" & rsdb![DB_Name]
End If
rsdb.Close
インデックスキーでの検索はできなくなりますので、以下のように変更する必要があります。
Dim sql As String
sql = "select * from T_DB where DB_ID = 1"
Set rsdb = CurrentDb.OpenRecordset(sql)
3.手動でのリンク元DBの切替

①リンク元テーブルを切り替える場合は、ソースDBから現在のテーブルを削除します。
②「新しいデータソース」→「データベースから」→「Access」を選択。
③選択DB内のテーブルが表示されますので、必要なテーブルを選択します。
4.VBAでのリンク元DBの切替
4.1 リンク元DBのテーブルを検索する
「ConnectDB」(リンク元DB名)にはテスト用に固定値を入れています。
リンク元DBのテーブルコレクションからテーブル名を、ワーク「LNKName」に保存します。
'作業ワーク
Dim wdb As dao.Database, ixtable As dao.TableDef
Dim tdf As dao.TableDef
Dim CurrentPath As String
Dim Connectdb As String 'リンク元DB名
Dim LNKName(50) As String 'リンク元DBのテーブル名保存
Dim TBLName(50) As String 'ソースDBのテーブル名保存
Dim kx As Integer, ix As Integer, jx As Integer
'
'リンク元DBのテーブルを開く
Connectdb = "D:\DBの分割\TestData.accdb" ’テスト用の固定値
kx = 0
Set wdb = DBEngine.Workspaces(0).OpenDatabase(Connectdb)
With wdb
For Each ixtable In .TableDefs
If Left$(ixtable.Name, 4) <> "MSys" Then ’System Tableは除外
kx = kx + 1
LNKName(kx) = ixtable.Name 'リンク元DBのテーブル名保存
End If
Next ixtable
End With
Set ixtable = Nothing
Set wdb = Nothing
4.2 現在のソースDBからテーブルを削除
ソースDBのテーブルコレクションからテーブル名をワーク「TBLName」に保存します。
保存後、テーブルコレクションからテーブルを削除します。
'ソースDBからテーブル名を取得
ix = 0
With CurrentDb '現在のDB
For Each ixtable In .TableDefs
If Left$(ixtable.Name, 4) <> "MSys" Then
ix = ix + 1
TBLName(ix) = ixtable.Name 'ソースDBのテーブル名保存
End If
Next ixtable
'MSys(システム)以外のすべてのテーブルをテーブルコレクションから削除
For jx = 1 To ix
.TableDefs.Delete TBLName(jx)
Next jx
Set ixtable = Nothing
4.3 リンク元の切替
保存したリンクテーブル「LNKName」からソースDBのテーブルコレクションにテーブルを新規追加します。
Accessのナビゲーションウィンドウを再表示します。
'リンク元データとリンクの切替
For jx = 1 To kx
Set tdf = .CreateTableDef(LNKName(jx)) 'TableDefオブジェクトを作成
tdf.Connect = ";DATABASE=" + Connectdb 'リンク元DB名を登録
tdf.SourceTableName = LNKName(jx) 'ソーステーブル名を登録
.TableDefs.Append tdf 'コレクションに追加
Set tdf = Nothing
Next jx
.TableDefs.Refresh
End With
' ナビゲーションウィンドウを再表示
DoCmd.SelectObject acTable, , True
DBの分割機能は、経理システムにおいては特に有効だと思います。
年次締めの作業で現状(当年度)のデータを保存DBとして切り離して残し、新年度のDBでは繰越額のみを引き継ぐようにするのです。過去の伝票データは保存DBに切り替えることによって参照できるようにすると完璧です。
Accessの分割機能はコーディングに少し面倒なところもありますが、システムの肥大化を防ぐ有効な手立てになるかと思います。
