Verlinkte Access Datenbanken umziehen lassen
Ich muss gelegentlich eine Access-Datenbank umziehen lassen, die auf diverse verlinkte Datenbanken zugreift (um das 2 GB Maximum zu umgehen). Da die Verlinkungen absolut sind und nicht relativ, muss man jede Verlinkung nach dem Umzug manuell anpassen, was bei mehr als 100 Tabellen mühselig und fehlerträchtig ist. Basierend auf Code von Stackexchange/Stackoverflow habe ich daher ein paar Hilfsfunktionen gebaut, die den Umzug deutlich vereinfachen. Die Annahme
Der Code besteht aus mehreren Funktionen:
getDatabaseName()
extrahiert den Namen der Datenbank aus dem PfadGetFolder()
verlinkeTabellenNeu()
biegt die Links auf die Datenbankdateien um
fragt beim Nutzer den Pfad ab, in dem die neuen Datenbank-Dateien liegen.
Hinweis: Es empfiehlt sich nach Abschluss ein Auslesen aller Verlinkungen und Abgleichen z.B. in Excel, um auf Nummer sicher gehen zu können, dass alle Verlinkungen erfolgreich waren. Zum Auslesen der Verlinkungen kann man den Code unten am Ende des Artikels nutzen.
Option Compare Database Function getDatabaseName(currentPath As String) ' Uwe Ziegenhagen, 2017-11-03 ' Extrahiert den Namen der Datenbank aus dem Pfad, ' wertet dazu die Position des letzten "\" aus: ' von innen nach außen: ' kehre String um ' finde den letzten Backslash ' nimm den substring bis zum letzten Backslash ' reverse diesen Substring wieder getDatabaseName = StrReverse(Left(StrReverse(currentPath), InStr(StrReverse(currentPath), "\") - 1)) End Function Function GetFolder() As String ' https://stackoverflow.com/questions/26392482/vba-excel-to-prompt-user-response-to-select-folder-and-return-the-path-as-string ' based on https://www.ozgrid.com/forum/forum/help-forums/excel-general/126180-getfolder-function?t=182343 ' requires references to Microsoft Office xx.0 Object library Dim fldr As FileDialog Dim sItem As String Set fldr = Application.FileDialog(msoFileDialogFolderPicker) With fldr .Title = "Select a Folder" .AllowMultiSelect = False '.InitialFileName = Application.DefaultFilePath If .Show <> -1 Then GoTo NextCode sItem = .SelectedItems(1) End With NextCode: GetFolder = sItem Set fldr = Nothing End Function Sub verlinkeTabellenNeu() ' Uwe Ziegenhagen, 2017-11-03 ' Ruft vom User einen Pfad ab und verlinkt alle Tabellen mit diesem Pfad neu ' based on code from https://stackoverflow.com/questions/4928134/changing-linked-table-location-programatically ordnerNeu = GetFolder() Dim dbs As DAO.Database Dim tdf As DAO.TableDef Set dbs = CurrentDb() With dbs For Each tdf In .TableDefs 'Is the table a linked table? If tdf.Attributes And dbAttachedODBC Or tdf.Attributes And dbAttachedTable Then With tdf oldPath = .Properties("Connect").Value .Connect = ";DATABASE=" & ordnerNeu & "\" & getDatabaseName(.Properties("Connect").Value) .RefreshLink Debug.Print oldPath & "@@@" & .Properties("Connect").Value End With End If Next tdf End With End Sub |
Code zum Auslesen der Verlinkungen
Sub LinkedTableConnection() ' http://p2p.wrox.com/access-vba/37117-finding-linked-tables.html Dim dbs As DAO.Database Dim tdf As DAO.TableDef Set dbs = CurrentDb() With dbs For Each tdf In .TableDefs 'Is the table a linked table? If tdf.Attributes And dbAttachedODBC Or tdf.Attributes And dbAttachedTable Then With tdf ' Connect property contains path of link ' Debug.Print "Connect Property of " & .Name & " is: " & .Properties("Connect").Value Debug.Print "kompletter Pfad: " & tdf.Connect ' Debug.Print "Name der Datenbank: " & getDatabaseName(.Properties("Connect").Value) End With End If Next tdf End With End Sub |