Reputation: 131
I'm trying to insert data from VBA excel to Ms Access Database. The data was inserted successfully, the problems are
it inserted multiple times. In this case, I only want to insert 3 rows, in the database has 7 rows (1 row for the first record, 2 rows for the second record, and 3 rows for the third record).
this query won't work if there is no record in database, so I need to add 1 dummy record make this insert query works.
db_path = ThisWorkbook.Path & "\PWC_Distribution_DB.accdb"
db_pass = "123abc"
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" &
db_path & ";Jet OLEDB:Database Password=" & db_pass & ";"
cn.Open
Set cm = New ADODB.Command
cm.ActiveConnection = cn
cm.CommandText = "ins_temp_table"
cm.CommandType = adCmdStoredProc
cm.Parameters.Append cm.CreateParameter("web_tracking", adVarChar, adParamInput, 100, 0)
cm.Parameters.Append cm.CreateParameter("incoming_date", adVarChar, adParamInput, 20, 0)
cm.Parameters.Append cm.CreateParameter("leads_id", adVarChar, adParamInput, 10, 0)
cm.Parameters.Append cm.CreateParameter("incoming_time", adVarChar, adParamInput, 10, 0)
cm.Parameters.Append cm.CreateParameter("leads_name", adVarChar, adParamInput, 100, 0)
cm.Parameters.Append cm.CreateParameter("phone_number", adVarChar, adParamInput, 50, 0)
cm.Parameters.Append cm.CreateParameter("email", adVarChar, adParamInput, 100, 0)
cm.Parameters.Append cm.CreateParameter("city", adVarChar, adParamInput, 100, 0)
cm.Parameters.Append cm.CreateParameter("platform", adVarChar, adParamInput, 50, 0)
cm.Parameters.Append cm.CreateParameter("app_date", adVarChar, adParamInput, 10, 0)
cm.Parameters.Append cm.CreateParameter("app_time", adVarChar, adParamInput, 10, 0)
cm.Parameters.Append cm.CreateParameter("meeting_point", adVarChar, adParamInput, 255, 0)
cm.Parameters.Append cm.CreateParameter("agent_name", adVarChar, adParamInput, 50, 0)
cm.Parameters.Append cm.CreateParameter("agent_code", adVarChar, adParamInput, 10, 0)
cm.Parameters.Append cm.CreateParameter("notes", adVarChar, adParamInput, 10, 0)
Do While wsWork.Cells(i, 1) <> ""
'cm.Parameters.Refresh
cm.Parameters("web_tracking").Value = wsWork.Cells(i, 4)
cm.Parameters("incoming_date").Value = wsWork.Cells(i, 6)
cm.Parameters("leads_id").Value = wsWork.Cells(i, 3)
cm.Parameters("incoming_time").Value = "10:00"
cm.Parameters("leads_name").Value = wsWork.Cells(i, 10)
cm.Parameters("phone_number").Value = wsWork.Cells(i, 11)
cm.Parameters("email").Value = wsWork.Cells(i, 12)
cm.Parameters("city").Value = wsWork.Cells(i, 13)
cm.Parameters("platform").Value = wsWork.Cells(i, 15)
cm.Parameters("app_date").Value = wsWork.Cells(i, 31)
cm.Parameters("app_time").Value = "11:00"
cm.Parameters("meeting_point").Value = wsWork.Cells(i, 33)
cm.Parameters("agent_name").Value = wsWork.Cells(i, 34)
cm.Parameters("agent_code").Value = "x123"
cm.Parameters("notes").Value = "x123"
Set rs = cm.Execute()
i = i + 1
Loop
cn.Close
Upvotes: 0
Views: 216
Reputation: 107567
Consider an insert-select append query that directly references Excel spreadsheet which is allowable in MS Access SQL. Excel headers are recognized if specified in properties. No loop or dummy rows required.
In below, adjust file and worksheet names in FROM
clause and columns or constants in INSERT
and SELECT
. Then, run inside an MS Access query window which can be saved and run later.
INSERT INTO myTable (web_tracking, incoming_date, leads_id, incoming_time, leads_name,
phone_number, email, city, platform, app_date, ap_time,
meeting_point, agent_name, agent_code, notes)
SELECT web_tracking, incoming_date, leads_id, '10:00' AS incoming_time, leads_name,
phone_number, email, city, platform, app_date, '11:00' AS app_time,
meeting_point, agent_name, 'x123' AS agent_code, 'x123' AS notes
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\File.xlsx].[SheetName$]
To run a saved query with ADO:
...
cn.Open
cn.Execute "mySavedQuery"
cn.Close
Upvotes: 2