我将调查许多Acccess应用程序,如果可能的话,它将使我的生活更容易制作脚本.
我的主要目标是在MS Access表单代码/模块中搜索某些单词(例如dog,cat,cow等)并返回包含该单词的模块名称. (或者至少如果存在或不存在则返回)
据我了解,内置的Find函数不会查找多个单词,只需单个单词.
我不希望把每个字放在那里,然后做一个全部查找,因为这将耗费大量时间.
你会如何解决这个问题?
解决方法
你可以使用这样的东西,但它不会无人看管,因为你可能会遇到各种各样的密码等问题.
改写
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,"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