Перелинковка таблиц базы данных: 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()
819   1  

1 ответ:

Самая распространенная ошибка в этой ситуации-это забывание .RefreshLink TableDef, но вы уже делаете это. Я только что протестировал следующий код 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

    Ничего не найдено.