ADODB 到查询表:运行-时间错误 1004
ADODB to querytable : Run-Time Error 1004
我目前正在尝试将查询 SQL 服务器的项目从 VBA 从 ODBC 移动到 ADODB。引用了 Active X 数据对象和 Recordset 2.8。
ADODB 连接正常,记录集得到填充。由于某种超出我理解的原因,recorset 和 querytable 似乎彼此不喜欢。我在连接对象上尝试了任何类型的 With。
我 运行 进入 运行 时间错误“1004”应用程序定义或对象定义的错误。
代码如下所示:
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
.Open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx;"
.CommandTimeout = 0
Set rs = .Execute("Select 1")
End With
Debug.Print rs(0)
Dim qtData As QueryTable
Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
With qtData
.Name = "DTBase"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.BackgroundQuery = False
.EnableEditing = False
End With
'ActiveSheet.ListObjects.Add(xlSrcQuery, rs, Destination:=Selection).QueryTable.Refresh
qtData.Refresh
qtData.Close
qtData.Delete
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
本质上,您在不同的方法上遇到了两个问题:
.Close
:因为QueryTable对象没有.Close
方法,干脆去掉调用。
.Debug.Print
:当您调用 Debug.Print rs(0)
时,您显然消耗了记录集,因此不适用于 QueryTables.Add()
这似乎需要一个未触及的记录集。
要解决,请考虑将 Debug.Print
移动到 QueryTables.Add()
之后,并在查询 table 将光标推到之前调用 MoveFirst
EOF = True
的结尾。
Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
With qtData
.Name = "DTBase"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False ' REMOVED REPEATED LINE AFTER THIS ONE
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.EnableEditing = False
.Refresh ' MOVED TO INSIDE With BLOCK
.Delete ' MOVED TO INSIDE With BLOCK
End With
rs.MoveFirst
Debug.Print rs(0)
注意:我确实在 Debug.Print
之后尝试 运行 MoveFirst
但无济于事。似乎 QueryTables.Add()
需要一个未触及的记录集,无论光标位置如何。这可能与 ODBC 驱动程序不同。
Debug.Print rs(0)
rs.MoveFirst
Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
With qtData
...
.Refresh
.Delete
End With
我目前正在尝试将查询 SQL 服务器的项目从 VBA 从 ODBC 移动到 ADODB。引用了 Active X 数据对象和 Recordset 2.8。
ADODB 连接正常,记录集得到填充。由于某种超出我理解的原因,recorset 和 querytable 似乎彼此不喜欢。我在连接对象上尝试了任何类型的 With。
我 运行 进入 运行 时间错误“1004”应用程序定义或对象定义的错误。
代码如下所示:
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With cn
.Open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx;"
.CommandTimeout = 0
Set rs = .Execute("Select 1")
End With
Debug.Print rs(0)
Dim qtData As QueryTable
Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
With qtData
.Name = "DTBase"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = False
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = False
.BackgroundQuery = False
.EnableEditing = False
End With
'ActiveSheet.ListObjects.Add(xlSrcQuery, rs, Destination:=Selection).QueryTable.Refresh
qtData.Refresh
qtData.Close
qtData.Delete
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
本质上,您在不同的方法上遇到了两个问题:
.Close
:因为QueryTable对象没有.Close
方法,干脆去掉调用。.Debug.Print
:当您调用Debug.Print rs(0)
时,您显然消耗了记录集,因此不适用于QueryTables.Add()
这似乎需要一个未触及的记录集。要解决,请考虑将
Debug.Print
移动到QueryTables.Add()
之后,并在查询 table 将光标推到之前调用MoveFirst
EOF = True
的结尾。Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1")) With qtData .Name = "DTBase" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False ' REMOVED REPEATED LINE AFTER THIS ONE .RefreshStyle = xlOverwriteCells .SavePassword = False .SaveData = False .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = False .EnableEditing = False .Refresh ' MOVED TO INSIDE With BLOCK .Delete ' MOVED TO INSIDE With BLOCK End With rs.MoveFirst Debug.Print rs(0)
注意:我确实在
Debug.Print
之后尝试 运行MoveFirst
但无济于事。似乎QueryTables.Add()
需要一个未触及的记录集,无论光标位置如何。这可能与 ODBC 驱动程序不同。Debug.Print rs(0) rs.MoveFirst Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1")) With qtData ... .Refresh .Delete End With