社内SEの話

日々起きたことの記録用

【Access】 は既に使用されているので、使用できませんでした。【ADO】

Access VBAのRecordSetでエラーが発生した場合の対策例を紹介

エラー発生

実行時エラー ‘-2147467259 (80004005)’

“は既に使用されているので、使用できませんでした。

Dim rs As New ADODB.Recordset
Dim cn As String
cn = CurrentProject.Connection
rs.Open "テーブル名", cn, adOpenForwardOnly, adLockReadOnly

↑でエラーが発生。

対策方法

困った方がこのページに辿り着いたので簡潔に解決方法を記載します

Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection
Set cn = CurrentProject.Connection
rs.Open "テーブル名", cn, adOpenForwardOnly, adLockReadOnly

これで解決しました。

この記述を参考にしました

docs.microsoft.com ただし決してConnectionをString型でRecordsetしてはダメではありません。正しい記述だと思います。

事実MS Docsでも同様な記述されています。

docs.microsoft.com では何がだめだったかということになりますが、あくまで想像の域は出ませんがWindowsの更新などで、CurrentProject.Connectionの戻り値が変わった可能性があります。

今回はCurrentProject.Connectionを活かす形で修正したかったので、ADODB.Connectionのオブジェクトを使用しました。

String型を使い続けたい場合は、こんな記述に変更することでも対応ができると思います。

docs.microsoft.com

CurrentProject.Connectionについて

docs.microsoft.com

以下考察

いずれにしろ、最近のADOは挙動が安定しません。

少し前は動いたのに急に動かなくなったが、発生します。

都度対応するのも可能ですが、VBAで高度にDBなどを制御して運用するのはトラブルのもとになると感じています。

自社のAccessは様々な用途で使われていますが、徐々に廃止の動きをさせています。

最近ではAccessの代替サービスもありますし、それ以外にもきちんと要件定義したシステム化が一番だと思います。

代替手段については別途記事を書けたらなと思います。