Excel 2013 中使用超出行 65536 的范围时出现问题

2023-12-13

我正在尝试对 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

If the range HighRange extends beyond row 65536 (e.g. A65527:B65537) I get an error message enter image description here

如果我删除足够多的行以将范围降至第 65536 行以下,则代码可以正常工作。

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

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

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


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

(我原本以为我可以只在现有工作簿中创建一个临时工作表,即不创建临时工作簿,但如果用户有两个活动的 Excel 实例,则会出现问题 - Connection.Open 事件在以下位置重新打开工作簿Excel 的第一个实例,即使我们在第二个实例中运行宏,因此重新打开的工作簿中没有虚拟工作表。而且我不想使用以下命令保存现有工作簿的副本里面有一个虚拟表。)

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

我仍然希望有一个更强大的解决方案来解决这个问题,所以希望其他人能提出另一个答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel 2013 中使用超出行 65536 的范围时出现问题 的相关文章

  • 以编程方式将参数传递到访问报告中

    我有一个现有的 Access MDB 我正在向运行现有报表的现有表单添加一个命令按钮 所做的更改是 此按钮需要传入一个包含正在报告的记录 ID 的参数 当前报告在 MDB 中的每条记录上运行 我已经更改了报告运行的查询 以使用 ID 值参数
  • 如何确保我的 IE 选项卡名称正确?

    我使用此代码从 Word VBA 获取 Internet Explorer 的实例 并从网页中抓取一些值 我循环遍历 4 个项目 以防万一 有时我不小心抓住了一个名为 Windows Explorer 的东西 我不知道那是什么 来抓住 In
  • Excel:查找和替换宏 - 仅一列

    我编写了一些宏来将大量数据格式化为相同的可接受格式 我们从中提取的程序拒绝按照我们想要的方式提取数据 但理论上在 Excel 中更改并不难 它设置运行的方式是为修饰符使用单独的宏 然后使用 全部运行 宏来调用所有修饰符 目前我有 Sub R
  • 检查工作表是否存在,如果不存在则创建-VBA [重复]

    这个问题在这里已经有答案了 我已经测试了许多代码 这些代码检查工作表是否存在 基于名称 如果不存在则创建一个 其中一些循环所有工作表 一些引用工作表 如果创建错误则意味着该工作表不存在 哪一种是最合适的 正统的 更快的方式来完成这个任务 目
  • openpyxl 2.4.2:保存后公式生成的单元格值为空

    我使用 openpyxl 打开文件 编辑一些单元格并保存更改 这是一个例子 import openpyxl book openpyxl load workbook sheet path sheet book active for row i
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 从新的 xlsx 文件中删除宏

    功能部分 下面的代码将 xlsm 文件中的 2 个选项卡保存到新的 xlsx 文件中 文件保持打开状态以进行编辑 错误 xlsm 选项卡在工作表代码中有触发器 该触发器无效 一旦在 xlsx 工作表中输入任何内容 就会导致错误 所需输出 编
  • Excel VBA 多张表求和

    我正在尝试创建一个或多个函数 可以将每个客户的考勤卡每日工作时间相加 得出每天的总工作时间 每个客户在一个工作簿中都有自己的工作表 目前 我有一个函数可以确定与第一个客户一起使用的工作表 工作簿中的第三个工作表 Function First
  • Excel 2007 问题:预编程按钮突然不起作用[重复]

    这个问题在这里已经有答案了 今天 出乎意料的是 我工作的公司使用的表格的按钮突然出现了问题 奇怪的是 它只影响我确信是 ActiveX 命令按钮的部分 而不会导致其他形状或下拉菜单出现问题 问题 按钮没有反应 当您单击时 他们不会访问代码
  • Excel工作表中的动态减法公式

    我需要在Excel中编写一个动态减法公式 该公式从其上方的单元格中减去 指定列的 单元格 例如 A2 A1 G1 G列固定 and A3 A2 G2 and A4 A3 G3 等等 Excel 足够智能 可以使用动态引用和对当前单元格的相对
  • VBA Word - 更改小数点分隔符

    我周围的一些人在 Windows Office 中使用国家本地化 不幸的是 这导致我的宏无法执行简单的数学运算 因为它们使用逗号表示小数位置 而我编辑的 pov ray 文件仅使用逗号作为列表分隔符 使用点表示小数点 1 我知道在 Exce
  • VBA 代码基准测试

    对 VBA 代码进行基准测试最准确的方法是什么 在我的例子中 我正在 Excel 中测试代码 除了下面的 2 种之外 还有其他对代码进行基准测试的技术吗 如果有 该方法的优点 缺点是什么 这里有两种流行的方法 First Timer Sub
  • 如何在自定义数据验证中使用用户定义的函数?

    In my Worksheet我有一个Table并想要定义Data validation对于包含日期的列 如下所示 S2M B2 lt gt Error 在上面 S2M 是一个用户定义的函数 用于将日期转换为Persian date to
  • VBA 从文本文件的属性获取日期

    我正在尝试获取特定文本文件上传到计算机的日期 该日期不在实际的文本文件中 您必须右键单击然后转到属性才能查看日期 我需要将日期读入变量 我不知道从哪里开始尝试完成这件事 谢谢你 杰西 斯莫瑟蒙 如果内置FileDateTime 不是你可以使
  • 用户完成后关闭 Excel

    任务非常简单 我想从 VB net GUI 打开 Excel 文档 xls 用户将处理 Excel 文件 用户完成后关闭 Excel 文件 我想要VB net代码释放Excel对象 问题是 当用户关闭文件时 Excel 对象仍然可以在任务管
  • ATL创建的COM接口继承IDispatch但后期绑定不起作用

    这是我的 IDL 文件 IFrame 是一个双接口 同时继承了 IDispatch 和 IUnknown object uuid C5AD0517 37FC 479C 9C7A A063B17E4A2E dual nonextensible
  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data
  • 在 XSSF 工作簿上设置密码保护

    我想为使用 poi 3 14 创建的 xlsx 文件添加密码保护 该文档声称 这是可能的 http poi apache org cryption html http poi apache org encryption html 使用我尝试
  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • Excel VBA 将范围值复制到数组,

    我有以下代码摘录 我试图将一系列值复制到声明的数组上 但它一直给我 无法分配给数组 错误 Dim permittedCurve 0 To 7000 As Variant permittedCurve activeWorkbook Works

随机推荐