Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Vba Excel 2013在使用超出第65536行的范围时出现问题_Vba_Excel_Adodb - Fatal编程技术网

Vba Excel 2013在使用超出第65536行的范围时出现问题

Vba Excel 2013在使用超出第65536行的范围时出现问题,vba,excel,adodb,Vba,Excel,Adodb,我正在尝试对Excel 2013工作簿中的命名范围执行ADODB查询 我的代码如下: Option Explicit Sub SQL_Extract() Dim objConnection As ADODB.Connection Dim objRecordset As ADODB.Recordset Set objConnection = CreateObject("ADODB.Connection") ' data

我正在尝试对Excel 2013工作簿中的命名范围执行ADODB查询

我的代码如下:

Option Explicit
Sub SQL_Extract()
    Dim objConnection           As ADODB.Connection
    Dim objRecordset            As ADODB.Recordset
    Set objConnection = CreateObject("ADODB.Connection")        ' dataset query object
    Set objRecordset = CreateObject("ADODB.Recordset")          ' new dataset created by the query

    objConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                                     "Data Source=" & ThisWorkbook.FullName & ";" & _
                                     "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    objConnection.Open

    objRecordset.Open "SELECT * FROM [HighRange]", objConnection, adOpenStatic, adLockOptimistic, adCmdText

    If Not objRecordset.EOF Then
        ActiveSheet.Cells(1, 1).CopyFromRecordset objRecordset
    End If

    objRecordset.Close
    objConnection.Close
End Sub
如果范围<代码>高范围超出第65536行(例如A65527:B65537),我会收到一条错误消息

如果我删除了足够多的行,将范围放在第65536行下面,代码就会正常工作

如果我强制工作簿为只读(并确保没有其他人打开非只读版本),代码也可以工作

这是我做错了什么,还是Excel 2013中的错误


(问题存在于32位和64位版本中。Excel 2016中也存在。)

我还没有找到问题的实际答案,所以我能想到的最佳解决办法是创建一个额外的工作簿,将我的范围复制到该工作簿中的工作表(从单元格A1开始),保存该工作簿,然后使用该工作簿/工作表作为查询源

(我原本以为我可以在现有工作簿中创建一个临时工作表,即不创建临时工作簿,但如果用户有两个Excel实例处于活动状态(连接)。Open event在Excel的第一个实例中重新打开工作簿,即使我们在第二个实例中运行宏实例,因此重新打开的工作簿中没有虚拟工作表。我不想保存现有工作簿的副本,其中包含虚拟工作表。)


我仍然希望这个问题有一个更可靠的解决方案,因此希望其他人能给出另一个答案。

如果这仍然是一个未决问题,我也遇到了同样的问题,并通过不指定所查询范围内的任何行号来解决。例如:

我试图查询[SheetName$A1:W100000],这给了我与您完全相同的错误。然后我将范围指定为[SheetName$A:W],并且它是weeerks


希望这能有所帮助!

我猜你发现了一个MSoft实例忘记在他们的MS Access db引擎代码中将
int
更改为
long
。对我来说,这听起来像个bug。在XL2016中试试吧?不幸的是,这是一个工作环境,所以我们只打算在2013年使用Excel。(我认为我们在Excel 2010中没有这个问题。)显然这似乎是一个
int
vs
long
问题,因为65535是最大的无符号16位整数。在阅读了@TimWilliams发布的链接后,我认为我找到了一个解决方法-将范围复制到新工作表(确保目标区域从第1行开始),激活该工作表,对该工作表的数据运行查询(不使用范围名称),然后删除临时工作表-但它无法可靠地工作,因为它会丢失某些行中的信息,因此我重新寻找建议和答案。
Sub SQL_Extract_Fudged()
    Dim objConnection           As ADODB.Connection
    Dim objRecordset            As ADODB.Recordset
    Dim wsOrig As Worksheet
    Dim wbTemp As Workbook
    Dim wbTempName As String
    Dim wsTemp As Worksheet

    Set wsOrig = ActiveSheet

    'Generate a filename for the temporary workbook
    wbTempName = Environ$("TEMP") & "\TempADODBFudge_" & Format(Now(), "yyyymmdd_hhmmss") & ".xlsx"
    'Create temporary workbook
    Set wbTemp = Workbooks.Add
    'Use first sheet as the place for the temporary copy of the range we want to use
    Set wsTemp = wbTemp.Worksheets(1)
    wsTemp.Name = "TempADODBFudge"
    'Copy the query range to the temporary worksheet
    wsOrig.Range("HighRange").Copy Destination:=wsTemp.Range("A1")
    'Save and close the temporary workbook
    wbTemp.SaveAs wbTempName
    wbTemp.Close False
    'Get rid of references to the temporary workbook
    Set wsTemp = Nothing
    Set wbTemp = Nothing

    'Create connection and recordset objects
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordset = CreateObject("ADODB.Recordset")

    'Create the connection string pointing to the temporary workbook
    objConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                                     "Data Source=" & wbTempName & ";" & _
                                     "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    objConnection.Open

    'Perform the query against the entire temporary worksheet
    objRecordset.Open "SELECT * FROM [TempADODBFudge$]", objConnection, adOpenStatic, adLockOptimistic, adCmdText

    'Copy output (for this example I am just copying back to the original sheet)
    If Not objRecordset.EOF Then
        wsOrig.Cells(1, 1).CopyFromRecordset objRecordset
    End If

    'Close connections
    objRecordset.Close
    objConnection.Close

    'Get rid of temporary workbook
    On Error Resume Next
    Kill wbTempName
    On Error GoTo 0

End Sub