Microsoft Access 掲示板

SQLの実行方法 / 11

17 コメント
views
4 フォロー
11

まず、AccessのUIでのデータベース操作はDAOを使っています。
クエリ、フォーム、レポートなど、DoCmd系のデータベース操作など。
まずは、これを理解しておいてください。

そこで、
ネットでよくあるコードの一例

Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase("C:\daosample\sample.accdb") 'データベースを開く 
Set rs = db.OpenRecordset("テーブル名") 'テーブルをレコードセットしてと開く

これは現在開いてコードを記述しいるAccessファイル以外のAccessファイルを操作するコードになります。具体的には捜査対象は C:\daosample\sample.accdbファイルです。

現在開いてコードを記述しいるAccessファイル内のテーブルを操作する場合は、
Accessファイルを開いた時点で、DAOデータベースは自動で開かれています。よって、OpenDatabaseの記述は不要です。現在開かれているデータベースはCurrentDBで取得できます。

Dim db As Database
Dim rs As Recordset
Set db = CurrentDB 
Set rs = db.OpenRecordset("テーブル名") 'テーブルをレコードセットしてと開く

これは変数宣言を省略して下記のように記述してもOKです。

Dim rs As Recordset
Set rs = CurrentDB.OpenRecordset("テーブル名") 'テーブルをレコードセットしてと開く

次に、フォームのデータ操作する場合、フォームを開いた時点で、DAOレコードセットも自動で開かれます。フォームのUIでこのレコードセットを操作している仕組みになってます。
ですので、フォームのデータをVBAで操作する場合、OpenRecordsetでわざわざ開く必要はありません。
フォームのレコードセットにアクセスする方法は、Me.Recordset、Me.RecordsetClone、Me.Recordset.Clone があります。それらの違いについては、#4の回答のリンク先で解説しています。

Dim rs As Recordset
Set rs = Me.RecordsetClone 'フォームのレコードセットを取得

Withステートメントを使用すれば変数宣言も不要になります。

With Me.RecordsetClone
   'レコードセットに対するデータ操作
End With

これは、OpenRecordsetの場合も同様に省略することはできますが、
あまり見かけませんね。

With CurrentDB.OpenRecordset("テーブル名") 
   'レコードセットに対するデータ操作
   .Close
End With

こんな感じで理解できたでしょうか。

通報 ...