Access テーブルを Excel VBA から操作する際、OpenRecordset
の第 2 引数に カーソルタイプ(RecordsetTypeEnum) を指定すると、読み取り専用や前方スクロールのみなど、用途に適した動作を選択できます。本記事では頻用される 5 種類の定数と、dbOpenSnapshot
と dbOpenForwardOnly
を用いたサンプルコードをご紹介いたします。
目次
主なカーソルタイプと数値
定数名 | 数値 | 説明 |
---|---|---|
dbOpenTable | 1 | テーブルを直接開く。既存テーブル専用(インデックス検索が速い)。 |
dbOpenDynaset | 2 | 追加・更新・削除が可能。最も汎用的。 |
dbOpenSnapshot | 4 | 読み取り専用の静的スナップショット。大量データの一覧表示に適する。 |
dbOpenForwardOnly | 8 | 前方スクロールのみ。処理速度を優先した一方向読み取り。 |
dbOpenDynamic | 16 | 変更が即時反映される動的セット。テーブルに対する変更を即座に確認したい場合に使用。 |
ポイント
定数をそのまま書く方法と、数値で指定する方法があります。参照設定を行わずに動的に 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 2 | 0 番目基準で 2 行進める | 3 番目のレコードを示します。 |
使い分けの目安
シナリオ | 推奨カーソルタイプ |
---|---|
レポート用に読み取り専用で取得したい | dbOpenSnapshot |
更新を伴う一般的な CRUD 操作 | dbOpenDynaset |
データを高速に一方向だけ確認 | dbOpenForwardOnly |
インデックス検索を高頻度で行う | dbOpenTable |
他ユーザーの変更を即時反映したい | dbOpenDynamic |
まとめ
OpenRecordset
のカーソルタイプを適切に選択すると、読み取り速度や同時更新の制御を最適化できます。特に Snapshot と ForwardOnly は、大量データを扱う際に処理時間短縮に役立ちます。用途に応じて使い分け、Excel と Access の連携効率を高めてみてください。