Excel VBA で OpenRecordset のカーソルタイプを使い分ける方法

Access テーブルを Excel VBA から操作する際、OpenRecordset の第 2 引数に カーソルタイプ(RecordsetTypeEnum) を指定すると、読み取り専用や前方スクロールのみなど、用途に適した動作を選択できます。本記事では頻用される 5 種類の定数と、dbOpenSnapshotdbOpenForwardOnly を用いたサンプルコードをご紹介いたします。

目次

主なカーソルタイプと数値

定数名数値説明
dbOpenTable1テーブルを直接開く。既存テーブル専用(インデックス検索が速い)。
dbOpenDynaset2追加・更新・削除が可能。最も汎用的。
dbOpenSnapshot4読み取り専用の静的スナップショット。大量データの一覧表示に適する。
dbOpenForwardOnly8前方スクロールのみ。処理速度を優先した一方向読み取り。
dbOpenDynamic16変更が即時反映される動的セット。テーブルに対する変更を即座に確認したい場合に使用。

ポイント
定数をそのまま書く方法と、数値で指定する方法があります。参照設定を行わずに動的に DAO を呼び出す場合、コードを短くしたいときは数値指定が便利です。

サンプルコード:Snapshot と ForwardOnly の比較

Sub OpenRecordsetWithCursorTypes()
    
    Dim daoEngine  As Object          ' DAO エンジン
    Dim connDB     As Object          ' Access データベース接続
    Dim rsSnap     As Object          ' Snapshot 用レコードセット
    Dim rsFwd      As Object          ' ForwardOnly 用レコードセット
    Dim dbFile     As String          ' Access ファイルのパス
    
    ' Access ファイルのフルパス
    dbFile = ThisWorkbook.Path & "\inventory_data.accdb"
    
    ' DAO エンジンの生成とデータベース接続
    Set daoEngine = CreateObject("DAO.DBEngine.120")
    Set connDB    = daoEngine.OpenDatabase(dbFile)
    
    ' ◆ 読み取り専用(Snapshot:数値 4)
    Set rsSnap = connDB.OpenRecordset("tbl_items", 4)
    
    ' 見出し行をシート I1:K1 へ出力
    Range("I1:K1").Value = Array("ItemID", "ItemName", "UnitPrice")
    
    ' Snapshot 先頭レコードをシート I2:K2 に書き込み
    If Not rsSnap.EOF Then
        Range("I2:K2").Value = Array(rsSnap!ItemID, rsSnap!ItemName, rsSnap!UnitPrice)
    End If
    rsSnap.Close
    
    ' ◆ 高速読み取り(ForwardOnly:数値 8)
    Set rsFwd = connDB.OpenRecordset("tbl_items", 8)
    
    ' ForwardOnly 3 行目のレコードを取得(0 基準 Move 2)
    rsFwd.Move 2
    If Not rsFwd.EOF Then
        Range("I3:K3").Value = Array(rsFwd!ItemID, rsFwd!ItemName, rsFwd!UnitPrice)
    End If
    rsFwd.Close
    
    ' 後処理
    connDB.Close
    
End Sub

コード解説

行番号内容補足
dbOpenSnapshot (4)読み取り専用で静的にデータ取得。一覧表示や集計レポートに最適です。
dbOpenForwardOnly (8)一方向スクロールのみで高速。先頭から順に読み取るバッチ処理に向きます。
Move 20 番目基準で 2 行進める3 番目のレコードを示します。

使い分けの目安

シナリオ推奨カーソルタイプ
レポート用に読み取り専用で取得したいdbOpenSnapshot
更新を伴う一般的な CRUD 操作dbOpenDynaset
データを高速に一方向だけ確認dbOpenForwardOnly
インデックス検索を高頻度で行うdbOpenTable
他ユーザーの変更を即時反映したいdbOpenDynamic

まとめ

OpenRecordset のカーソルタイプを適切に選択すると、読み取り速度や同時更新の制御を最適化できます。特に SnapshotForwardOnly は、大量データを扱う際に処理時間短縮に役立ちます。用途に応じて使い分け、Excel と Access の連携効率を高めてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次