人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ExcelVBAからSQLite3へActiveX2.8を使って接続しようとしているのですが、
WinXP32bitだと接続できるのにwin7 64bitだとcn.openのときにエラーになります。
「オブジェクトが閉じている場合は、操作は許可できません。3704」

sqlite odbcドライバの64bit版はインストールし、コマンドプロンプトからは接続できます。
原因を教えていただきたくお願いいたします。

→on errorをなくすと、cn.openで「odbc driver manager データ ソース名および指定された既定のドライバが見つかりません。」となってしまいます。


On Error GoTo Err_ADO

Dim i As Long
Dim strSQL As String
Dim cn As ADODB.Connection: Set cn = New ADODB.Connection
Dim rs(5000) As ADODB.Recordset

cn.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=" & DB_PATH
cn.Open
For i = 1 To 48000
strSQL = "select * from aaa where gaku is null limit 1000"
Set rs(i) = New ADODB.Recordset
rs(i).Open strSQL, cn, adOpenKeyset, adLockOptimistic, adCmdText

Do Until rs(i).EOF
rs(i)!GAKU = calc(rs(i)!sotu, rs(i)!uke)
rs(i).Update
rs(i).MoveNext
Loop
rs(i).Close: Set rs(i) = Nothing
Next
Err_ADO:
If Not cn Is Nothing Then cn.Close: Set cn = Nothing

●質問者: FujiiRock
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● cx20
●300ポイント ベストアンサー

残念ながら、32bit 版の Excel VBA から 64bit 版の ODBC ドライバを使用することはできません。
32bit 版の Excel VBA が呼び出せるのは、32bit 版の ODBC ドライバだけとなっています。

<Excel(32bit) + ADO の DB 接続イメージ>
 [Excel](32bit)
 |
 [ADO](32bit)
 |
[Microsoft OLE DB Provider for ODBC](32bit)
 |
 [SQLite3 ODBC Driver](32bit)
 |
 [SQLite3](32bit)

単に動作させることが目的であれば、64bit OS であっても、32bit 版の ODBC ドライバをインストールしてください。

■ SQLite ODBC Driver
http://www.ch-werner.de/sqliteodbc/

■ sqliteodbc.exe
http://www.ch-werner.de/sqliteodbc/sqliteodbc.exe
→ 「C:\Program Files (x86)\SQLite ODBC Driver」(32bit 版の ODBC ドライバがインストールされます。)

どうしても、64bit 版の ODBC ドライバを使用したいということでしたら、64bit 版の WSH(CScript / WScript)を使用することで、利用することは可能です。

<WSH(64bit) + ADO の DB 接続イメージ>
 [WSH](64bit)
 |
 [ADO](64bit)
 |
[Microsoft OLE DB Provider for ODBC](64bit)
 |
 [SQLite3 ODBC Driver](64bit)
 |
 [SQLite3](64bit)

FujiiRockさんのコメント
なんとお礼を言ったらよいのか、見当たらないくらい感謝です! 一生の師匠と呼ばせてください?><

FujiiRockさんのコメント
解決しました。

cx20さんのコメント
エラーが解決されたようで何よりです。 少しソースコードで気になった箇所があるのですが、「Dim rs(5000) 」としている箇所は、同時に複数のレコードセットを用いるのでなければ、単一のレコードセット「Dim rs」とした方がメモリを節約できそうです。 あとは、Calc() 関数の計算処理ですが、SQL の UDPATE 文に書き換えることができれば、もう少し高速化できそうな気がします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ