hatena
hatena
2024/05/16 (木) 10:08:05
まず、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
こんな感じで理解できたでしょうか。
通報 ...