Access の CurrentDB はキャッシュしよう

よくAccessのVBA説明を見ると「CurrentDbは変数などにキャッシュしましょう」と書いてあります。なぜかというと、CurentDbはメソッドであり、毎回オブジェクトを生成しています。これはどんな影響があるのでしょうか。

以下で実験できます。

Private Sub Test()
    CurrentDb.Execute "select * into test1 from msysobjects"
    '0件と表示される
    Debug.Print CurrentDb.RecordsAffected

    With CurrentDb
        .Execute "select * into test2 from msysobjects"
        '件数が表示される
        Debug.Print .RecordsAffected
    End With
End Sub

上記test1のテーブル作成クエリではCurrentDbを使ってオブジェクトを生成するので、直前にあるアクションクエリの実行結果に関係無く0件と表示されます。

test2についてはWithで生成オブジェクトを保持しているので、正しい件数が表示されます。もちろんWithではなくオブジェクト変数に代入することでも実現可能です。

CurrentDbの表記を「CurrentDb()」と書けばわかりやすいと思います。

ちなみに、MSysObjectsはAccess内で使われる隠しテーブルで、たとえばAccess内にあるテーブルの一覧を取得する場合などに便利です。