Мы уже говорили об этом раньше, но стоит повторить — связанные таблицы могут быть действительно полезны в ваших базах данных по ряду причин. Но одним большим недостатком связанных таблиц является производительность — выполнение запросов к ним, особенно если они не являются таблицами 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) и импорт таблицы.
Это часто приводит к значительному повышению производительности, поэтому, если вы используете связанные таблицы, я настоятельно рекомендую вам проверить, какие выгоды даст вам перемещение этих таблиц в локальные версии — вы можете быть удивлены!
Об авторе:
Митчелл Понд — эксперт по восстановлению данных в DataNumen, Inc., которая является мировым лидером в области технологий восстановления данных, включая ремонт SQL Server файл и программные продукты для восстановления Excel. Для получения дополнительной информации посетите www.datanumen.com