#vba #ms-access #dao
Вопрос:
Я работаю над созданием базы данных с поздней привязкой, чтобы при открытии интерфейса у пользователей с другой версией MS Office не возникало проблем. Я продолжаю получать ошибку 438 во время выполнения (объект не поддерживает эти свойства или метод) в этом коде, в строке с. For Each tdf In dbs.TableDefs
Я не вижу, что здесь происходит не так. Все заявлено, и он должен это найти. Может ли кто-нибудь указать, что может произойти?
Function RelinkTables()
On Error GoTo EndFast
'Routine to relink the tables automatically. Change the constant LnkDataBase to the desired one and run the sub
'DB front end could be used in 2 or more locations with different backends.
Dim dbs As Object
#If VBA7 Then
Set dbs = CreateObject("DAO.DBEngine.120")
#Else
Set dbs = CreateObject("DAO.DBEngine.36")
#End If
' Dim dbs As DAO.Database
' Set dbs = CurrentDb
Dim tdf As Object
'Dim tdf As DAO.TableDef
Dim strTable As String
Dim strLocation As String
'Abandon relinking if file is development version
If VBA.InStr(1, VBA.UCase(GetNamePath), "_DEV") > 0 Then Exit Function
'Get the Path of the Document and form backend name
strLocation = GetFolderFromPath(GetNamePath)
strLocation = FormBackendName(strLocation)
'Go about relinking
For Each tdf In dbs.TableDefs
If VBA.Len(tdf.Connect) > 1 Then 'Only relink linked tables
'If tdf.Connect <> ";DATABASE=" amp; LnkDataBaseDubai Then 'only relink tables if the are not linked right '' With PW, Access wont relink, even when the PW is Correct. MUST RELINK!
If VBA.Left(tdf.Connect, 4) <> "ODBC" Then 'Don't want to relink any ODBC tables
strTable = tdf.Name
'dbs.TableDefs(strTable).Connect = ";DATABASE=" amp; strLocation amp; ";PWD=" amp; DatenbankPW 'With password
dbs.TableDefs(strTable).Connect = ";DATABASE=" amp; strLocation amp; ";" 'Without password
dbs.TableDefs(strTable).RefreshLink
End If
'End If
End If
Next tdf
dbs.Close
Exit Function
EndFast:
On Error GoTo 0
MsgBox "The backend database was not found. Without the backend this database does not work." amp; vbCrLf _
amp; "" amp; vbCrLf _
amp; "Ensure that an Access Backend DB is located in the a subfolder called: ""_Sources"" and that read and write permission for the folder are granted." amp; vbCrLf _
amp; "" amp; vbCrLf _
amp; "Contact the developer if further support is needed.", vbOKOnly Or vbExclamation Or vbSystemModal Or vbMsgBoxSetForeground, "Database backend not found"
End Function
Ответ №1:
Вам действительно нужно открыть базу данных, если вы хотите использовать таблицы.
Вы настроили dbs
быть ядром базы данных, а не базой данных.
Если вы хотите, чтобы это была текущая база данных, просто установите ее как таковую, ранняя привязка не требуется:
Dim dbs As Object
Set dbs = CurrentDb
В противном случае откройте базу данных:
Dim dbs As Object
Dim dbe As Object
#If VBA7 Then
Set dbe = CreateObject("DAO.DBEngine.120")
#Else
Set dbe = CreateObject("DAO.DBEngine.36")
#End If
Set dbs = dbe.OpenDatabase("C:Some database.mdb")
' Must be mdb since DAO.DBEngine.36 doesn't support accdb
Ответ №2:
Доступ больше не требует ссылки на библиотеку DAO (начиная с Access 2007, библиотека DAO встроена). поэтому УДАЛИТЕ ссылку на dao. Вам это не нужно, и поздняя привязка НЕ поможет и не изменит проблему с неработающей ссылкой.
Итак, вы заметите, что ссылки теперь это:
Вы не можете удалить ссылку на механизм обработки данных ACE, но вы ДЕЙСТВИТЕЛЬНО хотите убедиться, что не ссылаетесь на библиотеку объектов DAO.
Вы ссылаетесь на DAO ТОЛЬКО в том случае, если используете базу данных до 2007 года, а ТАКЖЕ если вы НЕ используете ACE и используете файл mdb.
Для accDB и access 2007 и далее?
Команда Access теперь владеет DAO для доступа, и теперь они НЕ обновляют и не поддерживают внешнюю библиотеку DAO. НЕ ссылаться на библиотеку DAO.
Итак, DAO теперь встроен в Access. (но да, теперь вам нужно обратиться к механизму обработки данных ACE)
Однако, ДАЖЕ с учетом приведенных выше ссылок, вы можете и должны иметь привычку ссылаться на DAO в своем коде, поскольку это не только хорошая привычка, но и дает вам интеллектуальный смысл в качестве бонуса.
Хорошая идея, чтобы в ваших модулях кода была указана опция.
Таким образом, не нужно поздно привязывать DAO, так как вам больше не нужна ссылка на DAO!!
Комментарии:
1. Я действительно постоянно ссылаюсь на DAO и использую опцию Явно во всем, что делаю. Спасибо вам за достоверную информацию!
2. Как уже отмечалось, начиная с 2007 года у вас больше нет и не требуется ссылка на DAO — теперь она является частью движка ACE. Если у вас есть ссылка на DAO, удалите ее — она больше не требуется. Даже если ссылка DAO удалена, вы можете использовать объекты DAO — теперь они являются частью продукта Access.