Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ADO VBA代码只返回6559条记录?_Vba_Ado_Adodb - Fatal编程技术网

为什么ADO VBA代码只返回6559条记录?

为什么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语句并

我尝试使用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 端接头
感谢您的帮助

我猜您使用的是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