在其他 Access 数据库中搜索 VBA 代码文件

Posted

技术标签:

【中文标题】在其他 Access 数据库中搜索 VBA 代码文件【英文标题】:Search through VBA code files in other Access Databases 【发布时间】:2016-04-11 20:30:29 【问题描述】:

我阅读了链接How to search through VBA code files 中的一个非常详尽的回复,它对当前项目非常有效。但是,我只是觉得打开其他项目并查看他们的代码很慢。

使用 OpenDatabase 提到的响应,但我没有看到有关数据库和 Application.VBE.ActiveVBProject 之间关联的示例。我对此并不懒惰,但 4 天的网络搜索已经用尽了我的选择。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我很抱歉。找到了其他方法来完成这项工作。

Public Sub FindWordInOtherModules(ByVal pSearchWord As String, sApplicationFilePath As String)
Dim objComponent As VBComponent
    ' VBComponent requires reference to Microsoft Visual Basic
    ' for Applications Extensibility; use late binding instead:
Dim lStartLine As Long
Dim lEndLine As Long
Dim lStartColumn As Long
Dim lEndColumn As Long
Dim accApp As Access.Application

Set accApp = New Access.Application

With accApp
    .Visible = True
    .OpenCurrentDatabase (sApplicationFilePath)
    .UserControl = True
    'MsgBox .VBE.ActiveVBProject.VBComponents.Count
    'MsgBox .CurrentDb.Name

    For Each objComponent In .VBE.ActiveVBProject.VBComponents
        If objComponent.CodeModule.Find(pSearchWord, lStartLine, lStartColumn, lEndLine, lEndColumn, _
        FindWholeWord, MatchCase, PatternSearch) = True Then
           MsgBox "Found text " & StringToFind & vbCrLf _
               & "Start line: " & lStartLine & vbCrLf _
               & "Line text:  " & objComponent.CodeModule.Lines(lStartLine, lEndLine - lStartLine + 1), vbOKOnly, objComponent.CodeModule.Name
    End If
Next objComponent
End With

accApp.CloseCurrentDatabase
Set accApp = Nothing

End Sub

【讨论】:

【参考方案2】:

您可能应该添加 accApp.Quit:

accApp.CloseCurrentDatabase
accApp.Quit
Set accApp = Nothing

before Set accApp = Nothing 以加快关闭应用程序并在执行此代码(Public Sub FindWordInOtherModules)期间关闭它,在 accApp.Quit 行上,而不是稍后。如果没有添加 accApp.Quit,在我的计算机上执行这种 Sub 几秒钟后鼠标仍然处于非活动状态。

但是没有必要打开另一个数据库,因为当前数据库只能通过创建临时引用来“链接”到它:

Private Sub FindWordInOtherModules2()

Dim objComponent As VBComponent
...
...
Dim lEndColumn As Long

Dim ref As Reference
Dim RefName As String

Const FileName = "C:\Users\....mdb"

With Application 'instead of accApp

    .References.AddFromFile FileName
    '.References.Count because the new one is supposed be the last one (?)
    RefName = .References(.References.Count).Name 

    Dim VBProj As VBProject

    For Each VBProj In .VBE.VBProjects
        If VBProj.FileName <> .CurrentDb.Name Then Exit For
    Next

    For Each objComponent In VBProj.VBComponents
        'Debug.Print objComponent.Name
        ...
        ...
    Next

    Set objComponent = Nothing '?
    Set VBProj = Nothing '?

    Set ref = .References(RefName)
    .References.Remove ref
    Set ref = Nothing '??

End With

End Sub

这似乎比打开另一个数据库文件要快,但无法更新 VBA。 References.Remove ref 删除了引用,但 VBA 文件夹在左侧面板中仍然可见,并且所有代码都有效,有点令人不安......

Application.VBE.VBProjects.Remove VBProj 不起作用。它可能与信任中心 - 宏设置中的“信任对 VBA 项目对象模型的访问”选项有关,该选项在 Access 中不可用。 但是关闭和打开数据库后项目是不可见的。

【讨论】:

以上是关于在其他 Access 数据库中搜索 VBA 代码文件的主要内容,如果未能解决你的问题,请参考以下文章

VBA/SQL ACCESS:将查询结果复制到其他访问数据库中的表

在 Access VBA 中使用 openargs 搜索报告的问题

Access 2007 可以在直接将数据上传到表后触发 VBA 代码吗?

VBA代码在MS Access中不区分大小写的过滤器

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

VBA 在文本行中搜索值