Microsoft Access 掲示板

Excelから、ACCESSの更新について / 8

21 コメント
views
4 フォロー
8
しん 2024/10/30 (水) 10:04:35 f87c1@9fff4

hiroton様

コード提示ありがとうございます。

私、ヘルプも読んだのですが、理解ができません。

このコードは、どこに差し込むのでしょうか?

また独立で、作動させるのでしょうか?

お手すきの時に回答いただけたら幸いです。
よろしくお願いいたします。

通報 ...
  • 10
    hiroton 2024/10/30 (水) 10:40:44 1ba09@f966d >> 8

    SQLを実行している部分を書き換えます

    Sub 単価転送()
        
        Dim DBpath As String
        Dim adoCn As Object
        Dim strSQL As String
        Dim henDB As String
        Dim i As Long
        Dim ws_2 As Worksheet
        Set ws_2 = Worksheets("転送用シート")
        henDB = Worksheets("Sheet1").Range("D1")
        
        Set adoCn = CreateObject("ADODB.Connection")
        DBpath = ThisWorkbook.Path & henDB  ' パスを確認
        adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & ";"
        
        With ws_2
         
         i = 2
    
         Do Until .Cells(i, "K") = ""
             strSQL = "UPDATE Q_単価更新用 SET 仕入=" & .Cells(i, "I") & " WHERE  更新合成キー ='" & .Cells(i, "K").Value & "'"
             
    '// ここを調査用のコードに書き換える
    '         adoCn.Execute strSQL
    
    Dim RecordsAffected As Long
    adoCn.Execute strSQL, RecordsAffected
    If RecordsAffected = 0 Then
        Debug.Print strSQL
        Stop
    End If
    '//ここまで
    
             i = i + 1
        Loop
        End With
        adoCn.Close
        Set adoCn = Nothing
    End Sub
    

    RecordsAffected

    省略可能です。 この操作の影響を受けたレコード数をプロバイダーが返す長整数型 ( Long ) の値です。

    ヘルプによればRecordsAffectedにUPDATEで更新されたレコード数が入るはずなので、期待通り更新されれば「1」、更新されなければ「0」となっているはずなので、「0」の時だけイミディエイトウィンドウにstrSQLの値を書き出し、つづくStop行でVBAの実行が中断されます

    または、Stop行は記述せずに、iの値と合わせてすべて処理させてから確認してもいいでしょう

    Dim RecordsAffected As Long
    adoCn.Execute strSQL, RecordsAffected
    If RecordsAffected = 0 Then
        Debug.Print i; strSQL
    End If
    

    イミディエイトウィンドウの表示は100行までなので、「うまく更新されないデータ」が100件を超える場合は注意してください