Слово VBA: как запустить выделение.Найти в заранее определенном диапазоне?

у меня есть два блока кода Word VBA здесь, каждый из которых отлично работает отдельно, но который мне нужно объединить, чтобы получить желаемый результат. Один определяет диапазон текста (oRng), а другой выполняет выделение.Найти поиск, чтобы изменить текст. Мне нужно ограничить выбор.Найти поиск в диапазоне, определенном oRng.

Background: у меня есть переменный список новостных статей, разделенных на разделы под заголовками (один абзац в стиле Header1), которые также являются переменными. Мне нужно выделить исходную строку в статье (один абзац жирным шрифтом) и скопировать ее в конец заголовка статьи (один абзац в стиле Header2). Однако некоторые разделы необходимо исключить из этой операции, если заголовок раздела является определенным термином.

ситуация: у меня есть рабочий код, чтобы найти исходные строки статьи и скопировать их в конец заголовков статей (зацикливание всего документа с помощью выделения.Находить.) У меня также есть рабочий код для идентификации разделов текста, где первый набор кода должен быть применен, путем создания диапазонов (oRng) между применимыми заголовками разделов, проходя через документ раздел за разделом. То, что мне нужно сделать, - это запустить первый набор кода (который основан на выборе.Find) в пределах диапазонов, заданных вторым набором кода. Мое намерение состояло в том, чтобы зациклить код для идентификации диапазонов и, поскольку он идентифицирует каждый диапазон, запустите код для копирования исходных строк в заголовки в этом диапазоне, но я не могу найти способ чтобы ограничить выбор.Поиск по определенному диапазону (oRng).

может кто-нибудь помочь мне с этим, пожалуйста?

первый блок кода (определите диапазоны между заголовками разделов)

Sub SourceToArticleHeadersP2()
Dim oRng As Range
Dim oRngstart As Range
Dim oRngend As Range
Dim ArticleSource As Range
Dim ArticleHeader As Range
Dim excludedTerms(1 To 5) As String
excludedTerms(1) = "Term1"
excludedTerms(2) = "Term1"
excludedTerms(3) = "Term1"
excludedTerms(4) = "Term1"
excludedTerms(5) = "Term1"

Selection.HomeKey Unit:=wdStory
With Selection.Find
.Forward = True
.ClearFormatting
.Wrap = wdFindStop
.Style = ActiveDocument.Styles(wdStyleHeading1)
.Text = ""
.Execute
End With
Do While Selection.Find.Found
 For i = 1 To 5
  If InStr(1, Selection.Text, excludedTerms(i), vbTextCompare) Then
  Selection.Collapse wdCollapseEnd
  MsgBox excludedTerms(i) & " detected - skipping"
  Selection.Find.Execute
  End If
 Next i
 Set oRngstart = Selection.Range
 MsgBox "Start = " & oRngstart
 Selection.Collapse wdCollapseEnd
 With Selection.Find
  .Forward = True
  .ClearFormatting
  .Wrap = wdFindStop
  .Style = ActiveDocument.Styles(wdStyleHeading1)
  .Text = ""
  .Execute
 End With
 If Selection.Find.Found Then
  Set oRngend = Selection.Range
  MsgBox "End = " & oRngend
  Set oRng = ActiveDocument.Range(Start:=oRngstart.End, End:=oRngend.Start)
  Selection.Collapse wdCollapseStart
  Selection.Find.Execute
 Else
  MsgBox "End = End of Document"
  Set oRng = ActiveDocument.Range(Start:=oRngstart.End, End:=ActiveDocument.Range.End)
 End If
Loop
[SECOND BLOCK OF CODE GOES HERE]
End Sub

второй блок кода (идентификация исходных строк и копирование в строки заголовка статьи на основе форматирования). Мне нужно изменить это так, чтобы он работал только на диапазоне текста oRng.

With Selection.Find
 .Forward = True
 .ClearFormatting
 .Wrap = wdFindStop
 .Style = ActiveDocument.Styles(wdStyleHeading2)
 .Text = ""
 .Execute
End With
Do While Selection.Find.Found
 Set ArticleHeader = ActiveDocument.Range(Selection.Range.Start, Selection.Range.End - 1)
 With Selection.Find
  .Forward = True
  .ClearFormatting
  .Wrap = wdFindStop
  .Font.Bold = True
  .Text = ""
  .Execute
  End With
 Set ArticleSource = ActiveDocument.Range(Selection.Range.Start, Selection.Range.End - 1)
 ArticleHeader.InsertAfter " (" & ArticleSource & ")"
 Selection.Collapse wdCollapseEnd
 With Selection.Find
  .Forward = True
  .ClearFormatting
  .Wrap = wdFindStop
  .Style = ActiveDocument.Styles(wdStyleHeading2)
  .Text = ""
  .Execute
 End With
Loop

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

[2 + страницы открывающего текста и TOC]

заголовок раздела 1 (стиль: Heading1)

заголовок статьи 1 (стиль: Heading2)


Переменные строки заголовка text

Статья 1 название источника (жирным шрифтом)


Больше переменных строк текста заголовка


Тело статьи text


Разрыв страницы

заголовок статьи 2 (стиль: Heading2)


Переменные строки заголовка text

Статья 2 название источника (жирным шрифтом)


Больше переменных строк текста заголовка


Основной текст статьи


Разрыв страницы

заголовок раздела 2 (стиль: Heading1)

заголовок статьи 3 (стиль: Heading2)


Переменные строки заголовка text

Статья 3 название источника (жирным)


Больше переменных строк текста заголовка


Основной текст статьи


Разрыв страницы

[...]

25
задан Lobosolitario
04.12.2022 9:13 Количество просмотров материала 2529
Распечатать страницу

1 ответ

я смог решить эту проблему в конце, подсчитав абзацы в oRng, которые использовали стиль Header2, и зацикливание второго поиска соответствующее количество раз с начала oRng (код ниже).

Мне все равно было бы очень интересно узнать, есть ли другой способ ограничить цикл несколькими поисками, чтобы он работал только в определенном диапазоне - единственная идея, которую я имею, - это запустить первый поиск с помощью oRng.Найти, свернуть до конца, переопределить oRng как (текущий orngend) и цикл через этот путь, с диапазоном становится все меньше, как поиск движется вперед, пока не достигнет точки, где нет совпадений между текущим положением и oRngend.

спасибо миллион @Raystafarian за много полезных предложений и большую дозу терпения!

Sub SourceToArticleHeaders()
'Copy article source to article header
    Dim oRng As Range
    Dim oRngstart As Range
    Dim oRngend As Range
    Dim ArticleSource As Range
    Dim ArticleHeader As Range
    Dim oPara As Paragraph
    Dim A As Long
    A = 0
    Dim excludedTerms(1 To 5) As String
    excludedTerms(1) = "TERM1"
    excludedTerms(2) = "TERM1"
    excludedTerms(3) = "TERM1"
    excludedTerms(4) = "TERM1"
    excludedTerms(5) = "TERM1"

    Selection.HomeKey Unit:=wdStory
    With Selection.Find
    .Forward = True
    .ClearFormatting
    .Wrap = wdFindStop
    .Style = ActiveDocument.Styles(wdStyleHeading1)
    .Text = ""
    .Execute
    End With
    Do While Selection.Find.Found
     For i = 1 To 5
      If InStr(1, Selection.Text, excludedTerms(i), vbTextCompare) Then
      Selection.Collapse wdCollapseEnd
'      MsgBox excludedTerms(i) & " detected - skipping"
      Selection.Find.Execute
      End If
     Next i
     Set oRngstart = Selection.Range
'     MsgBox "Start = " & oRngstart
     Selection.Collapse wdCollapseEnd
     With Selection.Find
      .Forward = True
      .ClearFormatting
      .Wrap = wdFindStop
      .Style = ActiveDocument.Styles(wdStyleHeading1)
      .Text = ""
      .Execute
     End With
     If Selection.Find.Found Then
      Set oRngend = Selection.Range
'      MsgBox "End = " & oRngend
      Set oRng = ActiveDocument.Range(Start:=oRngstart.End, End:=oRngend.Start)
      Selection.Collapse wdCollapseStart
      Selection.Find.Execute
     Else
'      MsgBox "End = End of Document"
      Set oRng = ActiveDocument.Range(Start:=oRngstart.End, End:=ActiveDocument.Range.End)
     End If
     For Each oPara In oRng.Paragraphs
      If oPara.Range.Style = ActiveDocument.Styles(wdStyleHeading2) Then
      A = A + 1
      End If
     Next
'     MsgBox A & " articles"
     oRng.Select
     For A = 1 To A
     With Selection.Find
     .Forward = True
     .ClearFormatting
     .Wrap = wdFindStop
     .Style = ActiveDocument.Styles(wdStyleHeading2)
     .Text = ""
     .Execute
     End With
     Set ArticleHeader = ActiveDocument.Range(Selection.Range.Start, Selection.Range.End - 1)
     Selection.Collapse wdCollapseEnd
     With Selection.Find
      .Forward = True
      .ClearFormatting
      .Wrap = wdFindStop
      .Font.Bold = True
      .Text = ""
      .Execute
     End With
     Set ArticleSource = ActiveDocument.Range(Selection.Range.Start, Selection.Range.End - 1)
     ArticleHeader.InsertAfter " (" & ArticleSource & ")"
     Selection.Collapse wdCollapseEnd
     Next A
     A = 0
     With Selection.Find
      .Forward = True
      .ClearFormatting
      .Wrap = wdFindStop
      .Style = ActiveDocument.Styles(wdStyleHeading1)
      .Text = ""
      .Execute
     End With
    Loop
End Sub
0
отвечен Lobosolitario 2022-12-05 17:01

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх