I am new in Excel VBA and SQL. I have managed to create a macro button and push Excel cell data to SQL server tables. However, I am a bit puzzled:
How can I take Excel cell data from different sheets and then push them to different tables in SQL Server database? (Currently, I have 3 sheets – Customers, Test, Information – in one Excel file.)
Current working code:
Sub Button1_Click()
 
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String
With Sheets("Customers")
        
    'Open a connection to SQL Server
    conn.Open "Provider=SQLOLEDB;Data Source=TESTpcSQLEXPRESS;Initial Catalog=ExcelSQLServerDemo;Trusted_connection=yes"
        
   'Skip the header row
    iRowNo = 2
        
    'Loop until empty cell in CustomerId
    Do Until .Cells(iRowNo, 1) = ""
        sCustomerId = .Cells(iRowNo, 1)
        sFirstName = .Cells(iRowNo, 2)
        sLastName = .Cells(iRowNo, 3)
            
        'Generate and execute sql statement to import the excel rows to SQL Server table
        conn.Execute "INSERT into dbo.Customers (CustomerId, FirstName, LastName) values ('" & sCustomerId & "', '" & sFirstName & "', '" & sLastName & "')"
        iRowNo = iRowNo + 1
    Loop
    
    MsgBox "Customers Exported To Database"
        
    conn.Close
    Set conn = Nothing
    
    End With
End Sub
Do I need to store the data in arrays and then push them to the database?
Advertisement
Answer
You shouldn’t use insert queries for every row you want to export. Instead, if you want to do it manually, open a recordset:
Sub Button1_Click()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String
With Sheets("Customers")
    'Open a connection to SQL Server
    conn.Open "Provider=SQLOLEDB;Data Source=TESTpcSQLEXPRESS;Initial Catalog=ExcelSQLServerDemo;Trusted_connection=yes"
    conn.CursorLocation = adUseClient 'Use a client-side cursor
    rs.Open "SELECT * FROM dbo.Customers", conn, adOpenDynamic, adLockOptimistic 'Open the table into a recordset
   'Skip the header row
    iRowNo = 2
    'Loop until empty cell in CustomerId
    Do Until .Cells(iRowNo, 1) = ""
        rs.AddNew 'Add a new row
        rs!CustomerId = .Cells(iRowNo, 1) 'Set row values
        rs!FirstName = .Cells(iRowNo, 2)
        rs!LastName = .Cells(iRowNo, 3)
        rs.Update 'Commit changes to database, you can try running this once, or once every X rows
        iRowNo = iRowNo + 1
    Loop
    MsgBox "Customers Exported To Database"
    conn.Close
    Set conn = Nothing
    End With
End Sub
This has several advantages, including but not limited to increased performance, the ability to insert quoted values and increased stability.