我一直在使用一段代码在vba模块中查找特定文本。
适用于查找单行(或更少)文本。 因此,例如,它会在带有文本的模块中找到“mySub”:
Private sub mySub()
Dim a as Integer
Dim b as Integer
End Sub
我正在使用的代码:
Set m = myAp.Modules(name)
m.find(text_find, 1, 1, -1, -1, False, False, False)
当我想搜索多行文本时,问题就开始了。 例如,我想找到文本部分:
将整数调整为整数
Dim b as Integer
不幸的是,当我尝试展示我的多行搜索文本时,find函数返回false。
使用debug(watch / immediate)我确认我的搜索条件(text_find)在第一个'Integer'和'Dim b'之间包含chrs 13 + 10。
我还检查了“Dim a”行的module.Line值,并且还以chrs 13 + 10结束。
所以现在我真的很想知道如何让这个工作。
如果有人对此有任何帮助 - 将不胜感激。
由于
答案 0 :(得分:2)
您无法使用Find
方法搜索多行代码,但您可以将所有行读取为字符串,然后使用InStr
查找每个匹配项搜索词:
Option Compare Database
Dim a As Integer
Dim b As Integer
Sub test()
Const search As String = "Dim a As Integer" & vbCrLf & "Dim b As Integer"
Dim md As Module
Set md = Modules("Module1")
Dim allLines As String
allLines = md.Lines(1, md.CountOfLines)
'Get the first instance of the search term...
Dim pos As Long
pos = InStr(1, allLines, search, vbTextCompare)
Dim found As Boolean
found = pos > 0
End Sub
但是,您应该注意,使用Find或InStr解析VBA几乎是不可能的。您需要状态机来可靠地执行它,或者您需要像ANTLR这样的库。
考虑一个包含以下内容的模块:
Dim a As Integer 'some comment _
some comment
Dim b _
As _
Integer 'Some other comment
如何编写可以处理???的搜索词?
仅供参考 - Rubberduck VBA项目(我参与其中)一直在改进VBA语法,可以解析几乎所有的VBA语法。