Excelマクロを参照設定なしで動かす
「データベース上にある担当者リストをExcelで使いたい」という声があったので、「難しくないよ」と安請け合い。
VBAエディタの参照設定から「Microsoft ActiveX Data Objects 2.8 Library」にチェック入れて、ADODB.ConnectionとADODB.Recordsetを宣言して……と、ここまでは過去の経験通り。
RecordCount取得しようとしたらどんなに条件文変えても「-1」が返されて少し焦ったが……。
まぁ、これはレコードセットをNewした後にCursorLocationをADODB.adUseClientにしてやることで解消できましたが……。今までもこんなだったっけ? 記憶にないなぁ。
なんかMoveLast→MoveFirstした後でないと正しいRecordCountが取れないということはあったけど、それはDAOのときか?
テストも完了して、要望通りのものできた! とちゃちゃっとメールして他のことしてたら、
「早々にありがとうございます。でも動きません」と。
「コンパイルエラー云々」と出るそうだ。
すぐに参照設定の問題とは気づいたが、チェック入れた状態で渡したはず。
今まで何度となく同じようなことやってきたけど、何が違うのか?
ネット上では「Excelのバージョン違い云々」が原因とあるが、会社はOffice365を使っており、そこは私のPCと依頼者のPCに違いはない。しかも「Microsoft ActiveX Data Objects」ってバージョン6.1までがリストに出てくる状態なので、過去のバージョンであろう2.8なら今のExcelで動くのではないの? 古すぎて依頼者のPCには入ってない?
うーん。
とりあえず6.1にチェック入れて渡そうとしたが、「まだ動きませんよ」と突っ込まれるのも嫌なので、バージョン指定しなくても済む方法はないかと検索。
あるね。
ADODB.Connection、ADODB.Recordsetをそれぞれ明示せずにObjectとして宣言。いつもならNewするところで「CreateObject」するとよいらしい。
Dim dbCon As Object
Dim dbRs As Object
'サーバへの接続文字列
conStr = "Provider=SQLOLEDB;Data Source=" & strDBSever _
& ";Initial Catalog=" & strDBName _
& ";..........
Set dbCon = CreateObject("ADODB.Connection")
dbCon.Open conStr
Set dbRs = CreateObject("ADODB.Recordset")
これで接続できました。めでたしめでたし……。でもない!
RecordCount取得するための
dbRs.CursorLocation = ADODB.adUseClient
でエラーになる。VBAにしてみりゃ参照設定外してるので、いきなりADODB言われてもわからんわな。
上のCreateObject("ADODB.xxxxx”)に倣って
Dim adClient As Object
Set adClient = CreateObject("ADODB.adUseClient")
dbRs.CursorLocation = adClient
等とやってみるが、「オブジェクトを生成できません」と。まぁ、そうだろうとも。
ここでふと。
dbRs.RecordCountがダメなら、1個1個数えりゃいいやん!
原点に返るというと聞こえは良いが、VBAでデータベース弄り始めた頃のベタなやり方。
dbRs.movefirst
dbCount = 0
Do Until (dbRs.EOF)
dbCount = dbCount + 1
dbRs.movenext
Loop
まぁ、レコードが何万件もある訳でなし、使用上問題ないかと。
で、改めて依頼者PCで実行してもらったところ、無事動作しましたとの報告。
よかったよかった。
この方法なら参照設定触らなくてよいし、環境依存少なそうでよいね。
但し、自動メンバって言うの? あれ、使えません。
そりゃそうですよね。dbRsとか言ってもコード上はただのObjectなんで。