今回、初めてADOを使ってみたが、ADOの解説文をネットで読みかじって書いたこともあって、能率が悪かった。
以下、Copilotで確認しながら修正した項目。

1.DLookup、DSum、DMax、DCountはDAOのリンクテーブルを使っている可能性があるので、それ用の読み替え関数を作成した。
adoDLookup、adoDSum、adoDMax、adoDCount

2.大体こんな感じで書く
標準モジュール
Public con As New ADODB.Connection

メニューフォームでconnect  (メニューフォームは最初に開いて、以降、アプリケショーンを閉じるまで開いたまま。最後に閉じる。)
con.ConnectionString = pstrAdoCon
con.Open

フォームデバッグ中にconが閉じてしまうので、conを使う前に一応、開いているか確認して閉じていれば開く
If con.State = adStateClosed Then con.ConnectionString = pstrAdoCon: con.Open

終了処理。閉じたままでcon.Closeしてもエラーにならないのだが、一応、状態を確認してCloseする
If con.State = adStateOpen Then con.Close: Set con = Nothing

conがNew されているかどうかは
if con is nothing then msgbox "Newされてない"

recordsetはプロシージャー単位で作成する。
Dim rst As New ADODB.Recordset
Dim strSQL As String

戻り値が不要な場合
con.Execute strSQL

戻り値が必要な場合
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
「ret rst = con.Execute(strSQL) 」は動作が不安定とのこと

終了処理。rst.CloseはNewさえしてれば、何回Closeしてもエラーにならないが、Newしてない時は下記でもエラーになる。
If rst.State = adStateOpen Then rst.Close: Set rst = Nothing

recordsetがNewされているかどうかは、下記で確認
if rst is nothing then msgbox "Newされてない"

conにしてもrecordsetにしても、デバッグ中、状態がはっきりしないので、確認してからopenするなり、closeした方がよさそう。

3.conは一度開いたらアプリケーション終了時まで閉じない。閉じたり開いたりすると時間がかかる。
モジュール単位で開け閉めするように説明してあったが、アプリケーション単位にした。
作成したadoDLookup、adoDSum、adoDMax、adoDCountでもconを使っているので、いちいち閉じていたら時間がかかってしょうがない。
conはPublicで宣言して使い回しても問題ない。

4.recordset名はプロシージャーが別なら、同一のconで開いても区別される。

5.テーブルにデータを追加する場合
テーブルが小さい場合は
con.Execute strSQL

テーブルが大きい場合
strSQL = "select * from TableMei where 1=0"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic
rst.AddNew
rst.Update
「where 1=0」がないとOpenした時、全件取得してしまう。これがあると、1件も取得されないので、recordsetだけ用意される。
(この説明がないので、どうして時間がかかってしまうのかわからなかった)

「where 1=0」を追加して、recordsetを開くように修正して、やっとDAOより速くなった。
DAO 10秒、ADO 7秒。
これでも遅いので、やはりRemotoDeskTopにするしかなさそう。

 

6.データを更新する場合

やはり、テーブルが小さい場合は
con.Execute strSQL

 

こっちの方がいいらしい(2025/10/12)

Dim cmd As new ADODB.Command
cmd.ActiveConnection = con
cmd.CommandType = asCmdText
cmd.CommnadText = strSQL
cmd.Execute
Set cmd = Nothing
 

項目が多かったり、複数行修正する場合はrecordsetを使って

strSQL = "select * from TableMei where Unnunn"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic

do until rst.eof
rst.Update

rst.movenext

loop

 

DAOの場合に必要なrst.Editは不要

 

7.選択レコードが無かった場合

strSQL = "select * from TableMei where Unnunn"
rst.Open strSQL, con, adOpenKeyset, adLockOptimistic

if rst.eof and rst.bof then msgbox "選択されたレコードがない!"

rst.close :  set rst = nothing

 

8.where句で日付を指定する時はPostgreSQLの標準の書き方

  'yyyy-mm-dd'

とすること。 

     "  '  " & format(date, "yyyy-mm-dd") & " ' "