выделять текст между строками повторно в таблице Word - PullRequest
0 голосов
/ 14 мая 2019

Я построил следующий код (слегка адаптированный из stackoverflow answer )

Sub findTest()
    Dim firstTerm As String
    Dim secondTerm As String
    Dim myRange As Range
    Dim documentText As String
    Dim startPos As Long 'Stores the starting position of firstTerm
    Dim stopPos As Long 'Stores the starting position of secondTerm based on first term's location
    Dim nextPosition As Long 'The next position to search for the firstTerm

    nextPosition = 1

    'First and Second terms as defined by your example.  Obviously, this will have to be more dynamic
    'if you want to parse more than justpatientFirstname.
    firstTerm = "<tag>"
    secondTerm = "</tag>"

    'Get all the document text and store it in a variable.
    Set myRange = ActiveDocument.Range
    'Maximum limit of a string is 2 billion characters.
    'So, hopefully your document is not bigger than that.  However, expect declining performance based on how big doucment is
    documentText = myRange '.Text

    'Loop documentText till you can't find any more matching "terms"
    Do Until nextPosition = 0
        startPos = InStr(nextPosition, documentText, firstTerm, vbTextCompare)
        stopPos = InStr(startPos, documentText, secondTerm, vbTextCompare)
        ActiveDocument.Range(Start:=startPos + Len(firstTerm), End:=stopPos - 1).Select ' = True
        Debug.Print Selection.Text
        nextPosition = InStr(stopPos, documentText, firstTerm, vbTextCompare)
    Loop
End Sub

для поиска и замены (я еще не реализовал операцию замены) текстамежду <tag> и </tag> текстом внутри ячеек таблицы.Бывает, что каждый выбор сдвигает несколько символов справа.Например, если у меня есть:

| <tag>Bill</tag> | <tag>Steve</tag> | <tag>Mark</tag> |  

, я получаю на консоли:

ill
eve<
k</t

Как я могу решить?

1 Ответ

0 голосов
/ 15 мая 2019

Instr не является надежным в тех случаях, когда задействованы таблицы и / или поля. Для ваших целей используйте подстановочный знак Word Find, который выглядит следующим образом:

Sub Demo()
Application.ScreenUpdating = False
Dim StrOut As String
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "\<tag\>*\</tag\>"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    If .Information(wdWithInTable) = True Then
      StrOut = StrOut & vbCr & Split(Split(.Text, ">")(1), "<")(0)
    End If
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
MsgBox "Found:" & StrOut
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...