Office中国论坛/Access中国论坛

标题: 麻烦自找——浅谈Access组件的导出 [打印本页]

作者: roych    时间: 2011-6-25 01:51
标题: 麻烦自找——浅谈Access组件的导出
本帖最后由 roych 于 2015-1-31 16:01 编辑

       一直以为只有我们怕麻烦,后来才知道外国人更怕麻烦,不信且看:“Don't trouble troubles until trouble troubles you”,里面就有4个麻烦(trouble),够麻烦了吧?虽说怕归怕,但现实还是要面对的。例如,导出数据库组件就是一件很麻烦的事情。当然,聪明的版友如你,可能直接就说了,直接复制出来作为备份不就行了嘛?这不是自找麻烦吗?

      这句话说得好。不过我还是想先说说背景:数据库是其它部门某个前辈开发的,或许因为安全的缘故,用Shell指定了工作组打开软件。然而几经辗转,也不知道是版本(源文件是Office 2002版本)  还是因为工作组的缘故,只能在指定的某台电脑打开。而目前公司开始装2010……现在大家知道为什么只能导出了吧?

       关于导出,用系统自带的导出命令不是不可以,不过五十几张表,再加五十几个查询,再加五十几个窗体,加上十几个宏和三四个模块,虽说不多,老是点着鼠标也不太愉快,而且更加麻烦的是,一旦点错了,很可能某个表没导出,逐个对比起来,想来也不轻松吧?因此只好写一个模块来执行,跟大家温习一下DoCmd.TransferDatabase的用法。

  1. Sub test()
  2. '需要引用DAO 3.6库
  3. Dim db As dao.Database
  4. Set db = CurrentDb
  5. '导出表
  6. For Each tbl In db.TableDefs
  7. '系统表不导出(嗯,如果删除If语句将出错)。
  8. If Not tbl.Name Like "msys*" Then
  9. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acTable, tbl.Name, tbl.Name
  10. End If
  11. Next
  12. '导出查询
  13. For Each qry In db.QueryDefs
  14. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acQuery, qry.Name, qry.Name
  15. Next
  16. '导出窗体
  17. For Each frm In CurrentProject.AllForms
  18. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acForm, frm.Name, frm.Name
  19. Next frm
  20. '导出宏
  21. For Each mcr In CurrentProject.AllMacros
  22. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acMacro, mcr.Name, mcr.Name
  23. Next mcr
  24. '导出报表
  25. For Each rpt In CurrentProject.AllReports
  26. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acReport, rpt.Name, rpt.Name
  27. Next rpt
  28. '导出模块
  29. For Each mdl In CurrentProject.AllModules
  30. DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentProject.Path & "\test.mdb", acModule, mdl.Name, mdl.Name
  31. Next mdl
  32. End Sub
复制代码
      在即将被导出的数据库中新建一个模块,把上面代码复制进去执行即可。——可能有版友会觉得,这样会不会把这个模块也导进去了?这个放心就是了,这是正在执行的模块,是不会被导入的。此外,值得留意的是,表和查询,跟窗体等其它组件是分属不同的集合的。
       能不能用Container或者AccessObject来做呢?目前还没调试。此外,这只能在当前数据库里执行,也算是一个缺陷。看看大家有没有更好的办法。希望能与大家探讨。


作者: Grant    时间: 2011-6-25 08:59
先收下~
作者: huangqinyong    时间: 2011-6-25 21:00
这个功能不错,收下了,谢谢
作者: wang1950317    时间: 2011-6-25 21:56
收藏学习!谢谢!
作者: mag770t    时间: 2011-8-8 16:41
收下了,学习个,谢谢!
作者: bpchan    时间: 2012-1-11 18:43
学习




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3