Excel VBA-从基于SQL的范围获取数据-自动错误

Excel VBA-从基于SQL的范围获取数据-自动错误,vba,excel,Vba,Excel,当运行下面的代码时,我不断地遇到一个自动化错误,我一辈子都不知道为什么。有人能解释一下吗 当我使用debug时,它会突出显示以下内容 rs.Open SQLStr, cn 我看到一些关于 我的任务是根据a列第3行以后的值从SQL数据库获取数据 Excel表格示例: ITEM | QTY TO PICK | QTY ON ORDER | Column 2 | Column 3 etc PART 1 | 5 | <Data will be populated

当运行下面的代码时,我不断地遇到一个自动化错误,我一辈子都不知道为什么。有人能解释一下吗

当我使用debug时,它会突出显示以下内容

    rs.Open SQLStr, cn
我看到一些关于

我的任务是根据a列第3行以后的值从SQL数据库获取数据

Excel表格示例:

ITEM   | QTY TO PICK | QTY ON ORDER | Column 2 | Column 3 etc

PART 1 |      5      | <Data will be populated here>

PART 2 |      12     | <Data will be populated here>
项目|提货数量|订单数量|第2列|第3列等
第1部分| 5 |
第2部分| 12 |
此代码通过命令按钮运行

从SQL中提取的数据将从C3开始填充

Private Sub CommandButton2_Click()

' Create a connection object.
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection

' Provide the connection string.
Dim strConn As String

'Use the SQL Server OLE DB Provider.
strConn = "Provider=SQLOLEDB;"

'Connect to the Pubs database on the local server.
strConn = strConn & "server=<server name>;INITIAL CATALOG=<DB Name>;"

'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"

'Now open the connection.
cn.Open strConn

'
'

ActiveSheet.Range("C3:G10000").Clear ' clear out existing data
Dim ItemNumber As String

ItemNumber = Range("A3").Value

' Create a recordset object.
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

SQLStr = "Select * from vw_WorksOrder WHERE ITEMNO = " & ItemNumber & ""

rs.Open SQLStr, cn

' Copy the records into cell A1 on Sheet1.
Sheet4.Range("C3").CopyFromRecordset rs

' Tidy up

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Private子命令按钮2\u单击()
'创建一个连接对象。
Dim cn作为ADODB.Connection
Set cn=New ADODB.Connection
'提供连接字符串。
作为字符串的Dim strConn
'使用SQL Server OLE DB提供程序。
strConn=“Provider=SQLOLEDB;”
'连接到本地服务器上的Pubs数据库。
strConn=strConn&“服务器=;初始目录=;”
'使用集成登录。
strConn=strConn&“集成安全性=sspi;”
'现在打开连接。
cn.开放式结构
'
'
ActiveSheet.Range(“C3:G10000”)。清除“清除现有数据”
将ItemNumber设置为字符串
ItemNumber=范围(“A3”)。值
'创建记录集对象。
将rs设置为ADODB.Recordset
Set rs=New ADODB.Recordset
SQLStr=“从vw_工作订单中选择*,其中ITEMNO=“&ItemNumber&”
rs.开放式SQLStr,中国
'将记录复制到表1的A1单元格中。
表4.范围(“C3”).来自记录集rs的副本
“收拾
rs.Close
cn.Close
设置rs=无
设置cn=Nothing

< P> AS扎克指出,使用不正确的引用来解决问题,不要考虑使用引文或变量连接,而是采用工业最佳化的参数化方法。ADO可以使用其命令方法参数化SQL调用

请参见下面使用设置的示例,其中,
在准备好的语句中用作占位符,然后添加一个参数,定义其名称、类型、方向大小和值

。。。
Dim cmd作为新的ADODB.Command
使用cmd
.ActiveConnection=cn
.CommandText=“从vw_工作订单中选择*,其中ITEMNO=?”
.CommandType=adCmdText
.Parameters.Append cmd.CreateParameter(“itemparam”,adVarChar,adParamInput,255,ItemNumber)
以
将rs设置为新ADODB.Recordset
设置rst=cmd.Execute
...

另外,另一个行业最佳实践是针对运行时错误的错误和异常处理,因为AutomationError对调试没有帮助。无论是否出错,都要释放所有
Set
对象。在VBA中,您可以使用
On Error
处理来输出更多有用的消息,并相应地从内存中释放对象

Private Sub CommandButton2_Click()
On Error Goto ErrHandle
  '...same code but without any Set obj = Nothing (since used in ExitHandle)

ExitHandle:
  Set rs = Nothing
  Set cmd = Nothing
  Set cn = Nothing
  Exit Sub

ErrHandle:
  Msgbox Err.Number & " - " & Err.Description
  Resume ExitHandle

End Sub

扎克指出,使用不正确的引用来解决问题,不要考虑使用引文或变量连接,而是采用工业最佳化的参数化方法。ADO可以使用其命令方法参数化SQL调用

请参见下面使用设置的示例,其中,
在准备好的语句中用作占位符,然后添加一个参数,定义其名称、类型、方向大小和值

。。。
Dim cmd作为新的ADODB.Command
使用cmd
.ActiveConnection=cn
.CommandText=“从vw_工作订单中选择*,其中ITEMNO=?”
.CommandType=adCmdText
.Parameters.Append cmd.CreateParameter(“itemparam”,adVarChar,adParamInput,255,ItemNumber)
以
将rs设置为新ADODB.Recordset
设置rst=cmd.Execute
...

另外,另一个行业最佳实践是针对运行时错误的错误和异常处理,因为AutomationError对调试没有帮助。无论是否出错,都要释放所有
Set
对象。在VBA中,您可以使用
On Error
处理来输出更多有用的消息,并相应地从内存中释放对象

Private Sub CommandButton2_Click()
On Error Goto ErrHandle
  '...same code but without any Set obj = Nothing (since used in ExitHandle)

ExitHandle:
  Set rs = Nothing
  Set cmd = Nothing
  Set cn = Nothing
  Exit Sub

ErrHandle:
  Msgbox Err.Number & " - " & Err.Description
  Resume ExitHandle

End Sub

不要认为您的SQL格式正确。我认为应该是
SQLStr=“Select*from vw_WorksOrder WHERE ITEMNO=”&ItemNumber&“”
多么简单,解决了这个问题!我真傻,没发现它!然而,数据并没有通过,所以回到一些令人挠头的地方--,我们都做了:)。对于数据问题,如果未返回任何内容,请在excel vba外部运行查询以确认查询是否返回了内容。如果没有,那么您的问题就是查询。希望此帮助是针对
ItemNumber=Range(“A3”)。Value
一次只针对一个值运行,而不是我需要的A3:A1000范围。谢谢你的帮助:)好地方。我只是在看,你的SQL格式不对。我认为应该是
SQLStr=“Select*from vw_WorksOrder WHERE ITEMNO=”&ItemNumber&“”
多么简单,解决了这个问题!我真傻,没发现它!然而,数据并没有通过,所以回到一些令人挠头的地方--,我们都做了:)。对于数据问题,如果未返回任何内容,请在excel vba外部运行查询以确认查询是否返回了内容。如果没有,那么您的问题就是查询。希望此帮助是针对
ItemNumber=Range(“A3”)。Value
一次只针对一个值运行,而不是我需要的A3:A1000范围。谢谢你的帮助:)好地方。我只是在看