Search code examples
sqlexcelvbams-accessado

Excel-Access ADO Update Values


I am trying to update a table in Access from the values in excel, however every time i run the code it creates new rows instead of updating the already existing ones, any ideas why? I am new to ADO, so any advised is well appreciated

Private Sub SelectMaster()

Dim db As New ADODB.Connection
Dim connectionstring As String
Dim rs1 As Recordset
Dim ws As Worksheet

Set ws = ActiveSheet

connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=C:\Users\Giannis\Desktop\Test.mdb;"

db.Open connectionstring

Set rs1 = New ADODB.Recordset
rs1.Open "Men", db, adOpenKeyset, adLockOptimistic, adCmdTable


r = 6
Do While Len(Range("L" & r).Formula) > 0
With rs1
.AddNew

.Fields("Eva").Value = ws.Range("L" & r).Value
.Update

End With
r = r + 1
Loop

rs1.Close

'close database
db.Close

'Clean up
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing
End Sub

Solution

  • Here are some notes.

    An example of updating row by row

    ''Either add a reference to:
    ''Microsoft ActiveX Data Objects x.x Library
    ''and use:
    ''Dim rs As New ADODB.Recordset
    ''Dim cn As New ADODB.Connection
    ''(this will also allow you to use intellisense)
    ''or use late binding, where you do not need
    ''to add a reference:
    Dim rs As Object
    Dim cn As Object
    
    Dim sSQL As String
    Dim scn As String
    Dim c As Object
    
    scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\docs\dbto.mdb"
    
    ''If you have added a reference and used New
    ''as shown above, you do not need these
    ''two lines
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    cn.Open scn
    
    sSQL = "SELECT ID, SName, Results FROM [Test]"
    
    ''Different cursors support different
    ''operations, with late binding
    ''you must use the value, with a reference
    ''you can use built-in constants,
    ''in this case, adOpenDynamic, adLockOptimistic
    ''see: http://www.w3schools.com/ADO/met_rs_open.asp
    
    rs.Open sSQL, cn, 2, 3
    
    For Each c In Range("A1:A4")
        If Not IsEmpty(c) And IsNumeric(c.Value) Then
            ''Check for numeric, a text value would
            ''cause an error with this syntax.
            ''For text, use: "ID='" & Replace(c.Value,"'","''") & "'"
    
            rs.MoveFirst
            rs.Find "ID=" & c.Value
    
            If Not rs.EOF Then
                ''Found
                rs!Results = c.Offset(0, 2).Value
                rs.Update
            End If
        End If
    Next
    

    An easier option: update all rows

    scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\docs\dbto.mdb"
    
    Set cn = CreateObject("ADODB.Connection")
    
    cn.Open scn
    
    sSQL = "UPDATE [Test] a " _
      & "INNER JOIN " _
      & "[Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\Docs\WB.xls].[Sheet1$] b  " _
      & "ON a.ID=b.ID " _
      & "SET a.Results=b.Results"
    
    cn.Execute sSQL, RecsAffected
    Debug.Print RecsAffected