使用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.
我似乎无法理解为什么它用美元符号代替爆炸。任何其他帮助理解如何指定范围也将不胜感激。
谢谢!
答案 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)