hiroton
2024/05/16 (木) 11:04:36
17372@f966d
変数宣言が必要なのは同一のオブジェクトを操作する必要があるとき、ですかね
間違った実装
OpenDatabase("C:\daosample\sample.accdb").Execute strSQL 'データベースを開いて(仮想A)クエリを実行
OpenDatabase("C:\daosample\sample.accdb").Close 'データベースを開いて(仮想B)、そのデータベース(仮想B)を閉じる
'//操作不能な仮想Aデータベースが開かれたままで不具合の原因になる
hatenaさんも解説されていますが、With
ステートメントを使うとこんな時でも変数宣言をしなくてもよくなります
With OpenDatabase("C:\daosample\sample.accdb")
.Execute strSQL
.Close
End With
複雑になってくると、どのオブジェクトをWithステートメントで省略したらいいか悩みどころで、省略しないほうが見やすいコードという場合もあります
Dim rsA As Recordset, rsB As Recordset, rsMe As Recordset
Set rsMe = Me.Recordset.Clone
Set rsA = CurrentDb.OpenRecordset("T_A")
Set rsB = CurrentDb.OpenRecordset("T_B")
Do Until rsMe.EOF
If Me!テキストボックス = "なんかやる" Then
Do Until rsA.EOF
Do Until rsB.EOF
If rsA.f1 = rsB.f1 Then
'//なにかする
Exit Do
End If
rsB.MoveNext
Loop
'//なにかする
rsA.MoveNext
Loop
End If
rsMe.MoveNext
Loop
rsA.Close
rsB.Close
rsMe.Close
コードが長くなってくると、//なにかする
のところでWith
で省略した記述がrsMe
なのか、rsA
なのか・・・と本人でも混乱するようになってくるので見やすさ重視で変数を使うなんてこともよくあります
Application.CurrentDb メソッド (Access)
Access の CurrentDB はキャッシュしよう(IT raises ITさん)
CurrentDb
についても、本来は
Dim db As Database
Set db = CurrentDb
db.Execute sql1
db.Execute sql2
db.Execute sql3
としたり、またはWith
ステートメントで参照して使用したほうが正しい使い方ができます。上記のような、クエリを複数回実行するのような場合を考えると、実は「CurrentDb.Execute
」を繰り返すとは少し違う動作をします
まぁ、よほどのことがない限り、ただクエリを実行するだけであればCurrentDb.Execute
の1行だけで済ませられるメリットを優先で問題ないので、それで回答している感じですね
通報 ...