我们之前已经说过,但值得重复 - 出于多种原因,链接表在您的数据库中非常有用。 但是链接表的一大缺点是性能——对它们运行查询,特别是如果它们不是 Microsoft Access 表(即如果它们是 Excel、CSV 或 DBF 文件)。 与他们一起工作可能会非常缓慢。 有几种方法可以解决这个问题——我们将在这里使用一种方法,那就是将链接表转换为本地表。 当然——您可以通过复制/粘贴表格手动完成此操作,但如果您有很多事情要处理,用代码完成会容易得多,所以让我们看看如何……
为什么概述您的需求很重要
首先,让我们概述一下我们实际想要代码做什么——这样做可以让一开始就更容易实际创建代码,所以我建议您每次考虑创建一些 VBA 代码时都这样做,它有助于阐明您的目标:
“给定链接表的名称,将该表作为本地表导入数据库以提高性能——可选择同时从数据库中删除链接”
通常,当您将链接表转换为本地表时,您会希望删除链接,但在下面的代码示例中,我们为您提供了保留原始链接文件的选项,但这样做,您的新导入的表不会在您的查询等中替换您的链接表,因此您不会看到本地表会给您带来的性能提升。 一旦您对代码按需要工作感到满意,我们建议您始终删除原始代码——毕竟,您实际上并没有删除实际的表格,只是删除了它的链接。
一个忠告
在我们开始编写代码之前 - 快速提醒一下,如果您要链接到 损坏的Access数据库 – 如果 Access 无法读取该文件,则它不太可能从中导入。
所以 - 关于代码......
Sub MakeTableLocal(tableName As String, optional deleteOriginal As Boolean = True)
Dim DbPath As Variant, TblName As Variant
'get path of linked table
DbPath = DLookup("Database", "MSysObjects", "Name='" & tableName & "' And Type=6")
'Get the real name of the linked table (in case it has been given an alias in the link)
TblName = DLookup("ForeignName", "MSysObjects", "Name='" & tableName & "' And Type=6")
If IsNull(DbPath) Then
'Either a local table, or the wrong table name has been supplied, exit the sub
Exit Sub
End If
'delete linked table
If deleteOriginal Then
DoCmd.DeleteObject acTable, tableName
Else
'If we're not deleting the existing table we'll have to rename the imported table to avoid
'overwriting it etc
tableName = tableName & " - local"
End If
'import the table as a local, unlinked table
DoCmd.TransferDatabase acImport, "Microsoft Access", DbPath, acTable, TblName, tableName
End Sub
代码在做什么

现在我们有了这些细节,只要它们是有效的(即您没有向例程提供拼写错误的表名),那么我们就可以开始了,所以这只是一个问题)删除链接(如果deleteOriginal 设置为 True),并导入表。
这样做通常会给您带来相当显着的性能改进,因此如果您使用链接表,我强烈建议您检查将这些表移动到本地版本会给您带来什么好处——您可能会感到惊讶!
作者简介:
Mitchell Pond 是一位数据恢复专家 DataNumen, Inc.,它是数据恢复技术领域的世界领先者,包括 修复 SQL Server 文件 和 excel 恢复软件产品。 欲了解更多信息,请访问 datanumen.com