処理速度アップに向けたAccessテーブルのコピー方法

VBA

Accessで複数のデータベースをリンクすることがあります。別のデータベースのテーブルを参照してデータを処理する場合、処理速度がネットワークの通信速度に依存する場合があります。

特に、クエリやSQLで処理をする場合、都度リンク先データベースのテーブルの情報を読みに行くことになり、処理速度が著しく遅くなることがあります。

こういったことを回避する方法として、ローカルデータベース側にリンク先データベースのテーブルの情報を一時的にコピーし、処理後に不要となったテーブルを削除する方法が挙げられます。

今回はテーブルをコピーし、必要なデータ処理をした後、コピーしたテーブルを削除するという一連の処理のうち、特にポイントとなるテーブルコピーとテーブル削除をVBAで実装する方法を紹介します。

スポンサーリンク

テーブルコピーの方法

AccessテーブルのコピーをするためのVBAコードは「DoCmd.CopyObject」メソッドで実装します。

「DoCmd.CopyObject」は次のように定義されます。

CopyObject (DestinationDatabaseNewName, SourceObjectType, SourceObjectName)

ここで、各引数は表1に示すとおりです。

表1 「DoCmd.CopyObject」メソッドの引数

名前省略可否データ型説明
DestinationDatabaseオプションバリアント型オブジェクトをコピーするデータベースの有効なパスとファイル名である文字列式。 現在のデータベースを選択するには、この引数を空白のままにする。
NewName省略可バリアント型コピーするオブジェクトの新しい名前である文字列式。 他のデータベースへコピーするときに同じ名前にする場合は、この引数を指定しない。
SourceObjectType省略可AcObjectType 列挙コピーするオブジェクトの種類を表す AcObjectType 定数。
SourceObjectName省略可バリアント型SourceObjectType 引数によって選択された型のオブジェクトの有効な名前である文字列式。 ライブラリ データベースで CopyObject メソッドを含む Visual Basic コードを実行した場合、Access はライブラリ データベースで最初にこの名前のオブジェクトを検索し、次に現在のデータベースで検索する。

また、AcObjectType列挙は表2にまとめるとおりとなります。

表2 AcObjectType列挙の一覧

名前説明
acDatabaseProperties11Database プロパティ
acDefault-1 
acDiagram8データベース ダイアグラム (Access プロジェクト)
acForm2フォーム
acFunction10関数
acMacro4マクロ
acModule5モジュール
acQuery1クエリ
acReport3レポート
acServerView7サーバー ビュー
acStoredProcedure9ストアド プロシージャ (Access プロジェクト)
acTable0テーブル
acTableDataMacro12データ マクロ

今回の例では、「SourceObjectType」引数に「acTable」を設定することになります。

サンプルテーブルとして「T_サンプル」を用意し、テーブルコピーの処理をVBAで実装します。

サンプルの実装 その1 テーブルコピー

早速以下に載せるコードを、標準モジュールにコピーしましょう。

Public Sub TableCopy()

'テーブルコピーをするか確認
If MsgBox("「T_サンプル」テーブルをコピーしますか?", vbYesNo) = vbNo Then

    MsgBox "処理を中止します。"
    Exit Sub

End If

'テーブルコピーの実行
DoCmd.CopyObject , "T_サンプル新", acTable, "T_サンプル"

'テーブルコピー完了のお知らせ
MsgBox "テーブルコピーを完了しました。"

End Sub

ここで示すコードは「T_サンプル」テーブルを「T_サンプル新」テーブルとしてコピーする内容です。

先ほど紹介したようにDoCmd.CopyObjectメソッドを用いてテーブルのコピーを行いました。

続いて、コピーしたテーブルを用いて、何かしらの処理を行い、不要となった「T_サンプル新」テーブルを削除するコードを実装していきます。

サンプルの実装 その2 テーブルの削除

テーブルの削除は「DoCmd.DeleteObject」メソッドで行います。

「DoCmd.DeleteObject」は次のように定義されます。

DeleteObject (ObjectType, ObjectName)

ここで、各引数は表3に示すとおりです。

表3 「DoCmd.DeleteObject」メソッドの引数

名前省略可否データ型説明
ObjectType省略可AcObjectType 削除するオブジェクトの種類を表す AcObjectType 定数(表2のとおり)。
ObjectName省略可バリアント型引数 ObjectType で指定した種類のオブジェクトの有効な名前の文字列式。 ライブラリ データベースで DeleteObject メソッドを含む Visual Basic コードを実行する場合、Microsoft Access は、ライブラリ データベースで最初にこの名前のオブジェクトを検索し、次に現在のデータベースで検索する。

以上を踏まえて処理を追加していきます。

先ほど紹介したコードに一部追記をします。

Public Sub TableCopy()

'テーブルコピーをするか確認
If MsgBox("「T_サンプル」テーブルをコピーしますか?", vbYesNo) = vbNo Then

    MsgBox "処理を中止します。"
    Exit Sub

End If

'テーブルコピーの実行
DoCmd.CopyObject , "T_サンプル新", acTable, "T_サンプル"

'ご参考として「T_サンプル新」の存在確認をするためのコード
If DCount("*", "MSysObjects", "[Name] = 'T_サンプル新'") > 0 Then

    'こちらのコードが実行される。
    MsgBox "存在する。"
    
Else
    
    'こちらのコードは実行されない。
    MsgBox "存在しない。"
    
End If


'T_サンプル新を用いたデータ処理(今回は割愛)
'SQL等を活用した処理をする場合にテーブルコピーをすることで
'処理速度を向上させることが期待できる!


'データ処理を終えた後、T_サンプル新テーブルの削除
DoCmd.DeleteObject acTable, "T_サンプル新"

'テーブルコピー完了のお知らせ
MsgBox "処理を完了しました。"

End Sub

ここで紹介しているコードはテーブルをコピーして削除するという流れにしており、一見「T_サンプル新」テーブルがコピーされているか分からないため、DCountを用いて「T_サンプル新」が存在するコードを追加しています。(実際の処理をする上では必要のないコードです。)

この処理を実行すると、DCount処理によって「存在する。」というメッセージボックスが表示されますので、「T_サンプル新」テーブルがコピーされていることが分かると思います。慣れている方はデバッグ処理で一行一行処理を追っていただいても良いかと思います。

今回の例ではカレントデータベースのテーブルをコピーしただけですが、実際にはリンク先のテーブルを一時的にローカルサイドにコピーしてデータ処理をすることで処理速度を向上させることが期待できます。

まとめ

今回はテーブルコピーと削除をVBAで実装する方法を紹介しました。

上で紹介した例ではカレントデータベースのテーブルをコピーしただけですが、実際にはリンク先のテーブルを一時的にローカルサイドにコピーしてデータ処理をすることで処理速度を向上させることが期待できます。

このようにして、ユーザーの不満解消をすることも恒久的にデータベースを活用していく上では大切なこととなりますので、今回の記事をご参考に改善をしていただければと思います。

コメント

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