2016
9
07

VBAで参照設定をしないでADOを使ってAccessDBへ接続する

VBAでADOを使ってデータベースへ接続するとき、参照設定で「Microsoft ActiveX Data Objects *.* Library」にチェックをつける方法と、つけなくても動く方法の両方の使い方をまとめました。


参照設定のメリット・デメリット

ExcelからAccessDBを操作したり、AccessVBAで直接SQLを書いて操作したいというときにお世話になるADOですが、これを使うにはVBEにて

160907-1

「ツール」→「参照設定」の、

160907-2

「Microsoft ActiveX Data Objects *.* Library」にチェックを入れてから、というのが一般的です。

こちらのほうが定義が明確で不具合検出しやすい・入力支援機能が使えるなど開発時の効率が良いので、問題がなければこちらを採用したいところなのですが、違うPCから実行したとき、ADOのバージョンの違いなどでエラーが起きる場合があります。

利用するPCが少数で特定できる場合は、それぞれのPCで参照設定を再設定すれば良いのですが、ファイルを配布したりネットワークを介したりで、環境の違う多数のPCから利用する可能性がある場合、いちいち「エラー出た!」と呼ばれて(´A`)となる…。

そんな場合は、参照設定にチェックを入れないでADOを利用することが可能です。

参照設定でオブジェクトを指定せず実行時に生成するという方法で、若干遅くなると言われていますが、ここ数年業務で使用してみたところ中小規模程度のデータベースなら特に問題なく使えています。

参照設定にチェックを入れる場合

まずは「Microsoft ActiveX Data Objects *.* Library」にチェックした場合のコード。

2,3行目でコネクションとレコードセットの型を明確に宣言して、それぞれ必要なところでインスタンスを作成しています。このコードで参照設定に不備があると、宣言の部分でエラーになります。

外部のaccdbファイルを指定したい場合は上記のままで、AccessVBAで現在開いているDBを使う場合は10~12行をコメントアウトして、7行目のコメントアウトを外してください。

また、SQLで読込以外の処理(INSERTやUPDATEなど)をしたい場合は21~27行をコメントアウトして、17行目のコメントアウトを外してください。

トランザクションはこちらを参考にどうぞ。

参照設定にチェックを入れない場合

こちらは、参照設定で「Microsoft ActiveX Data Objects *.* Library」にチェックを入れなくても動くコード。

2,3行目で明確な型宣言は行わず、必要なところでそれぞれオブジェクトを作成するため、参照設定を省略できる形です。ハイライト以外は上記のコードと一緒なので、解説も上をご参照ください。

多様な環境のPCから使う場面も結構あるので、こちらで組んだらとても楽でした。

Office2003, 2013, 2016, WinXP, 7, 10で使用経験がありますが、わたしの観測範囲では特に問題に遭遇したことはありません。(mdbファイルに接続する場合はProviderが Microsoft.Jet.OLEDB.4.0 になります。)

ただ、開発時は参照設定有りのほうが何かと便利なので、参照設定有りで組んで、リリース時に参照設定無しに切り替えるのがおすすめかもです!

カーソルタイプとロックタイプの指定

上記サンプルコード22行目にあたる、レコードセットを作成してレコードを抽出する際、カーソルタイプとロックタイプというものが省略されています。

こちらのサイトで詳しく解説されていますが、定数0~3まで存在し、どちらも省略すると 0 が適用されます。目的によって定数を指定してください。

例えばCursorTypeを「adOpenKeyset」に指定してレコードセットを作成したい場合、

「adOpenKeyset」が「1」であるということは、ライブラリが提供している情報なので、参照設定をしていないと「adOpenKeyset」という定数は使えません。その場合は直接数値を指定すると動きます。

「adOpenKeyset」でレコードセットを作成すると、このように書いてレコードの数が取得できたりします。レコード数で配列を定義したいときなどに使えます。

参考

ありがとうございました!

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 625
  • RSSを登録

公開日:2016/09/07
更新日:2017/01/06


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top