在表单代码模块中查找功能

时间:2012-03-08 03:56:49

标签: ms-access search text

我将调查许多Acccess应用程序,如果可能的话,它会让我的生活变得更容易。

我的主要目标是在MS Access表单代码/模块中搜索某些单词(例如dog,cat,cow等)并返回包含该单词的模块名称。 (或者至少如果存在或不存在则返回)

据我所知,内置的Find函数不会查找多个单词,只需单个单词。 我不希望把每个字放在那里并做一个全部查找,因为这将耗费大量时间。

你会如何解决这个问题?

如下所述,可以使用Find函数(Module.Find)搜索普通模块,但它似乎与Form.Module不同。请帮忙!

1 个答案:

答案 0 :(得分:4)

你可以使用这样的东西,但它不会无人看管,因为你可能会遇到各种各样的密码等问题。

<强>重写

这将搜索表单并报告代码和模块,包括类模块,但不会搜索注释。

Sub SearchAllCode()
Dim ap As New Access.Application
Dim sfile As String, afind As Variant
Dim mdlname As String, mdl As Object
Dim prcname As String
Dim lsline As Long, lscol As Long
Dim leline As Long, lecol As Long
Dim sline As String, r As Long
Dim i, j

ap.Visible = True

afind = Split("msgbox,chair,ombo,Visible", ",")
sfile = Dir("Z:\Docs\*.accdb")

Do While sfile <> vbNullString
    ap.OpenCurrentDatabase "Z:\Docs\" & sfile, False, "pass"

    For i = 1 To ap.VBE.ActiveVBProject.VBComponents.Count

        Set mdl = ap.VBE.ActiveVBProject.VBComponents(i).CodeModule 

        For j = 0 To UBound(afind)
            leline = mdl.CountOfLines
            ''object.Find(target, startline, startcol, endline, endcol 
            ''[, wholeword] [, matchcase] [, patternsearch]) As Boolean
            ''The default is false for the three optional parameters.
            ''Finds first occurrence only
            If mdl.Find(afind(j), lsline, lscol, leline, lecol) Then

                sline = mdl.Lines(lsline, Abs(leline - lsline) + 1)
                prcname = mdl.ProcOfLine(lsline, r)

                Debug.Print mdl.Name
                Debug.Print prcname
                Debug.Print lsline
                Debug.Print sline
            End If
        Next
    Next
    ap.CloseCurrentDatabase
    sfile = Dir
Loop
ap.Quit
End Sub

这是一个替代搜索,但是一旦找到该行,它就不会为您提供操作代码的方法。

Sub AlternativeSearch()
Dim ap As New Access.Application
Dim sfile As String, afind As Variant
Dim mdl As Object
Dim modtext As String, modarray As Variant
Dim leline As Long
Dim i, j, k


ap.Visible = True

afind = Split("msgbox,chair,ombo,Visible", ",")
sfile = Dir("Z:\Docs\*.accdb")

Do While sfile <> vbNullString
    ap.OpenCurrentDatabase "Z:\Docs\" & sfile, False, "pass"

    For i = 1 To ap.VBE.ActiveVBProject.VBComponents.Count

        Set mdl = ap.VBE.ActiveVBProject.VBComponents(i).codemodule 'ap.Modules(mdlname)
        leline = mdl.CountOfLines
        modtext = mdl.Lines(1, leline)

        For j = 0 To UBound(afind)
            If InStr(modtext, afind(j)) > 0 Then
                Debug.Print "****" & afind(j) & " found in " & mdl.Name
                modarray = Split(modtext, vbCrLf)
                For k = 0 To UBound(modarray)
                    If InStr(modarray(k), afind(j)) > 0 Then
                        Debug.Print k
                        Debug.Print modarray(k)
                    End If
                Next
            End If
        Next
    Next
    ap.CloseCurrentDatabase
    sfile = Dir
Loop
ap.Quit
End Sub