【问题标题】:Access VBA not recognizing range in Excel spreadsheet访问 VBA 无法识别 Excel 电子表格中的范围
【发布时间】:2017-06-02 07:42:26
【问题描述】:

DoCmd.TransferSpreadsheet 方法让我感到非常沮丧。我有一个包含多个工作表的工作簿,用户在其中更新数据,我有一个脚本,可以将所有记录放回一个工作表,链接电子表格,并更新我的 Access DB 中的数据。我的问题出在 Range 参数中。我传递以下字符串并得到以下错误:

DoCmd.TransferSpreadsheet TransferType:=acLink, SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
                              TableName:=linkSheet, fileName:=Wb.Path & "\" & Wb.name, _
                              HasFieldNames:=True, Range:="AccessUpdate!updateTable"
The Microsoft Access database engine could not find the object 'AccessUpdate$updateTable'. Make sure the object exists and that you spell its name and the path name correctly. If 'Access_Update$updateTable' is not a local object, check your network connection or contact the server administrator.

我似乎无法理解为什么它用美元符号代替了爆炸。在理解如何指定范围方面的任何其他帮助也将不胜感激。

谢谢!

【问题讨论】:

  • 如果 updateTable 是命名范围,请在此处使用:Range:="updateTable"
  • 我尝试简单地引用该表,但我的错误代码说它找不到“updateTable”

标签: ms-access vba


【解决方案1】:

我知道这是一个老问题,但它几乎是一个永恒的问题。

我正在尝试从 Excel 端做同样的事情并遇到同样的问题。访问切换工作表分隔符“!”对于“$”

我发现这是 Access 2000 中的一个错误,从未得到纠正。或者更好的是,它在某些时候得到了部分纠正。因此,根据您的 Access 版本和范围的大小 [是的,大小,因为这是 Access 2000 中的一个错误],Cisco 或 HansUp 提供的解决方案将起作用。

MS$ 自己提供了另一个解释问题的来源和类似的解决方案 https://answers.microsoft.com/en-us/office/forum/office_2007-access/transferspreadsheet-error-3011-can-not-file-sheet/980b2dc1-9ee1-4b3e-9c3c-a810f1428496 在 Bob Larson 前 Access MVP (2008-2010) 的帮助下[查看他的最后一篇文章]

现在,如果您的范围在超过 65536 行的不同工作表上,此错误将会再次出现。 See here for reference 有趣的是,如果这是 Sheet1 [是的,所有工作表的索引 1],它将适用于任何范围大小。但任何其他工作表都会失败。

这是我原来的范围:BASE!A2:X68506,命名为 REF_ACCESS。 BASE 是我的 Sheet5。访问 2010 和 Excel 2010

我尝试了 ActivateSheet,分配给命令内部的字符串,分配给命令外部的字符串,replace(,"$","!""),没有任何效果。即使在 Office 2016 上来自朋友

如果我使用“BASE!A2:X64506”,它可以工作。如果我使用“A2:X68506”,Access 假定 Sheet1 并且可以工作。注意所有范围都没有“$”,但我想你已经知道了

我上次的测试是这样的怪物

DoCmd.TransferSpreadsheet TransferType:=acImport, SpreadsheetType:=9, TableName:="TEST", Filename:=ThisWorkbook.FullName, HasFieldNames:=False, Range:=Worksheets("BASE").Name & "!" & Replace(Left(Worksheets("BASE").Range("REF_ACCESS").Address, Len(Worksheets("BASE").Range("REF_ACCESS").Address) - 1), "$", "")

在 65536 行限制 [准确地说是 6553] 内使用我的范围的测试会起作用。确实如此。

所以我现在看到的解决方案只有两个选项。将您的范围复制到 Sheet1 或其他工作表,就像 RyanM 所做的那样,或者将您的范围划分为具有 65536 行的多个 DoCmd。

我知道它很长。抱歉,这整整 2 天都在寻找没有任何真正解决方案的答案。我希望这可以帮助其他有同样问题的人。

【讨论】:

    【解决方案2】:

    我尝试了多种方法来解决这个问题,但没有对我的代码进行重大修改,但无济于事。我确实想出了一个解决方案,但它相当耗费资源和混乱。但是,如果有人有类似的问题,我会在这里发布。我最终将我的更新表与工作簿的其余部分分离到它自己的文件中并链接该文件。这阻止了 Access 尝试链接不同的工作表并让我解决了整个 Range 问题。我知道它既不优雅也不高效,但它确实有效。如果我想出一种更清洁的方式,我会在这里发布。

     Set xl = Wb.Parent
        xl.ScreenUpdating = False
        xl.DisplayAlerts = False
        strFile = mypath & "\TempIss.xlsx"
        For i = 1 To Wb.Worksheets.count
            If InStr(1, Wb.Worksheets(i).name, "Update", vbTextCompare) > 0 Then
                tableId = i
                Exit For
            End If
        Next i
        If tableId = 0 Then
            MsgBox "This workbook does not seem to have the necessary worksheet for updating " & _
                   "the Participant Issues Log in Access.", vbInformation, "Uh oh..."
            Exit Function
        Else
            Set upWs = Wb.Worksheets(i)
            upWs.Select
            upWs.Copy
            xl.ActiveSheet.SaveAs fileName:=strFile
            xl.ActiveWorkbook.Close
            Call rmSheet(Wb, "AccessUpdate")
            xl.ScreenUpdating = True
            linkSheet = "tempIssLog"
        DoCmd.TransferSpreadsheet TransferType:=acImport, SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
                                  TableName:=linkSheet, fileName:=strFile, _
                                  HasFieldNames:=True
        Kill (strFile)
    

    【讨论】:

      【解决方案3】:

      如果范围是命名范围(在 Excel 中),请按照上述说明(HansUp 注释)。

      如果范围是在 MS-Access 中定义的,请务必传递一个字符串(类似于“A1:G12”)而不是控件名称。

      Dim StrRange as variant
      Dim NameofMySheet as string
      
      NameofMySheet = "xxxxxx"   ' <- Put here the name of your Excel Sheet
      StrRange = NameofMySheet & "!" & "A1:G12"
      
      DoCmd.TransferSpreadsheet TransferType:=acLink, SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
                                TableName:=linkSheet, fileName:=Wb.Path & "\" & Wb.name, _
                                HasFieldNames:=True, Range:= StrRange
      

      注意 1:没有引号的 StrRange!

      【讨论】:

      • 我尝试以这种方式构建一个范围,但由于某种原因,它使用的工作表与我正在处理的工作表不同。
      • 当你想指定一个工作表时,将你的 strRange 变量定义为 StrRange = "Sheet2!A1:G12",或者在你的情况下 StrRange = "Update!A1:G12"。网络礼仪:希望它对你有用。如果有效,请点赞并标记为已回答”
      • Cisco - 我尝试了这种方法并设置了 strRange = "Update!A1:Q41" 但是当我将该参数传递给 DoCmd.TransferSpreadsheet 命令时,我得到的错误是“Update$A1:Q41 " 不存在或拼写错误。
      • 1) 如果没有工作表名称,它可以工作吗? 2) Excel 工作簿中存在工作表“更新”?
      • 1) 如果没有工作表名称,它会成功使用指定的范围,但来自与我需要使用不同的工作表。 2)更新表肯定存在。我在尝试运行代码时正在查看它。因此,我发布了我相当复杂的工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2019-01-21
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多