我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码
Posted
技术标签:
【中文标题】我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码【英文标题】:I wish to export the vba source code from all of the Forms, Reports, and Modules in an ms-access 2013 database 【发布时间】:2013-08-06 04:23:23 【问题描述】:这是一个示例代码模块。我在以前版本的 Access 中使用的方法不起作用,因为 AllModules 集合不再包含表单和报表模块的对象。如果您有代码模块要备份,则必须与以下模块分开完成。
Public Sub ExportModules2013()
Dim boolCloseModule As Boolean
Dim frm As Form
Dim i As Integer
Dim iModuleType As Integer
Dim modModule As Module
Dim modOpenModules As Modules
Dim obj As AccessObject, dbs As Object
Dim rpt As Report
Dim sFileName As String
Dim sPath As String
'
sPath = "X:\Perryaire\Source\201308025\"
'
Set dbs = Application.CurrentProject
' Search for all AccessObject objects in AllForms Collection.
For Each obj In dbs.AllForms
DoCmd.OpenForm obj.Name, acDesign
Set frm = Forms(obj.Name)
If frm.HasModule Then
Set modModule = frm.Module
GoSub L_ExportModule
End If
DoCmd.Close acForm, frm.Name
Set frm = Nothing
Next obj
' Search for all AccessObject objects in AllReports Collection.
For Each obj In dbs.AllReports
DoCmd.OpenReport obj.Name, acDesign
Set rpt = Reports(obj.Name)
If rpt.HasModule Then
Set modModule = rpt.Module
GoSub L_ExportModule
End If
DoCmd.Close acReport, rpt.Name
Set rpt = Nothing
Next obj
' Search for all AccessObject objects in AllModules collection.
For Each obj In dbs.AllModules
If Not obj.IsLoaded Then
DoCmd.OpenModule (obj.Name)
End If
Set modModule = Application.Modules(obj.Name)
GoSub L_ExportModule
If boolCloseModule Then DoCmd.Close acModule, modModule.Name
Next obj
Exit Sub
L_ExportModule:
With modModule
iModuleType = acStandardModule
On Error Resume Next
iModuleType = .Type
sFileName = Nz(.Name, "MISSING:") & IIf(iModuleType = acStandardModule, ".bas", ".cls")
Lopen:
On Error GoTo Lmkdir
Open sPath & sFileName For Output As #1
If modModule.Type = acStandardModule Then
Print #1, "Attribute VB_Name = """ & .Name & """"
Else
Print #1, "VERSION 1.0 CLASS"
Print #1, "BEGIN"
Print #1, " MultiUse = -1 'True"
Print #1, "End"
Print #1, "Attribute VB_Name = """ & .Name & """"
Print #1, "Attribute VB_GlobalNameSpace = False"
Print #1, "Attribute VB_Creatable = False"
Print #1, "Attribute VB_PredeclaredId = False"
Print #1, "Attribute VB_Exposed = False"
End If
Print #1, .Lines(1, CLng(.CountOfLines))
Close #1
End With
Return
Lmkdir:
If Err.Number = "76" Then
MkDir sPath
Resume Lopen
Else
MsgBox "Error: " & Err.Number & " " & Err.Description
End If
Exit Sub
结束子
【问题讨论】:
【参考方案1】:你可以试试下面的代码。它将导出所有模块、类和表单代码并保存到当前项目文件夹。记得参考/检查Microsoft Visual Basic For Applications Extensibility Library VBE > 工具 > 参考资料
Sub ExportAllCode()
For Each c In Application.VBE.VBProjects(1).VBComponents
Select Case c.Type
Case vbext_ct_ClassModule, vbext_ct_Document
Sfx = ".cls"
Case vbext_ct_MSForm
Sfx = ".frm"
Case vbext_ct_StdModule
Sfx = ".bas"
Case Else
Sfx = ""
End Select
If Sfx <> "" Then
c.Export _
fileName:=CurrentProject.Path & "\" & _
c.Name & Sfx
End If
Next c
End Sub
【讨论】:
请注意,Application.VBE.VBProjects(1).VBComponents
行将返回来自第一个项目的对象,如果您打开了多个工作簿或有加载项,这可能不是您想要的。我建议您将其替换为 ActiveWorkbook.VBProject.VBComponents
以使用活动工作簿。【参考方案2】:
您是否尝试过使用未记录的Application.SaveAsText
函数?
这是我用来导出所有表单/报告/查询/模块的:
Q6408951: Text-search in properties Access objects另一个相关问题:
Q187506: How do you use version control with Access development?【讨论】:
【参考方案3】:Excel 有这样的工具。也许您可以查看源代码并使用所需的部分。 http://www.codeproject.com/Articles/18029/SourceTools-xla
【讨论】:
以上是关于我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码的主要内容,如果未能解决你的问题,请参考以下文章
使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值
我可以通过 Dropbox 共享 MS-Access 数据库应用程序吗?
将 Excel 中的动态和静态范围导入到 MS-Access 中,而不是从单元格 A1 开始