В длинном документе Word я бы хотел сделать следующее:

Найдите все абзацы стиля «Заголовок 2», и ЕСЛИ эти заголовки не имеют формулировки «Примечания», примените определенный стиль к следующему абзацу.

Вот мой код:

Dim oPara As Paragraph
    For Each oPara In ActiveDocument.Paragraphs
        If oPara.Style = "Heading 2" And oPara.Range.Text <> "Notes" Then
            oPara.Range.Next(Unit:=wdParagraph, Count:=1).Select
           Selection.Style = "Normal"
        End If
    Next oPara

Однако абзацы, обозначенные как «Примечания», не исключаются из процедуры, поэтому следующие за ними также преобразуются в стиль «Нормальный». Я даже не уверен, что oPara.Range.Text действительно извлекает текст абзаца.

Спасибо.

0
Zion 23 Ноя 2020 в 11:13

3 ответа

Лучший ответ

Я согласен с Тимоти. Следующее еще быстрее - и проще. Это также более надежно, поскольку код Тимоти соответствует «Notes» в любом месте абзаца, а не «Notes», являющемуся всем текстом абзаца.

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = ""
    .Style = ActiveDocument.Styles(wdStyleHeading2)
    .Forward = True
    .Format = True
    .Wrap = wdFindStop
  End With
  Do While .Find.Execute = True
    If .Text <> "Notes" & vbCr Then .Next(wdParagraph, 1).Style = wdStyleNormal
    .Collapse wdCollapseEnd
  Loop
End With
Application.ScreenUpdating = True
End Sub
0
macropod 23 Ноя 2020 в 09:55

Попробуйте вот так:

Dim oPara As Paragraph

For Each oPara In ActiveDocument.Paragraphs
    If oPara.Style = "Heading 2" And Replace(oPara.Range.Text, Chr(13), "") <> "Notes" Then
        oPara.Range.Next(Unit:=wdParagraph, Count:=1).Select
       Selection.Style = "Normal"
    End If
Next oPara

Кажется, что Word включает в себя возврат каретки Chr(13) после текста заголовка, поэтому при проверке, является ли текст заголовка "Notes", возврат каретки должен быть удален.

0
sbgib 23 Ноя 2020 в 08:36

Самый эффективный способ найти все экземпляры «Заголовка 2» - использовать Find. Затем вы можете протестировать текст найденного диапазона и, если он соответствует вашим критериям, применить стиль к следующему абзацу.

Sub FormatAfterHeading()
   Dim findRange As Range
   Set findRange = ActiveDocument.Content
   With findRange.Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Text = ""
      .Style = ActiveDocument.Styles(wdStyleHeading2)
      .Forward = True
      .Format = True
      .Wrap = wdFindStop
      Do While .Execute = True
         If InStr(findRange.Text, "Notes") > 0 Then
            'do nothing
         Else
            findRange.Next(wdParagraph, 1).Style = wdStyleNormal
         End If
         findRange.Collapse wdCollapseEnd
      Loop
   End With
End Sub
0
Timothy Rylatt 23 Ноя 2020 в 09:24