【入門編】DAO.Indexオブジェクトでインデックスを動的に作成・削除する – Access VBA解析バイブル

スポンサーリンク

Access高速化の極意:DAOでインデックスを操り、検索時間を「劇的」に短縮せよ

こんにちは。現場で「なぜかAccessが重い」という悲鳴を何度聞いたかわかりません。

Accessのパフォーマンス問題の多くは、データ量が増えたとき、検索エンジンが「どこに何があるか」を把握できていないことに起因します。そこで登場するのがDAO(Data Access Objects)によるインデックスの動的生成です。

今日は、マクロの記録を卒業したあなたが、一歩先へ進むための「データベースチューニングの基本」を伝授します。

1. なぜ「インデックス」が必要なのか?

想像してみてください。あなたは巨大な図書館の司書です。

  • インデックスなし: 本を一冊ずつ全部確認して、目的の本を探す(全表走査)。
  • インデックスあり: 蔵書目録(索引)を見て、棚の場所を特定する(インデックス検索)。

Accessも同じです。特に「一時テーブル」を作成して複雑な集計を行う際、インデックスがないと、データが数万件を超えた瞬間に処理が止まったような遅さになります。

2. 実践:DAOでインデックスを動的に作成する

では、実際にコードを書いてみましょう。DAOを使うための準備として、VBE(コード画面)の「ツール」→「参照設定」で “Microsoft Office 16.0 Access database engine Object Library” にチェックが入っていることを確認してください。

インデックスを追加するVBAコード

Public Sub CreateIndexOnTempTable()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim idx As DAO.Index
Dim fld As DAO.Field

Set db = CurrentDb
‘ 対象の一時テーブルを指定
Set tdf = db.TableDefs(“tmp_売上データ”)

‘ 新しいインデックスを作成
Set idx = tdf.CreateIndex(“idx_顧客ID”)

‘ インデックスを貼るフィールドを指定
Set fld = idx.CreateField(“顧客ID”)
idx.Fields.Append fld

‘ インデックスを追加
tdf.Indexes.Append idx

Debug.Print “インデックス生成完了。”

‘ 後片付け(オブジェクトの解放)
Set fld = Nothing
Set idx = Nothing
Set tdf = Nothing
Set db = Nothing
End Sub

コードの解説

1. `CurrentDb`: 現在開いているデータベースを操作するための入り口です。
2. `TableDefs`: データベース内のテーブル構造を司るオブジェクト群です。
3. `CreateIndex`: ここでインデックスという「目次」を定義します。
4. `Append`: これを忘れると、メモリ上で定義しただけで終わってしまいます。「最後に確定保存する」という儀式だと思ってください。

3. 失敗しないための「極限の知見」

初心者の方が陥りやすい罠が2つあります。ここをクリアすれば、もう中級者の仲間入りです。

罠①:インデックスの「削除」を忘れる

インデックスは検索を速くしますが、データを「書き込む(INSERT/UPDATE)」ときは、インデックスの書き換えが発生するため、逆に遅くなります。一時テーブルを使い終わったら、必ずインデックスを削除するか、テーブルごと削除してください。

‘ インデックスを削除するコード
Public Sub DeleteIndex()
Dim db As DAO.Database
Set db = CurrentDb
‘ インデックス名が存在するか確認してから削除するのが安全
db.TableDefs(“tmp_売上データ”).Indexes.Delete “idx_顧客ID”
End Sub

罠②:オブジェクトを解放しない

VBAで `Set db = Nothing` などを書くのは面倒に見えるかもしれませんが、これは「メモリのゴミ掃除」です。これを怠ると、Accessが徐々に重くなり、最悪の場合、データベース自体が破損します。職人は後片付けまでが仕事です。

4. 現場で使える「判断基準」

  • いつインデックスを貼るべき?
  • WHERE句やJOIN句(テーブル結合)で頻繁に使用するフィールド。
  • データ件数が10,000件を超える場合。
  • 貼ってはいけない場所は?
  • 「はい/いいえ」型のように、値の種類が少ないフィールド(効果が薄い)。
  • 頻繁に更新が発生するテーブルのフィールド。

最後に:エンジニアとしての第一歩

「コードが動けば良い」という段階から、「なぜ速いのか?」「なぜこの処理が必要なのか?」を考え始めたとき、あなたの書くコードは一気に品質を高めます。

DAOを使いこなすということは、Accessの心臓部を直接チューニングするということです。ぜひ、今日作成したコードを、今抱えている重たい処理に組み込んでみてください。きっと、その「爆速」に驚くはずです。

何か分からないことがあれば、またいつでも聞きに来てくださいね。応援しています!

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