Access交流中心

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

关于TransferDatabase命令问题

BaoChengReng  发表于:2014-08-07 11:23:41  
复制

有A,B两个库,而且知道A库对象的文件名,我在B库中操作,从A库将对象文件sOld导入B库成为sVx

DoCmd.TransferDatabase acImport, "Microsoft Access", A库, acReport, sOld, sVx, False

再将sVx导出至A库,文件名为sNew

DoCmd.TransferDatabase acExport, "Microsoft Access", A库, acReport, sVx, sNew, False
结果报错:运行错误'2501'
这个TransferDatabase操作被取消。
请高手赐教这里问题所在?

 

Top
竹笛 发表于:2014-08-07 11:27:12
上传你的例子看看

BaoChengReng 发表于:2014-08-07 13:05:17
竹笛版主:
因为这个例子尚未成型,我把要点再次描述如下
关于TransferDatabase问题
原则是两个库,在本地库操作对外部库的对象进行维护
我的初衷是在删除外部库对象前先将它改名,也就是原来对象名称=RP报价,拟将其改为=aaRP报价,如果这个对象有用,则将它的名字改回来,
否则,对冠以aa的对象就可以放心可以删除。但是DoCmd。Rename命令只有在本地库有用,于是想一个笨办法:
1.将这个RP报价从外部库改名为LsTem导入到本地库,作为临时文件改名目的是避免与本地库的对象文件冲突。
  If Not IsNull(DLookup("Name", "MSysObjects", "Name='LsTem' And Type=-32764")) Then DoCmd.DeleteObject acReport, LsTem
  DoCmd.TransferDatabase acImport, "Microsoft Access", 外部库路径, acReport, RP报价, LsTem, False
2.将这个LsTem文件改名导出至外部库
  DoCmd.TransferDatabase acExport, "Microsoft Access", 外部库路径, acReport, LsTem, aaRP报价, False
  If Not IsNull(DLookup("Name", "MSysObjects", "Name='LsTem' And Type=-32764")) Then DoCmd.DeleteObject acReport, LsTem
3.将外部库这个名为RP报价的文件删除
  Set appAccess = CreateObject("Access.Application")
  appAccess.OpenCurrentDatabase 外部库路径
  appAccess.Application.Visible = False
  appAccess.DoCmd.DeleteObject acReport, RP报价
  appAccess.Quit
  Set appAccess = Nothing
操作时报错
结果报错:运行错误'2501'
这个TransferDatabase操作被取消。
请教这里有什么问题吗?
另外:当本地库关闭后发现外部库没有关闭,此时外部库.ldb及外部库.mdb不能打开、删除或者从USB中拷贝进行覆盖。
只有当电脑重新启动后,这个外部库.ldb也消失了,外部库可以打开。
如果有外部库文件直接改名的命令就不那么费事了。也许我的这个思路毫无实际意义,只是好奇。



cspa 发表于:2014-08-07 13:57:06

直接在第3步,在外部数据库加一句 appAccess.DoCmd.Rename ... 改名不就完了。如:

 Set appAccess = CreateObject("Access.Application")
  appAccess.OpenCurrentDatabase 外部库路径
  appAccess.Application.Visible = False
  appAccess.DoCmd.Rename "老报表名", acReport, "新报表名"
  appAccess.Quit
  Set appAccess = Nothing

 



BaoChengReng 发表于:2014-08-07 14:53:50
3楼,您的办法很简单,按照您的建议,修改如下
这里对象名称 sNew=“aa” & sOld
      Dim appAccess As Object
      Set appAccess = CreateObject("Access.Application")
      appAccess.OpenCurrentDatabase strPath
      appAccess.Application.Visible = False
      If lngType = 1 Then appAccess.DoCmd.Rename sOld, acTable, sNew
      If lngType = -32768 Then appAccess.DoCmd.Rename sOld, acForm, sNew
      If lngType = -32764 Then appAccess.DoCmd.Rename sOld, acReport, sNew
      If lngType = -32761 Then appAccess.DoCmd.Rename sOld, acModule, sNew
      If lngType = -32766 Then appAccess.DoCmd.Rename sOld, acMacro, sNew
      If lngType = 5 Then appAccess.DoCmd.Rename sOld, acQuery, sNew
      appAccess.Quit
      Set appAccess = Nothing
但运行后报错如下:
运行错误 '7874'
外部库(strPath) 不能找到对象 sNew



BaoChengReng 发表于:2014-08-07 15:02:43


BaoChengReng 发表于:2014-08-07 15:12:44
3楼:补充说明,报错时如上图,此时看到外部库FM03Local.ldb及FM03Local.mdb,虽然我已关闭本地库,但不能打开这个外部库,好像要重启电脑才能恢复。

cspa 发表于:2014-08-07 15:49:39

不好意思,我写给你的语法错了,重命名语句应为:

appAccess.DoCmd.Rename "报表名", acReport, "报表名"

写颠倒了

另外,因为你是报错后直接关闭了本地库,程序运行到出错位置语句就退出了,所以外部数据库此时还没关闭。正确的做法是,出现错误提示后,按调试键进入代码界面,鼠标放在显示为黄*色的语句最左侧,按下并向下拖动一个语句,再按F9键,让程序运行完后面的语句特别是

     appAccess.Quit
      Set appAccess = Nothing

这2句。外部数据库就关闭了。此时即可正常打开,不用重启电脑了。

关于错误,你可看看外部库中是否有错误中说的名称为“不能找到的对象”,多半是外部库中没有以该名称命名的对象。



BaoChengReng 发表于:2014-08-07 16:22:31

7楼谢谢您,我已试过成功了,您的语句程序很简短,我想再请教一个问题,

appAccess.DoCmd.Rename sNew, acTable, sOld

上面sNew, acTable, sOld可以用变量吗?怎么写,谢谢。




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