Accessで複数のデータベースをリンクすることがあります。別のデータベースのテーブルを参照してデータを処理する場合、処理速度がネットワークの通信速度に依存する場合があります。
特に、クエリやSQLで処理をする場合、都度リンク先データベースのテーブルの情報を読みに行くことになり、処理速度が著しく遅くなることがあります。
こういったことを回避する方法として、ローカルデータベース側にリンク先データベースのテーブルの情報を一時的にコピーし、処理後に不要となったテーブルを削除する方法が挙げられます。
今回はテーブルをコピーし、必要なデータ処理をした後、コピーしたテーブルを削除するという一連の処理のうち、特にポイントとなるテーブルコピーとテーブル削除をVBAで実装する方法を紹介します。
テーブルコピーの方法
AccessテーブルのコピーをするためのVBAコードは「DoCmd.CopyObject」メソッドで実装します。
「DoCmd.CopyObject」は次のように定義されます。
CopyObject (DestinationDatabase, NewName, SourceObjectType, SourceObjectName)
ここで、各引数は表1に示すとおりです。
表1 「DoCmd.CopyObject」メソッドの引数
名前 | 省略可否 | データ型 | 説明 |
DestinationDatabase | オプション | バリアント型 | オブジェクトをコピーするデータベースの有効なパスとファイル名である文字列式。 現在のデータベースを選択するには、この引数を空白のままにする。 |
NewName | 省略可 | バリアント型 | コピーするオブジェクトの新しい名前である文字列式。 他のデータベースへコピーするときに同じ名前にする場合は、この引数を指定しない。 |
SourceObjectType | 省略可 | AcObjectType 列挙 | コピーするオブジェクトの種類を表す AcObjectType 定数。 |
SourceObjectName | 省略可 | バリアント型 | SourceObjectType 引数によって選択された型のオブジェクトの有効な名前である文字列式。 ライブラリ データベースで CopyObject メソッドを含む Visual Basic コードを実行した場合、Access はライブラリ データベースで最初にこの名前のオブジェクトを検索し、次に現在のデータベースで検索する。 |
また、AcObjectType列挙は表2にまとめるとおりとなります。
表2 AcObjectType列挙の一覧
名前 | 値 | 説明 |
acDatabaseProperties | 11 | Database プロパティ |
acDefault | -1 | |
acDiagram | 8 | データベース ダイアグラム (Access プロジェクト) |
acForm | 2 | フォーム |
acFunction | 10 | 関数 |
acMacro | 4 | マクロ |
acModule | 5 | モジュール |
acQuery | 1 | クエリ |
acReport | 3 | レポート |
acServerView | 7 | サーバー ビュー |
acStoredProcedure | 9 | ストアド プロシージャ (Access プロジェクト) |
acTable | 0 | テーブル |
acTableDataMacro | 12 | データ マクロ |
今回の例では、「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で実装する方法を紹介しました。
上で紹介した例ではカレントデータベースのテーブルをコピーしただけですが、実際にはリンク先のテーブルを一時的にローカルサイドにコピーしてデータ処理をすることで処理速度を向上させることが期待できます。
このようにして、ユーザーの不満解消をすることも恒久的にデータベースを活用していく上では大切なこととなりますので、今回の記事をご参考に改善をしていただければと思います。
今の時代、VBAに限らずプログラミングができるということは、当然のスキルとして広く社会で認知されています。いまだプログラミングが十分にできないという人は、今からでも遅くありません。できるだけ早く基本的なプログラミングスキルを習得することをお勧めします。
ご自身にあった専門書を参考に、実践的なプログラミング・データベース・サーバ、データ分析・機械学習など、システムエンジニアや今後を担うDX人材に必要とされているスキル獲得に向けて基礎から学んでいくことが大切です。
最初につまずきがちな点も、書籍を読みながら試行錯誤して課題解決していくことで、自身のスキルアップを目指すことができます。思い立ったが吉日、是非業務効率の改善に向けてプログラミング学習に勤しんでください!
スポンサーリンク
コメント