将 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 表单和类/模块递归导出到文本文件? 的相关文章

  • 将范围内的每个值乘以常数,但跳过空白单元格

    我需要一个简单快速的解决方案 用于将范围内的所有值乘以 VBA 代码中的数值 我知道这个解决方案 将整个范围乘以值 https stackoverflow com questions 18990541 multiply entire ran
  • 无法在我的抓取工具中设置超时选项以防止无限循环

    我已经使用 IE 在 vba 中编写了一个脚本 在其搜索框中的网页中启动搜索 通过点击搜索按钮根据搜索填充结果 网页加载它是searchbox几秒钟后它就会打开 但是 我的下面的脚本可以处理这个障碍并以正确的方式执行搜索 现在 我有一个稍微
  • 在 Excel 表格中选择多列的代码

    我是 Excel VBA 新手 我需要修改我的代码 以便我能够进一步进行 我想在 Excel 表格中选择多个表格列 这是我的代码 Dim ws As Worksheet Dim tbl As ListObject Set ws Sheets
  • VBA 有没有办法了解未使用的变量?

    标准 VBA 编辑器中是否有工具 方法或设置来警告已被修改的变量Dim med 但没有被使用 MZ Tools http www mztools com index aspx将搜索您的代码并告诉您哪些内容未被使用 VBA的版本可以找到her
  • VBA 完成 Internet 表单

    我正在寻找将 Excel 中的值放入网页的代码 Sub FillInternetForm Dim IE As Object Set IE CreateObject InternetExplorer Application IE naviga
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • VBA 中 AND 函数如何工作?

    如果这是一个愚蠢的问题 我很抱歉 但是 Excel VBA AND 函数是否检查其中的每个条件然后继续 或者在第一个 FALSE 条件处停止而不检查其他条件 我想知道出于优化目的 但到目前为止在网上没有找到任何相关信息 提前致谢 示例 如果
  • VBA 中的匈牙利语好吗?

    我在 Net 中不使用匈牙利语 str int 前缀 但我仍然发现它在 VBA 中很有用 因为在 VBA 中很难看到类型 这很糟糕吗 不必要 也许我错过了一些东西 我真的很感激任何反馈 我想知道有一段时间了 谢谢大家 我想说 这种匈牙利符号
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da
  • 检查未绑定控件是否具有值的正确方法

    简单场景 一个表单和一个文本框 未绑定 Text1 If lt gt Text1 Then MsgBox Not Empty End If 上面的代码有效 表达方式 lt gt Text1如果文本框包含字符 则计算结果为 True 无论文本
  • 使用“save”方法更改 ado 对象的 xml 导出字段的精度

    我正在开发一个 VB6 应用程序 该应用程序使用 ADODB Recordset 对象通过 save 方法将数据转储到 xml 文件 如下所示 adoRecordset Save strDst adPersistXML 其中 strDst
  • 使用 VBScript 在日期字段值上选择错误的数据

    我有一张包含以下数据的表 现在 Excel 共有 36 个任务 每个任务有 4 列 第一个任务 即 Task1 名称将始终从 L 列开始 144 列描述了 36 个任务 现在我们需要按行进行检查 并需要检查 TNStart 开始日期 你们能
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662
  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想
  • 数据透视表错误 |无效的调用或过程

    我需要一些帮助来解决这个问题 我正在尝试创建一个数据透视表 从第一季度开始 在同一张表中包含一系列数据 第一个 if 语句在那里是因为最后一列并不总是包含标题 所以我将其包含在那里 我希望范围是动态的 因为所制作的表格的大小将根据工作表中数
  • 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

    我已经在 SQL Server 中设置了一个运行良好的存储过程 我现在可以从 VBA 调用它 但想返回一个值以了解是否存在任何错误等 我的 SP 中的最后一个参数设置为 OUTPUT DataSetID int 0 Destination
  • VBA将二进制图像转换为网页的base64编码字符串

    我正在尝试读取 JPG 文件并将该文件转换为 base64 编码的字符串 该字符串可用作网页上的嵌入 jpeg 我在网上发现了两个在 VBA 中进行 Base64 编码 解码的函数 它们似乎被广泛接受 编码 解码过程产生了我的原始二进制字符
  • 如何将动态范围字符串文本传递给 EXCEL VBA 中的 SQL 查询 IN 子句

    我有动态范围字符串数据 需要通过修剪单元格和单引号和逗号分隔到 SQL 查询 A 123ABC345 234CDE678 ZSE123MTR POR123456 Result select from table name where col
  • Excel VBA:声明通用对象与指定对象类型之间的区别

    我发现使用声明为的变量出现了意外的 至少对我来说 行为Object在 Excel vba 中 我试图从 html 页面中提取一些数据 所以我使用了这样的例程 sub Test Dim htmlPage As htmlDocument Thi
  • 使用 VBA 跟踪 Excel 2007/2010 中的样式更改

    我需要跟踪某些工作表中的单元格样式变化 我无法在 Excel 2007 2010 中使用内置跟踪 因为我需要自定义某些内容 我尝试通过 Workbook SheetChange 跟踪样式更改但失败了 当我将单元格从一种样式更改为另一种样式时

随机推荐

  • 将朝鲜文音节分解为字母 (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