将 MS Access 表单和类/模块递归导出到文本文件?

2024-02-05

我在一个古老的留言板上发现了一些代码,它很好地从类、模块和表单中导出了所有 VBA 代码(见下文):

Option Explicit
Option Compare Database
Function SaveToFile()                  'Save the code for all modules to files in currentDatabaseDir\Code

Dim Name As String
Dim WasOpen As Boolean
Dim Last As Integer
Dim I As Integer
Dim TopDir As String, Path As String, FileName As String
Dim F As Long                          'File for saving code
Dim LineCount As Long                  'Line count of current module

I = InStrRev(CurrentDb.Name, "\")
TopDir = VBA.Left(CurrentDb.Name, I - 1)
Path = TopDir & "\" & "Code"           'Path where the files will be written

If (Dir(Path, vbDirectory) = "") Then
  MkDir Path                           'Ensure this exists
End If

'--- SAVE THE STANDARD MODULES CODE ---

Last = Application.CurrentProject.AllModules.Count - 1

For I = 0 To Last
  Name = CurrentProject.AllModules(I).Name
  WasOpen = True                       'Assume already open

  If Not CurrentProject.AllModules(I).IsLoaded Then
    WasOpen = False                    'Not currently open
    DoCmd.OpenModule Name              'So open it
  End If

  LineCount = Access.Modules(Name).CountOfLines
  FileName = Path & "\" & Name & ".vba"

  If (Dir(FileName) <> "") Then
    Kill FileName                      'Delete previous version
  End If

  'Save current version
  F = FreeFile
  Open FileName For Output Access Write As #F
  Print #F, Access.Modules(Name).Lines(1, LineCount)
  Close #F

  If Not WasOpen Then
    DoCmd.Close acModule, Name         'It wasn't open, so close it again
  End If
Next

'--- SAVE FORMS MODULES CODE ---

Last = Application.CurrentProject.AllForms.Count - 1

For I = 0 To Last
  Name = CurrentProject.AllForms(I).Name
  WasOpen = True

  If Not CurrentProject.AllForms(I).IsLoaded Then
    WasOpen = False
    DoCmd.OpenForm Name, acDesign
  End If

  LineCount = Access.Forms(Name).Module.CountOfLines
  FileName = Path & "\" & Name & ".vba"

  If (Dir(FileName) <> "") Then
    Kill FileName
  End If

  F = FreeFile
  Open FileName For Output Access Write As #F
  Print #F, Access.Forms(Name).Module.Lines(1, LineCount)
  Close #F

  If Not WasOpen Then
    DoCmd.Close acForm, Name
  End If
Next
MsgBox "Created source files in " & Path
End Function

但是,这段代码并不能解决我的问题,因为我有 110 ms-access*.mdb我需要将 vba 导出到适合 grep 的文本文件中。

我感兴趣的 110 个文件的路径已经存储在一个表中,并且我的代码已经递归地获得了这些信息(以及其他一些过滤)......所以递归部分已经完成。

大多数这些文件都是由单个访问用户安全文件打开的,.mdw我尝试了几种打开它们的方法。当我在这些目录中搜索链接表时,ADO 和 ADOX 工作得很好......但是上面的代码涉及位于要从中导出数据的数据库内部 https://stackoverflow.com/questions/16674472/emulating-a-shift-key-press-when-using-vba-to-open-an-ms-access-database-secured,并且我希望能够从一个单独的数据库来执行此操作,该数据库打开所有mdbs 并对它们中的每一个执行导出。

我对此的尝试之一涉及使用 PrivDBEngine 类从外部连接到数据库,但它不允许我访问上面导出代码所需的 Application 对象。

Private Sub exportToFile(db_path As String, db_id As String, loginInfo As AuthInfoz, errFile As Variant)

    Dim pdbeNew As PrivDBEngine
    Dim db As DAO.Database
    Dim ws As DAO.Workspace
    Dim rst As DAO.Recordset

    Dim cn As ADODB.Connection ' ADODB.Connection
    Dim rs As ADODB.Recordset ' ADODB.Recordset
    Dim strConnect As String
    Dim blnReturn As Boolean

    Dim Doc              As Document
    Dim mdl              As Module
    Dim lngCount         As Long
    Dim strForm          As String
    Dim strOneLine       As String
    Dim sPtr             As Integer

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set exportFile = fso.CreateTextFile("E:\Tickets\CSN1006218\vbacode\" & db_id & ".txt", ForAppending)

    ' Export stuff...

    On Error GoTo errorOut

    Set pdbeNew = New PrivDBEngine
    With pdbeNew
        .SystemDB = loginInfo.workgroup
        .DefaultUser = loginInfo.username
        .DefaultPassword = loginInfo.password
    End With


    Set ws = pdbeNew.Workspaces(0)


    Set db = ws.OpenDatabase(db_path)

    For Each Doc In db.Containers("Modules").Documents
        DoCmd.OpenModule Doc.Name
        Set mdl = Modules(Doc.Name)

        exportFile.WriteLine ("---------------------")
        exportFile.WriteLine ("Module Name: " & Doc.Name)
        exportFile.WriteLine ("Module Type: " & mdl.Type)
        exportFile.WriteLine ("---------------------")

        lngCount = lngCount + mdl.CountOfLines

        'For i = 1 To lngCount
        '    strOneLine = mdl.Lines(i, 1)
        '    exportFile.WriteLine (strOneLine)
        'Next i

        Set mdl = Nothing
        DoCmd.Close acModule, Doc.Name
    Next Doc

Close_n_exit:

    If Not (db Is Nothing) Then
        Call wk.Close
        Set wk = Nothing
        Call db.Close
    End If



    Call exportFile.Close
    Set exportFile = Nothing
    Set fso = Nothing

    Exit Sub

errorOut:
    Debug.Print "----------------"
    Debug.Print "BEGIN: Err"
    If err.Number <> 0 Then
        Msg = "Error # " & Str(err.Number) & " was generated by " _
         & err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & err.Description
        'MsgBox Msg, , "Error", err.HelpFile, err.HelpContext
        Debug.Print Msg
    End If
    Resume Close_n_exit

End Sub

有没有办法访问application对象从一个PrivDBEngine?我有很多需要 grep 的模块。


您也可以尝试这段代码。它将保留项目的文件类型(.bas、.cls、.frm) 记得参考/检查Microsoft Visual Basic 应用程序扩展库 in VBE > 工具 > 参考

Public Sub ExportAllCode()

    Dim c As VBComponent
    Dim Sfx As String

    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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 MS Access 表单和类/模块递归导出到文本文件? 的相关文章

随机推荐

  • 将朝鲜文音节分解为字母 (jamo)

    我正在开发一个处理韩语句子的程序 我需要一种方法将音节或块分解为其字母 对于那些不懂韩文的人来说 一个音节由 2 4 个字母 jamo 组成 可以创建数千种不同的组合 我想做的就是将这些音节分解成构成它的字母 我能够通过将其 Unicode
  • 在 Virtuoso 中定义端点

    如何在 Virtuoso 中为我的本体定义新端点 我能够通过 Virtuoso Conductor 的 RDF Store Upload 选项卡上传我的本体 现在我需要定义一组端点 以便能够通过 HTTP 在我的应用程序中使用它们 Virt
  • pandas 中的旋转问题(在 R 中传播)

    我在使用 pandas 中的 pd pivot 或 hub table 函数时遇到一些问题 我有这个 df pd DataFrame site id 0 a 1 a 2 b 3 b 4 c 5 c 6 a 7 a 8 b 9 b 10 c
  • Qt moc.exe 不生成 *.moc 文件

    我正在尝试建立qtestlib tutorial1 示例 但是testqstring moc当我运行时没有生成文件nmake 我在 Windows XP SP3 上运行 Qt 4 5 2 我复制了测试qstring cpp从教程目录到我的构
  • XSRF - 如何设置跨域 cookie

    我开发了 REST API 和两个 JavaScript 客户端 单页应用程序和本机应用程序 基于电子 在这两个客户端中 我的用户都通过 OAuth2 流程进行身份验证 将用户密码发送到服务器 获取访问令牌 以纯文本形式 和刷新令牌 以 h
  • 仅将边框添加到换行文本的底部

    我试图在一些换行文本上实现下划线 该下划线适合底行文本的宽度 同时仅出现在该底线下方 图1说明了期望的效果 Figure 1 使用这个 HTML h2 span class inline block optatur volendit inu
  • 加载TextureAtlas的状态

    我在基于 LibGdx 的游戏中使用TextureAtlas 随着图集大小的增加 加载时间也会增加 因此显示我在游戏中设置的动画会出现延迟 因此我希望获得纹理图集加载过程的状态 1 无论如何要获得状态吗 2 有听众吗 您可以以已使用此方法加
  • 如何在 swift ios 中刷新选项卡栏项目

    我做的应用程序就像Instagram与选项卡栏项目 在应用程序中我有simple user and company user 我有主视图控制器 MainTabBarController UITabBarController 有 5 个选项卡
  • 当从 super() 运行方法时,为什么字段不初始化为非默认值?

    我一定花了一个多小时试图找出一些意外行为的原因 我最终意识到字段没有按我的预期设置 在耸耸肩并继续之前 我想了解为什么会这样 在运行下面的示例时 我希望输出为 true 但它是 false 其他测试表明我总是得到该类型的默认值 public
  • 获取 OAuth 会话的过期时间

    为了授予或撤销对我的 webapi 的访问权限 我使用 OAuth 密码和令牌刷新工作流程 如果我理解正确的话 工作流程应该是这样的 使用用户名 密码 客户端 ID 进行身份验证 检索 accesstoken refreshtoken 和到
  • Swift:如何请求带有自签名证书的 URL?

    我正在打开 SSL 连接以在 Swift 中检索 JSON 但正在使用自签名证书对我自己的服务器进行测试 以下是 URL 请求的片段 var urlPath https myhost com get json var url NSURL N
  • 将 NSMutableArray 保存到 NSUserDefaults 的最佳方法是什么?

    我有一个名为 Occasion 的自定义对象 定义如下 import
  • 在 Highcharts 中动态附加加载或重绘事件函数

    我需要在 Highcharts 中动态附加 onload 或 redraw 事件函数 我知道在配置步骤中进行此操作 例如 container highcharts chart events load function event funct
  • 优化期间 Java 会内联方法吗?

    我想知道 JVM javac 是否足够聪明来转动 This line string a foo string foo return bar string bar return some complicated string computat
  • 使用 if(1 || !Foo()) 有什么理由吗?

    我读了一些遗留代码 if 1 Foo 是否有任何不写的理由 if Foo 两者是not相同 第一个永远不会评价Foo 因为1短路 为什么这样做 可能有人想强行进入then出于调试目的分支并将其留在那里 也可能是这是在源代码控制之前编写的 因
  • 如何指定编辑器打开crontab文件? “export EDITOR=vi”不起作用

    我使用的是 Red Hat Enterprise Linux 5 我想设置 vim 编辑器来编辑 crontab 文件 如果我跑echo EDITOR 我得到了活力 但当我跑步时crontab e 我得到了不同的编辑器 很可能你的VISUA
  • 使用 data.table 包进行条件二进制连接和引用更新

    这是我现实生活中的问题 我觉得可以很容易地解决 但我在这里遗漏了一些明显的东西 我有两个大数据集TK and DFT library data table set seed 123 TK lt data table venue id rep
  • 如何使用 Python 获取触发我的 Azure 函数的 inputBlob 的名称

    我有一个天蓝色的函数 它是由放入 blob 存储的文件触发的 我想知道如何 如果可能 获取触发该函数的 blob 文件 的名称 我尝试这样做 fileObject os environ inputBlob message Python sc
  • 尝试启动 Atom/Nuclide 时未找到流

    我正在研究react native我正在使用的应用程序AtomIDE 我在打开时遇到错误Atom 我安装了babel cli and babel preset flow使用 npm 命令 npm install save dev babel
  • 将 MS Access 表单和类/模块递归导出到文本文件?

    我在一个古老的留言板上发现了一些代码 它很好地从类 模块和表单中导出了所有 VBA 代码 见下文 Option Explicit Option Compare Database Function SaveToFile Save the co