We’ve said it before, but it’s worth repeating – linked tables can be really useful in your databases for a number of reasons. But one big drawback of linked tables is performance – running queries against them, especially if they aren’t Microsoft Access tables (i.e. if they’re Excel, CSV, or DBF files). They can be painfully s l o w to work with. There are a few ways you can work around that – we’ll work with one way here, and that’s to convert a linked table into a local table. Sure – you could do this manually by copying/pasting tables, but if you have a lot to handle, doing it in code is much, much easier, so let’s see how…
Why outlining your needs is important

“Given the name of a linked table, import that table into the database as a local table to improve performance – optionally delete the link from the database at the same time”
Normally, when you’re converting a linked table into a local table, you’ll want to delete the link, but in the code sample below we’ve given you the option to keep the original linked file too but by doing this, your newly imported table won’t replace your linked table in your queries etc, so you won’t see the performance gain that a local table would give you. Once you’re comfortable that the code is working as you need, we’d recommend always deleting the original – after all, you’re not actually deleting the actual table, just the link to it.
A word of caution
Before we get to the code – just a quick word of caution, there’s not a lot you can do if you’re linking to a damaged Access database – if Access can’t read the file, it’s highly unlikely it’ll be able to import from it.
So – on to the code…
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
What the code is doing

Now that we have those details, as long as they’re valid (i.e. you’ve not supplied a misspelt table name to the routine), then we’re set to go so it’s simply a matter of a) deleting the link (if deleteOriginal is set to True), and importing the table.
Doing this will often give you pretty dramatic improvements in performance so if you’re using linked tables, I’d highly recommend that you check what gains moving those tables to local versions will give you – you may be surprised!
Author Introduction:
Mitchell Pond is a data recovery expert in DataNumen, Inc., which is the world leader in data recovery technologies, including repair SQL Server file and excel recovery software products. For more information visit www.datanumen.com