実行時エラー'-2147467259(80004005)'
エラーを特定できません。
・・・というエラーがでてしまいます。
ご教示願えませんでしょうか。
Private Sub worksheet_change(ByVal target As Range)
Dim cn As Connection
Dim rs As Recordset
Dim sql As String
Set cn = New Connection
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=C:\Users\Database2.accdb"
cn.Open
sql = "select 氏名 from 社員台帳 where 社員_番号 =" & Range("B3").Value
Set rs = New Recordset
rs.Open sql, cn
Range("D3").CopyFromRecordset rs
cn.Close: Set cn = Nothing
rs.Close: Set rs = Nothing
End Sub
SQLが 間違っている恐れがあります。
アクセス上でSQLを実行して エラーになりませんか?
あと
sql = "select 氏名 from 社員台帳 where 社員_番号 =" & Range("B3").Value
で Range("B3").Valueじゃなく 直接 値をセットしたりしたらどうでしょうか?
sql = "select 氏名 from 社員台帳 where 社員_番号 = 1"
みたいに。
ちなみに 社員_番号って 数値型ですよね?
80004005は接続できませんでしたというエラー。
SQLが間違っている場合に出るエラーじゃないので恐れとかはまったく関係ない話。
ExcelVBAでAccdb利用したいならばまずは参照設定の確認。
必要なのは「Microsoft ActiveX Data Objects ほげほげ Library」
ほげほげはインストールされているOfficeのバージョンによって変わる。
accdbの接続にパスワードが必要なら追加も必要。
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=C:\Users\Database2.accdb;Jet OLEDB:Database Password=パスワード"
実用ではなく実験段階だと思いますがworksheet_changeイベントが起こる度にデータベースと接続しているような重い処理はやめたほうが良いです。
worksheet_changeで「更新ボタン」を表示するなどして「更新ボタン」がクリックされた時にだけデータベースを参照して関係しているセルに情報を書き出すとかしたほうが処理が軽くなりますし、データベースからデータを取ってくるだけのマクロを別につくるわけですからテストもやりやすく(worksheet_changeイベントを発生させる必要が無く直接マクロを起動すればテストできる)なります。
丁寧にしたいならworksheet_changeで未更新のセルの色を変えてやるくらいはしても良いでしょう。
ん、そだね。SQLを実行する前のエラーだから SQLは 関係なかった・・・。
VBAやOLEDBは非同期で実行されるのでクローズなどが正常終了する前に次の実行がなされているのかもしれません。
ひとまずworksheet_changeイベントでの接続はやめて、単独で動くようにしてみるなどで確認してみると良いでしょう。
cn.Openって 不要ですか?
2013/01/29 09:08:37コメントにして 実行してみてください。