2

我一直在使用一段代码来查找 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)

当我想搜索多行文本时,问题就开始了。例如我想找到文本部分:

将 a 调暗为整数 将
b 调为整数

不幸的是,当我尝试显示我的多行搜索文本时,find 函数返回错误。

使用调试(监视/立即)我确认我的搜索条件(text_find)在第一个“整数”和“Dim b”之间确实包含 chrs 13 + 10。

我还检查了“Dim a”行的 module.Line 值,它也以 chrs 13 + 10 结尾。

所以现在我真的很难知道如何让它工作。

如果有人对此有任何帮助 - 将不胜感激。

谢谢

4

1 回答 1

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 语法。

于 2016-09-07T12:57:58.807 回答