VBA 将数据从 Excel 导出到对应的 SQL 字段的代码
VBA code to export data from Excel to corresponding SQL field
我有一个 Excel VBA 程序可以扫描条形码来打印标签。我想要做的是编写一个子程序,当与其余代码一起执行时,它将采用今天的日期并将其插入 SQL 数据库中的特定日期字段。为了进一步解释 Excel 程序使用了与我们数据库中的订单号相对应的订单号。我不是 100% 确定如何进行此操作,如果有帮助,我可以提供其他信息。
|OrderNo| |TodaysDateFromExcel|
033707 7/15/2019
我的VBA代码我目前
Dim conn As New ADODB.Connection
Dim sDate As Date
sDate= Today()
'Open a connection to SQL Server
conn.Open "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
conn.Execute "insert into dbo.Customers (TodaysDate) values ('" & sDate & "')"
MsgBox "Today's Date imported."
conn.Close
Set conn = Nothing
End sub
我假设您有一个稍微规范化的模式 - 像这样:
如果您想 INSERT
一个新的 Order
记录,您需要知道它是针对哪个客户 Id
(以及可能为 Order
).
INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate) VALUES (?, ?, ?)
如果您的 Customers
table 有一个唯一的密钥,例如CustomerNumber
,那么你可以从中得到 Id
外键:
INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate)
SELECT c.Id, ?, ?
FROM dbo.Customers c
WHERE c.Number = ?
如果您想 UPDATE
一个现有的 Order
记录,您需要知道更新的顺序 Id
- 假设有一个 自然键 将 OrderNumber
定义为在 Order
记录中唯一,您可以在给定 OrderNumber
的情况下更新订单的 OrderDate
- SQL 命令字符串如下所示:
UPDATE o SET o.OrderDate = ? FROM dbo.Orders o WHERE o.OrderNumber = ?
这需要两个参数,在 VBA 中看起来像这样:
Public Sub SaveOrderDate(ByVal orderNumber As String, ByVal orderDate As Date)
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection 'note: avoid auto-instantiated "As New" objects
conn.ConnectionString = "your connection string"
conn.Open
Const sql As String = "UPDATE o SET o.OrderDate = ? WHERE OrderNumber = ?"
Dim cmd As ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdTypeText
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter(Type:=adDate, Value:=orderDate)
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarChar, Value:=orderNumber)
cmd.Execute
conn.Close
End Sub
然后您将从宏中调用它,如下所示:
Public Sub Macro1()
On Error GoTo CleanFail
SaveOrderDate Sheet1.Cells(1, 1).Value, Sheet1.Cells(1, 2).Value
MsgBox "Order updated!"
CleanExit:
Exit Sub
CleanFail:
MsgBox "Something went wrong, couldn't update the order."
Debug.Print Err.Description
Resume CleanExit 'break here to debug (F9 to toggle a breakpoint)
Resume 'make this the current statement to step through errorring SaveOrderDate call
End Sub
注:未经测试air-code。
Private Sub CommandButton1_Click()
Dim cn_ADO As ADODB.Connection
Dim cmd_ADO As ADODB.Command
Set cmd_ADO = New ADODB.Command
Dim Dbconn As String
Dim SQLQuery As String
Dim strWhere As String
Dim i As Integer
Dim j As Integer
Dim jOffset As Integer
Dim iStartRow As Integer
'Data Columns
Dim strOrderNumber As String
Dim strOrderDate As String
jOffset = 3
iStartRow = 2
i = iStartRow
Dbconn = "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
Set cn_ADO = New ADODB.Connection
cn_ADO.Open Dbconn
While Cells(i, jOffset).Value <> ""
strOrderNumber = Cells(i, 0 + jOffset).Value
strOrderDate = Cells(i, 1 + jOffset).Value
strWhere = "OrderNumber = " & strOrderNumber
'Update Statement
SQLQuery = "update dbo.Orders " & _
"set " & _
"OrderDate = '" & strOrderDate & "' " & _
"where " & strWhere
cmd_ADO.CommandText = SQLQuery
cmd_ADO.ActiveConnection = cn_ADO
cmd_ADO.Execute
i = i + 1
Wend
Set cmd_ADO = Nothing
Set cn_ADO = Nothing
End Sub
我有一个 Excel VBA 程序可以扫描条形码来打印标签。我想要做的是编写一个子程序,当与其余代码一起执行时,它将采用今天的日期并将其插入 SQL 数据库中的特定日期字段。为了进一步解释 Excel 程序使用了与我们数据库中的订单号相对应的订单号。我不是 100% 确定如何进行此操作,如果有帮助,我可以提供其他信息。
|OrderNo| |TodaysDateFromExcel|
033707 7/15/2019
我的VBA代码我目前
Dim conn As New ADODB.Connection
Dim sDate As Date
sDate= Today()
'Open a connection to SQL Server
conn.Open "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
conn.Execute "insert into dbo.Customers (TodaysDate) values ('" & sDate & "')"
MsgBox "Today's Date imported."
conn.Close
Set conn = Nothing
End sub
我假设您有一个稍微规范化的模式 - 像这样:
如果您想 INSERT
一个新的 Order
记录,您需要知道它是针对哪个客户 Id
(以及可能为 Order
).
INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate) VALUES (?, ?, ?)
如果您的 Customers
table 有一个唯一的密钥,例如CustomerNumber
,那么你可以从中得到 Id
外键:
INSERT INTO dbo.Orders (CustomerId, OrderNumber, OrderDate)
SELECT c.Id, ?, ?
FROM dbo.Customers c
WHERE c.Number = ?
如果您想 UPDATE
一个现有的 Order
记录,您需要知道更新的顺序 Id
- 假设有一个 自然键 将 OrderNumber
定义为在 Order
记录中唯一,您可以在给定 OrderNumber
的情况下更新订单的 OrderDate
- SQL 命令字符串如下所示:
UPDATE o SET o.OrderDate = ? FROM dbo.Orders o WHERE o.OrderNumber = ?
这需要两个参数,在 VBA 中看起来像这样:
Public Sub SaveOrderDate(ByVal orderNumber As String, ByVal orderDate As Date)
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection 'note: avoid auto-instantiated "As New" objects
conn.ConnectionString = "your connection string"
conn.Open
Const sql As String = "UPDATE o SET o.OrderDate = ? WHERE OrderNumber = ?"
Dim cmd As ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdTypeText
cmd.CommandText = sql
cmd.Parameters.Append cmd.CreateParameter(Type:=adDate, Value:=orderDate)
cmd.Parameters.Append cmd.CreateParameter(Type:=adVarChar, Value:=orderNumber)
cmd.Execute
conn.Close
End Sub
然后您将从宏中调用它,如下所示:
Public Sub Macro1()
On Error GoTo CleanFail
SaveOrderDate Sheet1.Cells(1, 1).Value, Sheet1.Cells(1, 2).Value
MsgBox "Order updated!"
CleanExit:
Exit Sub
CleanFail:
MsgBox "Something went wrong, couldn't update the order."
Debug.Print Err.Description
Resume CleanExit 'break here to debug (F9 to toggle a breakpoint)
Resume 'make this the current statement to step through errorring SaveOrderDate call
End Sub
注:未经测试air-code。
Private Sub CommandButton1_Click()
Dim cn_ADO As ADODB.Connection
Dim cmd_ADO As ADODB.Command
Set cmd_ADO = New ADODB.Command
Dim Dbconn As String
Dim SQLQuery As String
Dim strWhere As String
Dim i As Integer
Dim j As Integer
Dim jOffset As Integer
Dim iStartRow As Integer
'Data Columns
Dim strOrderNumber As String
Dim strOrderDate As String
jOffset = 3
iStartRow = 2
i = iStartRow
Dbconn = "Provider=SQLOLEDB;Data Source=ANF-M2MCLIENT;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
Set cn_ADO = New ADODB.Connection
cn_ADO.Open Dbconn
While Cells(i, jOffset).Value <> ""
strOrderNumber = Cells(i, 0 + jOffset).Value
strOrderDate = Cells(i, 1 + jOffset).Value
strWhere = "OrderNumber = " & strOrderNumber
'Update Statement
SQLQuery = "update dbo.Orders " & _
"set " & _
"OrderDate = '" & strOrderDate & "' " & _
"where " & strWhere
cmd_ADO.CommandText = SQLQuery
cmd_ADO.ActiveConnection = cn_ADO
cmd_ADO.Execute
i = i + 1
Wend
Set cmd_ADO = Nothing
Set cn_ADO = Nothing
End Sub