访问VBA无法识别Excel电子表格中的范围

时间:2016-02-09 16:28:32

标签: vba ms-access access-vba

使用DoCmd.TransferSpreadsheet方法,我的时间最令人沮丧。我有一个包含多个工作表的工作簿,用户正在更新数据,我有一个脚本,将所有记录放回一个工作表,链接电子表格,并更新Access数据库中的数据。我的问题在于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.

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

我试图从Excel方面做同样的事情并遇到同样的问题。访问切换纸张分隔符"!" for" $"

我发现这是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 Former Access MVP(2008-2010)的帮助下[见他的最后一篇文章]

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

这是我原来的范围:BASE!A2:X68506,名为REF_ACCESS。 BASE是我的Sheet5。 Access 2010& Excel 2010

我尝试了ActivateSheet,分配给命令中的字符串,分配给字符串外部命令,替换(," $","!""),没有任何效果。甚至在朋友的Office 2016上

如果我使用" BASE!A2:X 64506 ",它可以使用。如果我使用" A2: X68506 ",则访问假定 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所做的那样),或将您的范围除以多个DoCmd中的65536行。

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

答案 1 :(得分:0)

如果范围是命名范围(在Excel中),请按照上面的说明(HansUp评论)。

如果在MS-Access中定义了范围,请确保传递一个字符串(例如" A1:G12"),而不是控制名称。

<ListBox.Style>
    <Style TargetType="ListBox">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="Transparent"/>
        </Style.Resources>
    </Style>
</ListBox.Style>

注1:没有引号的StrRange!

答案 2 :(得分:0)

我尝试了多种方法来解决这个问题,但没有对我的代码进行重大修改,但没有用。我确实提出了一个解决方案,但它相当资源密集和混乱。但是,如果有人有类似的问题,我会在这里发布。我最后将更新表分离到了工作簿的其余部分并链接了该文件。这阻止了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)