Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
615 views
in Technique[技术] by (71.8m points)

ms access - Find function in Form Code Module

I am to investigate many Acccess applications and it would make my life easier to make a script, if possible.

My main goal is to search through MS Access form code/module for certain words (eg dog, cat, cow etc) and return the module name which contains that word. (or at least return if it exists or not)

As I understand it, the inbuilt Find function does not look for multiple words, just single word. I do not wish to put each word in there and do a Find all as that will consume lot of time.

How would you tackle this problem?

As answered below, normal Modules can be searched using Find function (Module.Find) but it seems it is different to Form.Module. Please help!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You could use something like this, but it will not run unattended, because you are likely to get all sorts of problems with passwords and such like.

Rewrite

This will search form and report code and modules, includimg class modules, but will not search comments.

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

Here is an alternative search, but it does not give you the means of manipulating the code, once the line is found.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...