情シスというほどのものではありませんが…

プログラムも含めPC廻りのことはすべて独学なんですが、必要に迫られていろいろやってます。躓きまくりのPC周辺の出来事を記録してみます。

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なんで。