vba module.find с разрывами строк (MS Access 2013)

Я использовал фрагмент кода для поиска определенного текста в модулях 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 a как целое число
Dim b как целое число

К сожалению, функция поиска возвращает false, когда я пытаюсь представить свой многострочный текст для поиска.

Используя отладку (смотреть / немедленно), я подтвердил, что мои критерии поиска (text_find) действительно содержат chrs 13 + 10 между первым «Integer» и «Dim b».

Я также изучил значение module.Line для строки «Dim a», которая также заканчивается chrs 13 + 10.

Итак, теперь я действительно изо всех сил пытаюсь понять, как заставить это работать.

Если у кого-то есть помощь по этому поводу - буду признателен.

Спасибо


person Esby    schedule 01.11.2015    source источник
comment
Интересно. Я тоже не могу заставить это работать. .Find("Dim a as Integer*Dim b as Integer", y1, x1, y2, x2, PatternSearch:=True) тоже не работает. Это может быть невозможно, но тогда параметр EndLine был бы бессмысленным.   -  person Andre    schedule 01.11.2015
comment
Вы использовали instr вместо ключевого слова find для поиска слова?   -  person PASUMPON V N    schedule 01.11.2015


Ответы (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

Однако следует отметить, что разбор VBA с помощью Find или InStr будет практически невозможен. Вам нужен конечный автомат, чтобы сделать это надежно, или вам нужна библиотека, такая как ANTLR.

Рассмотрим модуль, содержащий:

Dim a      As Integer 'some comment _
some comment
Dim b _
  As _
  Integer 'Some other comment

Как написать поисковый запрос, который с этим справится ???

К вашему сведению. Проект Rubberduck VBA (в котором я участвую) совершенствует грамматику VBA, которая может анализировать почти весь синтаксис VBA.

person ThunderFrame    schedule 07.09.2016
comment
Блин, ты злой. OP, вероятно, не должен учитывать все возможные злые способы, которыми VBA поддерживает запись оператора Dim. - person Mathieu Guindon; 07.09.2016
comment
В самом деле, но Dim a As Integer 'TODO - Give this var a better name - зло достаточно, чтобы создавать проблемы. - person ThunderFrame; 08.09.2016