meilkew
New member
- Local time
 - Today, 13:33
 
- Joined
 - Apr 14, 2020
 
- Messages
 - 27
 
I have Update sheet, this sheet contains unique ID that matched the access database ID, I'm trying to update the fields using excel values in "Update" sheet. 
The ID is in the Column A the rest of the fields are stored from Column B to R. I'm trying to achieve the below, As follows:
1. Update the record(values from Column B to R) if Column A (ID) matched existing Access database ID. Then add text in Column S "Updated"
2. If the Column A (ID) did not found any match in the existing Access database ID, Then add text in Column S "ID NOT FOUND"
3. Loop to next value
So far, I have the below Sub for Update and Function for Existing ID (Import_Update Module), but I'm getting this error.
		
		
	
	
		
	
Sub Data Update
	
	
	
		
Function to Check if the ID Exists
	
	
	
		
 The ID is in the Column A the rest of the fields are stored from Column B to R. I'm trying to achieve the below, As follows:
1. Update the record(values from Column B to R) if Column A (ID) matched existing Access database ID. Then add text in Column S "Updated"
2. If the Column A (ID) did not found any match in the existing Access database ID, Then add text in Column S "ID NOT FOUND"
3. Loop to next value
So far, I have the below Sub for Update and Function for Existing ID (Import_Update Module), but I'm getting this error.
Sub Data Update
		Code:
	
	
	Sub Data_Update_DB()
Dim dbPath As String
Dim lastRow As Long
Dim exportedRowCnt As Long
Dim NotexportedRowCnt As Long
Dim qry As String
Dim ID As String
'add error handling
On Error GoTo exitSub
'Check for data
    If Worksheets("Export").Range("A2").Value = "" Then
    MsgBox "Add the data that you want to send to MS Access"
        Exit Sub
    End If
    'Variables for file path
    dbPath = Worksheets("Home").Range("P4").Value '"W:\Edward\_Connection\Database.accdb"  '##> This was wrong before pointing to I3
    If Not FileExists(dbPath) Then
        MsgBox "The Database file doesn't exist! Kindly correct first"
            Exit Sub
    End If
    'find las last row of data
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Dim cnx As ADODB.Connection 'dim the ADO collection class
    Dim rst As ADODB.Recordset 'dim the ADO recordset class
    On Error GoTo errHandler
    'Initialise the collection class variable
    Set cnx = New ADODB.Connection
    'Connection class is equipped with a —method— named Open
     cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath
  
    'ADO library is equipped with a class named Recordset
    Set rst = New ADODB.Recordset 'assign memory to the recordset
'##> ID and SQL Query
    
    ID = Range("A" & lastRow).Value
    qry = "SELECT * FROM f_SD WHERE ID = '" & ID & "'"
        
    'ConnectionString Open '—-5 aguments—-
    rst.Open qry, ActiveConnection:=cnx, _
    CursorType:=adOpenDynamic, LockType:=adLockOptimistic, _
    Options:=adCmdTable
    'add the values to it
    'Wait Cursor
    Application.Cursor = xlWait
    'Pause Screen Update
    Application.ScreenUpdating = False
    
    '##> Set exportedRowCnt to 0 first
    UpdatedRowCnt = 0
    IDnotFoundRowCnt = 0
        '##> Let's suppose Data is on Column B to R.
        
    If rst.EOF And rst.BOF Then
        'Close the recordet and the connection.
        rst.Close
        cnx.Close
        'clear memory
        Set rst = Nothing
        Set cnx = Nothing
        'Enable the screen.
        Application.ScreenUpdating = True
        'In case of an empty recordset display an error.
        MsgBox "There are no records in the recordset!", vbCritical, "No Records"
    Exit Sub
    
    End If
    
    For nRow = 2 To lastRow
        '##> Check if the Row has already been imported?
        'If it is then continue update records
        If IdExists(cnx, Range("A" & nRow).Value) Then
    
        With rst
        
        For nCol = 1 To 18
            rst.Fields(Cells(1, nCol).Value2) = Cells(nRow, nCol).Value 'Using the Excel Sheet Column Heading
        Next nCol
    
        Range("S" & nRow).Value2 = "Updated"
        UpdatedRowCnt = UpdatedRowCnt + 1
    
     rst.Update
    
     End With
    
        Else
              
            '##>Update the Status on Column S when ID NOT FOUND
            Range("S" & nRow).Value2 = "ID NOT FOUND"
            
            'Increment exportedRowCnt
            IDnotFoundRowCnt = IDnotFoundRowCnt + 1
        End If
    Next nRow
    'close the recordset
    rst.Close
    ' Close the connection
    cnx.Close
    'clear memory
    Set rst = Nothing
    Set cnx = Nothing
    If UpdatedRowCnt > 0 Or IDnotFoundRowCnt > 0 Then
        'communicate with the user
        MsgBox UpdatedRowCnt & " Drawing(s) Updated " & vbCrLf & _
          IDnotFoundRowCnt & " Drawing(s) IDs Not Found"
        
    End If  
    
    'Update the sheet
    Application.ScreenUpdating = True
exitSub:
    'Restore Default Cursor
    Application.Cursor = xlDefault
    'Update the sheet
    Application.ScreenUpdating = True
        Exit Sub
errHandler:
    'clear memory
    Set rst = Nothing
    Set cnx = Nothing
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Export_Data_Updated"
    Resume exitSub
End Sub
	Function to Check if the ID Exists
		Code:
	
	
	Function IdExists(cnx As ADODB.Connection, sId As String) As Boolean
'Set IdExists as False and change to true if the ID exists already
    IdExists = False
'Change the Error handler now
    Dim rst As ADODB.Recordset 'dim the ADO recordset class
    Dim cmd As ADODB.Command   'dim the ADO command class
    On Error GoTo errHandler
    'Sql For search
    Dim sSql As String
    sSql = "SELECT Count(f_SD.ID) AS IDCnt FROM f_SD WHERE (f_SD.ID='" & sId & "')"
    'Execute command and collect it into a Recordset
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cnx
    cmd.CommandText = sSql
    'ADO library is equipped with a class named Recordset
    Set rst = cmd.Execute 'New ADODB.Recordset 'assign memory to the recordset
    'Read First RST
    rst.MoveFirst
'If rst returns a value then ID already exists
    If rst.Fields(0) > 0 Then
        IdExists = True
    End If
    'close the recordset
    rst.Close
    'clear memory
    Set rst = Nothing
exitFunction:
        Exit Function
errHandler:
    'clear memory
    Set rst = Nothing
        MsgBox "Error " & Err.Number & " :" & Err.Description
End Function