Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

链接表语句

BaoChengReng  发表于:2014-08-05 13:11:22  
复制

如果有3个库,dbA,dbB,dbC

打开本地库dbB时进行操作,将dbA的表Tab1链接到dbB的语句如下

DoCmd.TransferDatabase acLink, "Microsoft Access", dbA, acTable, Tab1, Tab1
那么,同样在dbB下操作,把dbA的表Tab1链接到dbC,那么VBA语句如何写,请高手赐教,谢谢!

 

Top
金宇 发表于:2014-08-05 13:51:27

因为TransferDatabase方法中只能指定导入、导出或链接数据的数据库的完整名称(包括路径),如果当前打开的数据库并不是需要直接导出或者导入的话就不能通过一句代码就能实现,在dbB下操作,把dbA的表Tab1链接到dbC,可以分成三部实现

1、先将把dbA的表Tab1链接至dbB中

DoCmd.TransferDatabase acLink, "Microsoft Access", dbA, acTable, Tab1, Tab1

2、再把dbB中的链接表Tab1再导出至dbC

DoCmd.TransferDatabase acExport, "Microsoft Access", dbC, acTable, Tab1, Tab1

3、然后再删除dbB中的链接表Tab1

DoCmd.DeleteObject acTable, "Tab1"



cspa 发表于:2014-08-05 15:01:13

Sub subLinkTableObj()
'在dbB(本地库)的模块中建立此函数
Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")                                                                             '设置access对象
appAccess.OpenCurrentDatabase "D:\dbC.mdb"                                                                                    '打开含有要链接的表的数据库(含全路径)
appAccess.Application.Visible = False                                                                                                    '不显示打开的数据库
appAccess.DoCmd.TransferDatabase acLink, "Microsoft Access", "D:\dbA.mdb", acTable, "Tab1", "Tab1"        '链接语句
appAccess.Quit                                                                                                                                  '关闭并退出打开的数据库
Set appAccess = Nothing                                                                                                                    '释放内存
End Sub



金宇 发表于:2014-08-05 16:48:40
cspa的方法更好。

BaoChengReng 发表于:2014-08-05 19:07:54

cspa的方法我尚未试验,不知道2003能否适用。1楼金宇先生的方法我已试过,没问题,但是反过来要删除链接表,我用下面语句

Set dbs = DBEngine(0).OpenDatabase(dbC, False, False)
For Each tdf In dbs.TableDefs
      If tdf.name =Tab1 Then dbs.Execute "DROP TABLE " &Tab1 & ";"
Next tdf

或者

For Each tdf In dbs.TableDefs
     If tdf.name =Tab1 Then dbs.TableDefs.Delete Tab1
Next tdf

都不成功,那儿有问题?请各位赐教。




BaoChengReng 发表于:2014-08-05 21:15:33
2楼的方法比较简单,但我不会建函数,就直接在程序中使用。

金宇 发表于:2014-08-06 09:26:59
如果Tab1是变量的话
    Dim dbs As Object
    Dim tdf As TableDef
    Set dbs = CurrentDb
    For Each tdf In dbs.TableDefs
        If tdf.Name = Tab1 Then dbs.Execute "DROP TABLE "& Tab1 &";"
    Next tdf
如果Tab1直接是表名称的话

      If tdf.Name = "Tab1" Then dbs.Execute "DROP TABLE Tab1"


其实有简单的方法,如果只是针对单个表
CurrentDb.Execute "drop table 仓库表"  ‘删除单个表



BaoChengReng 发表于:2014-08-06 12:57:11
6楼金宇的方法很简单,但我的问题前提是有dbA,dbB,dbC三个库(还包括dbA中Tab1链接表的原来地址dbX),
我在B库中操作,将dbA库的链接表Tab1(本身是链接表)导出到dbC库,
而且也是链接表,按照2楼cspa方法(详见上面)可以实现,
Set appAccess = CreateObject("Access.Application")                                                                            
appAccess.OpenCurrentDatabase dbX(dbA中Tab1链接表本身的库名不是dbA)
appAccess.Application.Visible = False                                                         
appAccess.DoCmd.TransferDatabase acLink, "Microsoft Access", dbX, acTable, "Tab1", "Tab1"       
appAccess.Quit                                 
Set appAccess = Nothing                                       
因为加了appAccess.Application.Visible = False  语句,打开dbA库时就不会显示,很好。
然后我还要在dbB库操作,将dbC库的链接表删除(即撤销链接),我还是用的cspa前几天提供的方法,
这里dbA,dbB,dbC数据库是全路径的
Sub subDelacObj()
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase dbC
appAccess.DoCmd.DeleteObject acTable, Tab1
End Sub
(说明我开始用的是dbA,因为这些表本来就是dbA上的链接表表,结果什么也没有删除,
也不能用dbX,后来想明白了,因为这些表是由dbX链接到dbC的,所以从dbC直接删除就行,运行结果链接表就删除了)


总记录:7篇  页次:1/1 9 1 :