次の方法で共有

accessでインポート時に、すでにあるデータを上書きする場合

Anonymous
2022-02-14T14:38:13+00:00

os win10 access2013を使用してます。

アクセスを操作、外部データからインポート時に既にあるデータは上書きしたいのです。一旦、インポートデータを「取込テーブル」いれ、その後、vbaにクエリを作成して「登録テーブル」を上書きするようVBAを作成しました。しかし、9行目の「 rs.text1 = 取込.text1」 で「メソッドまたはデータメンバーが見つかりません」と表示されます。

どのように修正すればよいのか、お教え頂けますでしょうか。

更新テーブルのフィールド 更新ID、text1

登録テーブルのフィールド 登録ID、text1

Public Sub T更新()

Dim db As DAO.Database

Dim rs As DAO.Recordset

Dim mysql As String

mysql = "select * from 登録 INNER JOIN 取込 ON 登録.ID = 取込.ID;"

Set db = CurrentDb

Set rs = db.OpenRecordset(mysql)

Do Until rs.EOF = True

rs.Edit

rs.text1 = 取込.text1 

rs.Update 

rs.MoveNext 

Loop

rs.Close

db.Close

End Sub

Microsoft 365 と Office | アクセス | ビジネス向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

1 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2022-02-15T01:32:22+00:00

    > 一旦、インポートデータを「取込テーブル」いれ、その後、> vbaにクエリを作成して「登録テーブル」を上書きする

    (標準モジュール)

    Public Sub T更新()
    
        On Error GoTo Err_T更新
    
        Dim ws As DAO.Workspace
        Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim mysql As String
        
        Set ws = DBEngine.Workspaces(0)
        Set db = CurrentDb
        
        mysql = "SELECT [登録].[text1] AS [登録テキスト], [取込].[text1] AS [取込テキスト]" & _
                " FROM [登録] INNER JOIN [取込] ON [登録].[ID] = [取込].[ID];"
        
        Set rs = db.OpenRecordset(mysql, dbOpenDynaset)
        
        If rs.EOF = True Then
            Debug.Print "更新対象となるレコードはありません。"
            rs.Close
            Set rs = Nothing
            db.Close
            Set db = Nothing
            Set ws = Nothing
            Exit Sub
        End If
        
        ws.BeginTrans
        On Error GoTo ErrOnTrans_T更新
        
        Debug.Print "トランザクション処理を開始します。"
        
        Do Until rs.EOF = True
            rs.Edit
            rs![登録テキスト] = rs![取込テキスト]
            rs.Update
            rs.MoveNext
        Loop
        
        ws.CommitTrans
        On Error GoTo Err_T更新
        
        Debug.Print "コミットしました。"
        
    Exit_T更新:
    On Error Resume Next
    
        rs.Close
        Set rs = Nothing
        db.Close
        Set db = Nothing
        Set ws = Nothing
        
        Exit Sub
    
    ErrOnTrans_T更新:
        
        ws.Rollback
        Debug.Print "更新中に実行時エラーが発生したため、ロールバックしました。"
    
    Err_T更新:
    
        MsgBox Err.Number & ": " & Err.Description, vbCritical, "実行時エラー(T更新)"
    
        Resume Exit_T更新
    End Sub
    

    > Dim rs As DAO.Recordset> 9行目の「 rs.text1 = 取込.text1」 で「メソッドまたはデータメンバーが見つかりません」と表示されます。

    ・DAO.Recordset オブジェクトに text1 という名前のメンバーは存在しない。

    . 演算子だけでは Fields コレクションのアイテムにアクセスすることは出来ない。

    (記述例 1 )

    rs.Fields("text1") = "A"
    

    (記述例 2 )

    rs![text1] = "B"
    

    > rs.text1 = 取込.text1

    ・[取込]という変数は(少なくともプロシージャレベルの)どこにも宣言されていない。

    ・[取込]という(暗黙的な)変数はどのレコードセットも参照していない。

    > mysql = "select * from 登録 INNER JOIN 取込 ON 登録.ID = 取込.ID;"> rs.text1 = 取込.text1

    ・rs が返すレコードセットにおいて、[text1]という名前のフィールドが
     選択対象として競合しているため、[text1]とだけ指定しても
     両者の区別がつかず、テーブル名も含めなければ参照することができない。

    (記述例 3 )

    rs![登録.text1] = rs![取込.text1]
    

    (但し上記のような書き方はあまり推奨しない。SELECT 文の中において、
     それぞれの[text1]に別名をつけて明確に区別するようにした方がよい)

    まあ今回のようなケースであれば、単純に UPDATE 文(更新クエリ)を
    1 回実行すれば充分でしょう。

    (別解)

    Public Sub T更新2()
    
        Dim db As DAO.Database
        Dim mysql As String
        
        Set db = CurrentDb
        
        mysql = "UPDATE [登録] INNER JOIN [取込] ON [登録].[ID] = [取込].[ID]" & _
                " SET [登録].[text1]=[取込].[text1];"
        
        db.Execute mysql, dbFailOnError
        Debug.Print db.RecordsAffected & " 件のレコードを更新しました。"
        
        db.Close
        Set db = Nothing
    
    End Sub
    

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません