【问题标题】:vba module.find with line breaks (Ms access 2013)vba module.find 带换行符(Ms access 2013)
【发布时间】:2015-11-01 01:34:53
【问题描述】:

我一直在使用一段代码在 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 函数返回 false。

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

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

所以现在我真的很想知道如何让它发挥作用。

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

谢谢

【问题讨论】:

  • 有趣。我也无法让它工作。 .Find("Dim a as Integer*Dim b as Integer", y1, x1, y2, x2, PatternSearch:=True) 也不起作用。这可能是不可能的 - 但EndLine 参数将毫无意义。
  • 你是用instr代替find关键字来搜索单词的吗?

标签: vba ms-access module ms-access-2013 vbe


【解决方案1】:

您不能使用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 语法。

【讨论】:

  • 该死的你是邪恶的。 OP 可能不需要考虑 VBA 支持编写 Dim 语句的所有可能的邪恶方式。
  • 确实,但Dim a As Integer 'TODO - Give this var a better name 是邪恶的足够有问题。
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2016-01-18
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多