【问题标题】:transferspreadsheet range error:3011 stuck at column "IV"转移电子表格范围错误:3011 卡在“IV”列
【发布时间】:2017-03-13 14:44:21
【问题描述】:

我正在使用以下函数导出列以访问数据库。它对“IV”之前的所有列都非常有效,但对“IV”列中和之后的所有范围都给出了错误。在下面的示例中,我的工作表名称是“Perm-1”,范围是 IV3:IV4。在 google 或 Microsoft 文档中找不到任何内容。任何人都遇到过类似的错误,如果您能够解决,请告诉我。

Public Sub Excel_Access_Export(accDB As Access.Application, tblName As String)

accDB.DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadSheetType:=acSpreadsheetTypeExcel12, _
        TableName:=tblName, _
        Filename:=Application.ActiveWorkbook.FullName, _
        HasFieldNames:=True, _
        Range:="Perm-1$IV3:IV4"
End Sub

Edit:: 错误消息:“MS Access 找不到对象'Perm-1$IV3:IV4'。确保对象存在并正确拼写其名称。如果这不是本地对象,请检查您的网络连接或联系服务器管理”

【问题讨论】:

  • 请发布完整的错误信息,而不仅仅是数字 3011。

标签: excel vba ms-access


【解决方案1】:

第 IV 列是第 256 列。Access 2007-2010 有 255 列的限制。 Transferspreadsheet 共享这些列限制,但(可能更重要的是,事实证明)也受到过时的 excel 对象模型(256 列和 65536 行)的限制。

这是一些解决列问题的示例代码。 (您可以以相同的方式解决行限制 - 将其复制到第 1 到 65536 行并以最多 65535 行的块导入。)我添加了一个新工作表“暂存”,它只是一个空工作表来临时保存你想转移的东西。对于这个例子,我只传输一列。

可能有更好的解决方法,但就目前而言,这是一个 POC。是的,我使用的是“thisworkbook”,而传输使用的是“activeworkbook”。

Sub test()
    Dim accDB As Access.Application

    Set accDB = New Access.Application
    accDB.Application.Visible = True
    accDB.OpenCurrentDatabase "C:\Bench\Database11.accdb", True
    Call Excel_Access_Export(accDB, "Table1", 257)
End Sub

Public Sub Excel_Access_Export(accDB As Access.Application, tblName As String, col As Long)
    With ThisWorkbook.Sheets("Staging").Columns(1)
        .ClearContents
        .Value = thisWorkbook.Sheets("Perm-1").Columns(col).Value
    End With
    accDB.DoCmd.TransferSpreadsheet _
        TransferType:=acImport, SpreadSheetType:=acSpreadsheetTypeExcel12, _
        TableName:=tblName, Filename:=Application.ActiveWorkbook.FullName, _
        HasFieldNames:=True, Range:="Staging$A3:A4"
End Sub

【讨论】:

  • 但是我在这里为每一列创建一个单独的表。例如:A 列是表 1,B 列是表 2,依此类推。
  • 即使您只传输一列和两行(一个是标题),只要您要求 TransferSpreadsheet 在第 256 列查找数据,它就会中断。解决方法是将数据拆分到多个电子表格中。我将更新我的答案,向您展示列的一种解决方法。 FWIW 它也中断了 65537 行。我怀疑自从 Excel 限制为 256 列和 65536 行以来,TransferSpreadsheet 就没有更新过。
  • 你搞错了传输方向。 OP 正在将数据从 Excel 传输到 Access,而不是从 Access 传输到 Excel。他在 Excel 中有超过 256 列数据,他正在将这些数据传输到 Access 中的多个表中。去读他的代码。此外,当某些东西在 255/256 和 65535/65536 处发生突破时,这通常不是巧合。
猜你喜欢
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多