1

我有一个链接表,tblREDEIMPORT它设置为一个特定路径,该路径只能通过 FSO 导入过程以编程方式访问,它会覆盖前一天的版本。

但是,虽然 .xls 链接文件的名称始终相同,但它所在的工作表名称每天都在变化,给我一个错误,例如215380_REDEFILEIMPORTREPORT_230$不是有效名称,因为那是昨天的工作表名称,今天的工作表名称完全不同之前和之后的一组数字。

通过链接表管理器,我无法将链接表指向除该表之外的任何内容。如何更改链接表路径以始终查看工作簿中的第一个(也是唯一一个)电子表格,或者至少将其更改为将名称动态更新为它应该指向的工作表?

4

1 回答 1

4

作为替代方案,DoCmd.TransferSpreadsheet acLink, ...您可以简单地“克隆”现有TableDef对象,调整.SourceTableName属性,并将更新的TableDef对象替换为现有对象。这种方法的优点是可以保留现有文件位置、Excel 文档类型等,从而避免将这些值硬编码到DoCmd.TransferSpreadsheet语句中的诱惑。

例如,我在 Access 中有一个名为 [LinkedTableInExcel] 的链接表,它指向OldSheetName在 Excel 文档中命名的工作表。DCount()我可以通过使用VBA 即时窗口中的表达式来验证链接表是否正常工作

?DCount("*","LinkedTableInExcel")
 2 

现在,如果我在 Excel 中打开文档并将工作表名称更改为NewSheetNameAccess 中的链接表将停止工作

BadSheetName.png

但是,我可以按如下方式更新链接表

Sub UpdateExcelLinkedTable()
Dim cdb As DAO.Database
Dim tbd As DAO.TableDef, tbdNew As DAO.TableDef
Dim n As Long
Const LinkedTableName = "LinkedTableInExcel"
Set cdb = CurrentDb

Set tbd = cdb.TableDefs(LinkedTableName)
Debug.Print "Current .SourceTableName is: " & tbd.SourceTableName
On Error Resume Next
n = DCount("*", LinkedTableName)
Debug.Print "The linked table is " & IIf(Err.Number = 0, "", "NOT ") & "working."
On Error GoTo 0

Set tbdNew = New DAO.TableDef
tbdNew.Name = tbd.Name
tbdNew.Connect = tbd.Connect
tbdNew.SourceTableName = "NewSheetName$"
Set tbd = Nothing
cdb.TableDefs.Delete LinkedTableName
cdb.TableDefs.Append tbdNew
Set tbdNew = Nothing

Set tbd = cdb.TableDefs(LinkedTableName)
Debug.Print "Updated .SourceTableName is: " & tbd.SourceTableName
On Error Resume Next
n = DCount("*", LinkedTableName)
Debug.Print "The linked table is " & IIf(Err.Number = 0, "", "NOT ") & "working."
On Error GoTo 0

Set tbd = Nothing
Set cdb = Nothing
End Sub

结果:

Current .SourceTableName is: OldSheetName$
The linked table is NOT working.
Updated .SourceTableName is: NewSheetName$
The linked table is working.
于 2013-10-27T10:28:43.190 回答