Изменение свойства tabledef .connect в VBA - PullRequest
4 голосов
/ 06 декабря 2011

Я пытаюсь сделать то, что делал сотню раз, но вдруг это не сработает.

acc.AutomationSecurity = msoAutomationSecurityLow   'Remove Security Prompt
acc.OpenCurrentDatabase path & "Year " & Range("yr") & "\" & Range("yr") & Range("mo") & "\Year " & Range("yr") & Range("mo") & " GENERIC DB NAME.mdb", True

'update link
acc.CurrentDb.TableDefs("TABLE NAME").Connect = "MS Access;DATABASE=" & path & "Year " & Range("yr") & "\" & Range("yr") & Range("mo") & "\Year " & Range("yr") & Range("mo") & " OTHER DB.mdb"
acc.CurrentDb.TableDefs("TABLE NAME").RefreshLink

Я не знаю, связано ли это с тем фактом, что мы недавно обновились до Excel 2010, а база данных по-прежнему ACCESS 2003, но это должен быть простой код для запуска.Ничего не происходит, когда я запускаю приведенный выше код.Файл открывается правильно, но строка соединения никогда не присваивается объекту таблицы def, т.е.Он работает без ошибок, но таблица не связана с новой базой данных.Я обнаружил, что следующий код работает, и использовал его, чтобы обойти проблему.Мне все еще любопытно, почему я не могу присвоить значение свойству .connect в стиле 'application.currentdb.tabledef ("TABLE"). Connect ", но если я назначу currentdb новому объекту базы данных, я смогу.

Так что я не знаю почему, но если я использую это, это работает

dim db as DAO.database
set db = acc.CurrentDb
db.TableDefs("TABLE NAME").Connect = "MS Access;DATABASE=" & path & "Year " & Range("yr") & "\" & Range("yr") & Range("mo") & "\Year " & Range("yr") & Range("mo") & " OTHER DB.mdb" 
db.TableDefs("TABLE NAME").RefreshLink 

Спасибо за любую помощь, которую вы можете предоставить.

1 Ответ

8 голосов
/ 12 сентября 2012

Я столкнулся с подобной проблемой.При попытке сделать это напрямую через CurrentDb (то есть CurrentDb.TableDefs("foo").Connect) не сработало и не выдало ошибку.

Причина в том, что каждый раз, когда вы ссылаетесь на CurrentDB, этоновый экземпляр.

Во втором методе вы создали объект базы данных, для которого установлен CurrentDb, и это ваш второй метод работает.

Короче говоря: Хорошо:

Dim Db as Database
Set Db = CurrentDb
Db.TableDefs("foo").Connect = "New connection string"
Db.TableDefs("foo").RefreshLink

Плохо:

CurrentDb.TableDefs("foo").Connect = "New connection string"
CurrentDb.TableDefs("foo").RefreshLink
...