为什么ADO VBA代码只返回6559条记录?
我尝试使用ADO liblary创建一个使用sql语句的宏,但实际上它只返回6559条记录,而我的一个表有72k条记录。 为什么? 最近,我注意到,实际上我的代码并没有返回6559行,而是返回第65537行。所以,当我将工作表中的行数减少到72092时,我甚至得到更少的行(6550) 我注意到的另一件事是rs.RecordCount返回“-1” 下面是我的子程序的代码。它有三个参数:sql语句(sqlstmt)、目标工作表名称(工作表名称)和目标范围(destination1) 执行sql语句并将结果保存在给定工作表中的子过程 公共子sql_查询(ByVal sqlstmt作为字符串,ByVal sheet_name作为字符串,ByVal destination1作为字符串) Dim conn作为ADODB连接 将rs设置为ADODB.Recordset 将字符串变为字符串 将qt设置为查询表 作为字符串的Dim tw_路径 Dim是作为布尔值的_名称 将sh设置为工作表 ''如果不存在,则制作表单 是_name=False吗 用于此工作簿中的每个sh。工作表 如果sh.Name=图纸\名称,则为\名称=真 下一个 如果为False,则ThisWorkbook.Worksheets.Add(之后为:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).name=sheet\u name ''连接 tw_path=thiswoolk.path&“\”&thiswoolk.Name connstring=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&tw\u path&”扩展属性=Excel 8.0;持久安全信息=False” Set conn=新的ADODB.连接 conn.ConnectionString=connstring 康涅狄格州公开赛 ''执行语句 Set rs=New ADODB.Recordset rs.Source=sqlstmt rs.ActiveConnection=conn 美国公开赛 “保存记录” 此工作簿。工作表(工作表名称)。激活 Set qt=Worksheets(sheet_name).QueryTables.Add(连接:=rs,目的地:=Range(目的地1)) qt.刷新 ''结束 如果rs.State ADSTATES关闭,则rs.关闭 关闭连接 如果不是rs,则设置rs=Nothing 如果Not conn为Nothing,则设置conn=Nothing 设置qt=Nothing 端接头为什么ADO VBA代码只返回6559条记录?,vba,ado,adodb,Vba,Ado,Adodb,我尝试使用ADO liblary创建一个使用sql语句的宏,但实际上它只返回6559条记录,而我的一个表有72k条记录。 为什么? 最近,我注意到,实际上我的代码并没有返回6559行,而是返回第65537行。所以,当我将工作表中的行数减少到72092时,我甚至得到更少的行(6550) 我注意到的另一件事是rs.RecordCount返回“-1” 下面是我的子程序的代码。它有三个参数:sql语句(sqlstmt)、目标工作表名称(工作表名称)和目标范围(destination1) 执行sql语句并
感谢您的帮助我猜您使用的是excel 2003或以前的版本,在这种情况下,工作表最多有65536行。我本想把这句话放在评论中,而不是回答中,但我离评论还有一段距离:(.抱歉根据我的经验,ADO不会总是完全加载记录集,除非强制加载。请尝试在rs.Open之后添加rs.MoveLast以强制它读取所有记录。谢谢,但实际上这并没有帮助:(感谢您的回答。事实上,我使用的是excel 2007和ADO 6.0库,我的一个工作表中确实有72 k行:)但是,可能无法使用超过65536行的表,因为当我将此工作表拆分为两个较小的工作表时,只要使用SQL UNION命令,它就会正常工作。
'subprocedure that execute sql statements and save resault in given worksheet
Public Sub sql_query(ByVal sqlstmt As String, ByVal sheet_name As String, ByVal destination1 As String)
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim connstring As String
Dim qt As QueryTable
Dim tw_path As String
Dim is_name As Boolean
Dim sh As Worksheet
'''making sheet if it doesn't exist
is_name = False
For Each sh In ThisWorkbook.Worksheets
If sh.Name = sheet_name Then is_name = True
Next
If is_name = False Then ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)).Name = sheet_name
''' connection
tw_path = ThisWorkbook.path & "\" & ThisWorkbook.Name
connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & tw_path & ";Extended Properties=Excel 8.0;Persist Security Info=False"
Set conn = New ADODB.Connection
conn.ConnectionString = connstring
conn.Open
'''executing statement
Set rs = New ADODB.Recordset
rs.Source = sqlstmt
rs.ActiveConnection = conn
rs.Open
'''saving records
ThisWorkbook.Worksheets(sheet_name).Activate
Set qt = Worksheets(sheet_name).QueryTables.Add(Connection:=rs, Destination:=Range(destination1))
qt.Refresh
'''end
If rs.State <> adStateClosed Then rs.Close
conn.Close
If Not rs Is Nothing Then Set rs = Nothing
If Not conn Is Nothing Then Set conn = Nothing
Set qt = Nothing
End Sub