• ベストアンサー

ACCESS97で作成したmdbファイルに書き込む為の記述

 ADOを使用してExcelで作成したデータをACCESS97で作成したmdbファイルに書き込む処理を行いたいと思います。 書籍を見ながらコードを記述しているのですが、1,2,の項目については問題なく処理ができるのですが、最後のmdbファイルへの書き込み処理がどうしてもうまくいきません。 主に出力されるエラーは「現在のプロバイダはIndex機能に必要なインターフェイスをサポートしていません。」というものです。いろいろ試行錯誤したのですが解決できませんでした。 やはりACCESS97で作成したmdbファイルだからダメなのでしょうか? 原因と対処方法を教えていただければ幸いです。よろしくお願いします。以下はmdbファイルへの書き込みのサンプルコードです。 Dim myFile As String Dim myTbl As String Dim myRng As Range Dim myCon As New ADODB.Connection Dim myRS As New ADODB.Recordset Dim i As Integer myFile = ThisWorkbook.Path & "\sampleDB.mdb" myTbl = "社員" Set myRng = ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion With myCon .Provider = "Microsoft.Jet.OLEDB.4.0" 'Access(Jet)用のOLE DBプロバイダを使用 .Open myFile End With myRS.Open myTbl, myCon, adOpenStatic, adLockPessimistic, adCmdTableDirect myRS.Index = "社員ID" For i = 2 To myRng.Rows.Count myRS.Seek myRng(i, 1).Value If myRS.EOF Then myRS.AddNew For j = 1 To myRng.Columns.Count myRS.Fields(myRng(1, j).Value).Value = myRng(i, j).Value Next Next myRS.Update myRS.Close Set myRS = Nothing myCon.Close Set myCon = Nothing

質問者が選んだベストアンサー

  • ベストアンサー
noname#22222
noname#22222
回答No.3

全く、うろ覚えのまま書きなぐったものでバグ含みの可能性大です。 しかし、質問者のコードを整理する上では役に立つかも知れません。 少し、風通しがよくなったと思います。 Private Sub CommandButton2_Click()   Dim I      As Integer   Dim J      As Integer   Dim M      As Integer   Dim N      As Integer   Dim myRng    As Range   Dim dbsCurrent As DAO.Database   Dim rstEmployee As DAO.Recordset   Const conMDB = ThisWorkbook.Path & "\sampleDB.mdb"   Const conTABLE = "社員"   Const conINDEX = "社員ID"      Set myRng = ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion   Set dbsCurrent = DBEngine.Workspaces(0).OpenDatabase(conMDB)   Set rstEmployee = dbsCurrent.OpenRecordset(conTABLE)   With rstEmployee     .Index = conINDEX     M = myRng.Rows.Count     For I = 2 To M       .Seek myRng(I, 1).Value       If .NoMatch Then         .AddNew         N = myRng.Columns.Count - 1         For J = 0 To N           .Fields(J).Value = myRng(I, J).Value         Next J         .Update       End If     Next I     .Close   End With   dbsCurrent.Close End Sub ※未検証ですので、あくまでも参考程度に!

その他の回答 (3)

noname#22222
noname#22222
回答No.4

s_husky です。 早速のバグ修正です。 For J = 0 To N   .Fields(J).Value = myRng(I, J + 1).Value Next J

  • dee_honda
  • ベストアンサー率53% (26/49)
回答No.2

Microsoft.Jet.OLEDB.4.0プロバイダでしたら、 通常はJet3.5(Access97)形式のMDBファイルに問題なく書き込めます。 開発環境やそのテーブルがリンクテーブルなのか不明ですが、 http://support.microsoft.com/default.aspx?scid=kb;ja;290060 >やはりACCESS97で作成したmdbファイルだからダメなのでしょうか? http://www.accessclub.jp/bbs6/0006/das1276.html などを参考にしてみてください。 '個人的には、Seekメソッドをお使いならば、DAOをお薦めします。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

試したわけではないので・・ Acc97の頃にはADO接続は無かったので、 Acc2000以降のファイルへ変換するか DAOで接続するか、だと思います。