在VBA中更改tabledef .connect属性

use*_*270 4 excel ms-access vba excel-vba access-vba

我正在尝试做一些我做了一百次的事情,但它突然无法奏效.

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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否与我们最近更新到Excel 2010并且db仍然是ACCESS 2003这一事实有关,但这应该是一小段代码才能运行.运行上面的代码时没有任何反应.该文件以正确的方式打开,但连接字符串永远不会被分配给表def对象,即.它运行时没有错误,但表没有链接到新数据库.我发现以下代码确实有效,并使用它来解决问题.我仍然很好奇为什么我不能在样式'application.currentdb.tabledef("TABLE").connect'中为.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 
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助,您可以提供.

小智 8

我遇到了类似的问题.当试图直接通过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
Run Code Online (Sandbox Code Playgroud)

坏:

CurrentDb.TableDefs("foo").Connect = "New connection string"
CurrentDb.TableDefs("foo").RefreshLink
Run Code Online (Sandbox Code Playgroud)

  • 每次引用CurrentDB时,它都是一个新实例. (5认同)