アプリ版:「スタンプのみでお礼する」機能のリリースについて

 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

A 回答 (4件)

全く、うろ覚えのまま書きなぐったものでバグ含みの可能性大です。


しかし、質問者のコードを整理する上では役に立つかも知れません。
少し、風通しがよくなったと思います。

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

※未検証ですので、あくまでも参考程度に!
    • good
    • 0

s_husky です。



早速のバグ修正です。

For J = 0 To N
  .Fields(J).Value = myRng(I, J + 1).Value
Next J
    • good
    • 0

Microsoft.Jet.OLEDB.4.0プロバイダでしたら、


通常はJet3.5(Access97)形式のMDBファイルに問題なく書き込めます。
開発環境やそのテーブルがリンクテーブルなのか不明ですが、
http://support.microsoft.com/default.aspx?scid=k …

>やはりACCESS97で作成したmdbファイルだからダメなのでしょうか?
http://www.accessclub.jp/bbs6/0006/das1276.html
などを参考にしてみてください。
'個人的には、Seekメソッドをお使いならば、DAOをお薦めします。
    • good
    • 0

試したわけではないので・・


Acc97の頃にはADO接続は無かったので、
Acc2000以降のファイルへ変換するか
DAOで接続するか、だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!