Перелинковка таблиц базы данных: Access, VBA
У меня есть процедура, которая связывает все таблицы в базе данных в зависимости от того, являются ли они связанной таблицей. В настоящее время он настроен на автоматический запуск, так как он установлен внутри макроса AutoExec, который вызывает функцию.
Код работает, но только если я закрою базу данных и снова открою ее. Я знаю, что это потому, что это должно быть сделано, чтобы новые ссылки вступили в силу, но есть ли что-то вокруг этого? Или, в противном случае, было бы лучше, чтобы код VBA закрыл база данных и снова открыть ее?
Заранее спасибо за обратную связь
P.S. Вот код, если вам интересно:
'*******************************************************************
'* This module refreshes the links to any linked tables *
'*******************************************************************
'Procedure to relink tables from the Common Access Database
Public Function RefreshTableLinks() As String
On Error GoTo ErrHandler
Dim strEnvironment As String
strEnvironment = GetEnvironment
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strCon As String
Dim strBackEnd As String
Dim strMsg As String
Dim intErrorCount As Integer
Set db = CurrentDb
'Loop through the TableDefs Collection.
For Each tdf In db.TableDefs
'Verify the table is a linked table.
If Left$(tdf.Connect, 10) = ";DATABASE=" Then
'Get the existing Connection String.
strCon = Nz(tdf.Connect, "")
'Get the name of the back-end database using String Functions.
strBackEnd = Right$(strCon, (Len(strCon) - (InStrRev(strCon, "") - 1)))
'Debug.Print strBackEnd
'Verify we have a value for the back-end
If Len(strBackEnd & "") > 0 Then
'Set a reference to the TableDef Object.
Set tdf = db.TableDefs(tdf.Name)
If strBackEnd = "Common Shares_Data.mdb" Or strBackEnd = "Adverse Events.mdb" Then
'Build the new Connection Property Value - below needs to be changed to a constant
tdf.Connect = ";DATABASE=" & strEnvironment & strBackEnd
Else
tdf.Connect = ";DATABASE=" & CurrentProject.Path & strBackEnd
End If
'Refresh the table links
tdf.RefreshLink
End If
End If
Next tdf
ErrHandler:
If Err.Number <> 0 Then
'Create a message box with the error number and description
MsgBox ("Error Number: " & Err.Number & vbCrLf & _
"Error Description: " & Err.Description & vbCrLf)
End If
End Function
EDIT
Следуя комментариям Гордса, я добавил метод macro AutoExec для вызова кода ниже. Кто-нибудь видит в этом проблему?
Action: RunCode
Function Name: RefreshTableLinks()
1 ответ:
Самая распространенная ошибка в этой ситуации-это забывание
.RefreshLinkTableDef, но вы уже делаете это. Я только что протестировал следующий код VBA, который переключает связанную таблицу с именем [Products_linked] между двумя бэкенд-файлами доступа:Products_EN.accdb(английский) иProducts_FR.accdb(французский). Если я запускаю код VBA, а затем сразу открываю связанную таблицу, я вижу, что изменение произошло; мне не нужно закрывать и повторно открывать базу данных.Function ToggleLinkTest() Dim cdb As DAO.Database, tbd As DAO.TableDef Set cdb = CurrentDb Set tbd = cdb.TableDefs("Products_linked") If tbd.Connect Like "*_EN*" Then tbd.Connect = Replace(tbd.Connect, "_EN", "_FR", 1, 1, vbBinaryCompare) Else tbd.Connect = Replace(tbd.Connect, "_FR", "_EN", 1, 1, vbBinaryCompare) End If tbd.RefreshLink Set tbd = Nothing Set cdb = Nothing End FunctionЯ даже протестировал вызов этого кода из AutoExec макрос и он также, кажется, работает, как и ожидалось.
Одна вещь, которую вы можете попробовать, - это позвонитьdb.TableDefs.Refreshпрямо в конце вашей процедуры, чтобы посмотреть, поможет ли это.Edit
Проблема здесь заключалась в том, что база данных имела "форму отображения", указанную в ее "параметрах приложения", и эта форма, по-видимому, открывается автоматически раньше запускается макрос AutoExec. Перемещение вызова функции для повторного связывания кода в обработчик событий Form_Load для этой" формы запуска " выглядит как вероятно, исправить.
Comments