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

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

Ситуация: у меня есть рабочий код, чтобы найти исходные строки статьи и скопировать их в конец заголовков статьи (циклически просматривая весь документ с помощью Selection.Найти). У меня также есть рабочий код для определения разделов текста, где необходимо применить первый набор кода, путем создания диапазонов (oRng) между применимыми заголовками разделов, циклически проходя по документу раздел за разделом. Что мне нужно сделать, это запустить первый набор кода (который основан на Selection.Найти) в пределах, указанных вторым набором кода. Мое намерение состояло в том, чтобы зациклить код для определения диапазонов и, поскольку он идентифицирует каждый диапазон, запустить код, чтобы скопировать строки исходного текста в заголовки в этом диапазоне, но я не могу найти способ ограничить выбор.Найти поиск по определенному диапазону (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

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

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+ Страницы начального текста и оглавления]

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

Заголовок статьи 1 (Стиль: Заголовок2)
Переменные строки текста заголовка
Название источника статьи 1 (выделено жирным шрифтом)
Более переменные строки текста заголовка
Основной текст статьи
Разрыв страницы

Заголовок статьи 2 (Стиль: Заголовок2)
Переменные строки текста заголовка
Название источника статьи 2 (жирным шрифтом)
Более переменные строки текста заголовка
Основной текст статьи
Разрыв страницы

Заголовок раздела 2 (Стиль: Заголовок1)

Заголовок статьи 3 (Стиль: Заголовок2)
Переменные строки текста заголовка
Название источника статьи 3 (жирным шрифтом)
Более переменные строки текста заголовка
Основной текст статьи
Разрыв страницы

[...]

1 ответ1

0

В конце концов мне удалось решить эту проблему путем подсчета абзацев в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .