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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/06 00:35:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント300pt

残念ながら、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)
他1件のコメントを見る
id:yayayai

解決しました。

2013/09/06 00:35:33
id:cx20

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

2013/09/06 01:04:33

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません