Как выбрать список, если список содержит определенный текст с использованием слова VBA - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть код VBA для поиска конкретной строки, найденной в таблице, а также мне нужен код VBA для выбора списка, если указанный текст найден.

Код был получен отсюда,

Microsoft Word VBA - Выберите таблицу, если ячейка содержит указанную строку ,

Sub Find_Text_in_table()
selection.Find.ClearFormatting
    With selection.Find
        .Text = "figure id:"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    Do While selection.Find.Execute

        If selection.Information(wdWithInTable) Then

                        MsgBox "Figure ID Found in Table"
                    Exit Sub
            'now you are in table with text you searched
            'be careful with changing Selection Object
            'do what you need here
        End If
    Loop
    Application.ScreenUpdating = True
End Sub

также, если текст «Идентификатор рисунка:» найден в любом типе списка, выведите предупреждающее сообщение.

  1. это список
  2. это список
  3. это список
  4. Идентификатор рисунка:

1 Ответ

0 голосов
/ 01 сентября 2018

В целом, предпочтительнее работать с Range объектами вместо Selection. Может быть только один выбор, но код может работать с таким количеством диапазонов, сколько необходимо. Я изменил оригинальный код соответственно. Я также изменил Find.Wrap на wdFindStop, чтобы код просматривал весь документ, а затем останавливался.

Объект Range имеет свойство ListParagraphs, которое будет возвращать ListParagraph объект (ы) Range. В этом случае это будет абзац, в котором термин Find находится , если , он принадлежит нумерованному списку. Если это так, Count будет больше 0, и код продолжит получать Paragraph.Range, из которого можно извлечь все абзацев, которые принадлежат списку, используя Rnage.ListFormat.List.ListParagraphs.

Чтобы выбрать весь список, необходимо получить точку Start первой записи списка и точку End последней записи списка. В приведенном ниже коде диапазон абзаца, в котором был найден «Идентификатор рисунка», расширен до этих точек, чтобы охватить весь список. Обратите внимание, что неясно, что вы хотите с этим делать, как только вы это сделаете, поскольку код зацикливается. Может случиться так, что он вообще не будет выбран , но что действие должно быть выполнено над объектом Range, вместо этого ...

Sub Find_Text_withList_in_table()
    Dim rngFind As Word.Range, rngFigureList As Word.Range
    Dim lstParas As Word.ListParagraphs
    Dim lFindCounter As Long 'for testing / debugging

    Set rngFind = ActiveDocument.content
    rngFind.Find.ClearFormatting
    With rngFind.Find
        .Text = "figure id:"
        .Replacement.Text = ""
        .Forward = True
        .wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    Do While rngFind.Find.Execute
        lFindCounter = lFindCounter + 1
        If rngFind.Information(wdWithInTable) Then
            Debug.Print "Figure ID Found in Table"
            Set lstParas = rngFind.ListParagraphs
            If lstParas.Count > 0 Then
                Set rngFigureList = lstParas.Item(1).Range
                Set lstAllParas = rngFigureList.ListFormat.List.ListParagraphs
                Debug.Print "Nr paragraphs in the list: " & lstAllParas.Count
                rngFigureList.Start = lstAllParas(1).Range.Start
                rngFigureList.End = lstAllParas(lstAllParas.Count).Range.End
                rngFigureList.Select
                MsgBox "Figure Id is in a numbered list, in a table"
            End If
        End If
    Loop
    Debug.Print "Nr Figure ID found: " & lFindCounter
    Application.ScreenUpdating = True
End Sub
...