Vi har sagt det før, men det er verdt å gjenta – koblede tabeller kan være veldig nyttige i databasene dine av en rekke årsaker. Men en stor ulempe med koblede tabeller er ytelsen – kjører spørringer mot dem, spesielt hvis de ikke er Microsoft Access-tabeller (dvs. hvis de er Excel, CSV eller DBF filer). De kan være smertefullt trege å jobbe med. Det er noen måter du kan omgå det på – vi jobber med én måte her, og det er å konvertere en koblet tabell til en lokal tabell. Jada – du kan gjøre dette manuelt ved å kopiere/lime inn tabeller, men hvis du har mye å håndtere, er det mye, mye enklere å gjøre det i kode, så la oss se hvordan...
Hvorfor det er viktig å skissere dine behov
Først av alt, la oss skissere hva vi faktisk vil at koden skal gjøre - å gjøre dette gjør det så mye enklere å faktisk lage koden i utgangspunktet, så jeg vil foreslå at du gjør dette hver gang du tenker på å lage litt VBA-kode , hjelper det med å klargjøre målet ditt:
"Gi navnet på en koblet tabell, importer den tabellen til databasen som en lokal tabell for å forbedre ytelsen - eventuelt slett koblingen fra databasen samtidig"
Normalt, når du konverterer en koblet tabell til en lokal tabell, vil du slette koblingen, men i kodeeksemplet nedenfor har vi gitt deg muligheten til å beholde den opprinnelige koblede filen også, men ved å gjøre dette, nylig importert tabell vil ikke erstatte den koblede tabellen i spørringene dine osv., så du vil ikke se ytelsesgevinsten som en lokal tabell ville gi deg. Når du er komfortabel med at koden fungerer som du trenger, anbefaler vi at du alltid sletter originalen – du sletter tross alt ikke selve tabellen, bare lenken til den.
Et ord av forsiktighet
Før vi kommer til koden – bare en rask advarsel, det er ikke mye du kan gjøre hvis du linker til en skadet Access-database – hvis Access ikke kan lese filen, er det svært usannsynlig at den vil kunne importere fra den.
Så – over til koden...
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
Hva koden gjør

Nå som vi har disse detaljene, så lenge de er gyldige (dvs. at du ikke har oppgitt et feilstavet tabellnavn til rutinen), så er vi i gang, så det er bare et spørsmål om å) slette lenken (hvis deleteOriginal er satt til True), og importerer tabellen.
Å gjøre dette vil ofte gi deg ganske dramatiske forbedringer i ytelsen, så hvis du bruker koblede tabeller, vil jeg på det sterkeste anbefale at du sjekker hvilke gevinster å flytte disse bordene til lokale versjoner – du kan bli overrasket!
Forfatterintroduksjon:
Mitchell Pond er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert reparasjon SQL Server fil og excel-programvareprodukter for gjenoppretting. For mer informasjon besøk www.datanumen. Med