Word VBA для копирования определенных выделенных цветов и вставки в новый документ без потери форматирования

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

То, что я пытаюсь сделать, это отфильтровать документ, выбрать все абзацы, которые содержат определенный цвет, а затем вставить его в новый документ, сохраняя все форматирование на месте. Затем он снова проходит через цикл, выбирает следующую цветовую подсветку и вставляет ее в тот же новый документ с разрывом страницы между ними или просто в новый документ вместе. Я пытался понять это в течение 2 дней.

Я пробовал формулы из этого Word VBA копирует выделенный текст в новый документ и сохраняет форматирование и другие в Stack Overflow, но ни одна из них не сохраняет все форматирование или ту, которую я обнаружил, я мог только скопировать весь документ с форматированием и вставить, но не выбранные основные моменты.

Это делает свое дело, но удаляет все форматирование и не может понять, как разместить разрыв страницы.

Sub ExtractHighlightedTextsInSameColor()
  Dim objDoc As Document, objDocAdd As Document
  Dim objRange As Range
  Dim strFindColor As String
  Dim highliteColor As Variant
  highliteColor = Array(wdYellow, wdTeal)

  Set objDoc = ActiveDocument
  Set objDocAdd = Documents.Add

  objDoc.Activate

  For i = LBound(highliteColor) To UBound(highliteColor)
   With Selection
   .HomeKey Unit:=wdStory
    With Selection.Find
       .Highlight = True
      Do While .Execute
        If Selection.Range.HighlightColorIndex = highliteColor(i) Then
         Set objRange = Selection.Range
         objDocAdd.Range.InsertAfter objRange & vbCr
         Selection.Collapse wdCollapseEnd
        End If
      Loop
     End With
    End With
   Next
  End Sub

'Это копирует только весь текст в документе, а не только highliteColor запрошенный

    Sub HighlightedColor()
    Dim objDoc As Document, objDocAdd As Document
    Dim objRange As Range
    Dim highliteColor As Variant
    highliteColor = Array(wdYellow, wdTeal, wdPink)

    Set objDoc = ActiveDocument
    Set objDocAdd = Documents.Add

    objDoc.Activate

    For i = LBound(highliteColor) To UBound(highliteColor)
      With Selection
      .HomeKey Unit:=wdStory
        With Selection.Find
          .Highlight = True
          Do While .Execute
            If Selection.Range.HighlightColorIndex = highliteColor(i) Then
              Set objRange = Selection.Range.FormattedText
              objRange.Collapse wdCollapseEnd
              objDocAdd.Content.FormattedText = objRange
            End If
           Loop
         End With
        End With
     Next

     End Sub

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
666
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я внес коррективы в ваш код, основываясь на том, что, как я понимаю, вы хотите сделать. В некоторых случаях я пытался сделать его немного более читабельным, например, я удалил один из методов With.

Посмотрите внимательно на использование FormattedText и на то, как он переносится из одного диапазона в другой. А также посмотрите в конце подпрограммы, как вставляется разрыв страницы.

Sub ExtractHighlightedTextsInSameColor()
    Dim objDoc As Document, objDocAdd As Document
    Dim objRange As Range
    Dim strFindColor As String
    Dim highliteColor As Variant
    Dim i As Long

    highliteColor = Array(wdYellow, wdTeal)

    Set objDoc = ActiveDocument
    Set objDocAdd = Documents.Add
    Set objRange = objDocAdd.Content


    For i = LBound(highliteColor) To UBound(highliteColor)
        objDoc.Activate
        Selection.HomeKey unit:=wdStory
        objRange.Collapse wdCollapseEnd
        With Selection.Find
            .ClearFormatting
            .Forward = True
            .Format = True
            .Highlight = True
            .Wrap = wdFindStop
            .Execute
            Do While .found
                If Selection.Range.HighlightColorIndex = highliteColor(i) Then
                ' the following copies only the highlighted text
                ' objRange.FormattedText = Selection.Range.FormattedText
                'if you want the entire paragraph that contains a highlighted text item then use this
                    objRange.FormattedText =  Selection.Range.Paragraphs(1).Range.FormattedText

                    Selection.Collapse wdCollapseEnd
                    objRange.InsertParagraphAfter
                    objRange.Collapse wdCollapseEnd
                Else
                    objRange.Collapse wdCollapseEnd
                End If
                .Execute
            Loop
        End With
        objRange.Collapse wdCollapseEnd
        If i < UBound(highliteColor) Then
            'added a conditional check so an extra page break is not inserted at end of document
            objRange.InsertBreak Word.WdBreakType.wdPageBreak
        End If
    Next
  End Sub

Спасибо. Можешь объяснить, что ты здесь делал? Я новичок в этом, поэтому немного медленно. Я попробовал приведенный выше код, и он не копирует форматирование, а только выделенные области, и когда у меня есть более двух цветов, он сходит с ума, и MS Word аварийно завершает работу. Не уверен, что сделал что-то не так.

NakaMichie 30.05.2019 01:12

@NakaMichie, я отредактировал код, чтобы он захватил весь абзац форматированного текста, содержащий выделенную часть. Независимо от того, использую ли я один цвет выделения или три или более цветов, код работает нормально и не вызывает сбоев Word. У вас должна быть какая-то другая проблема в вашей системе.

Rich Michaels 30.05.2019 03:44

Спасибо, думаю, это был тот компьютер, на котором я сидел. Пробовал в Word 2016, отлично работает. Спасибо!

NakaMichie 30.05.2019 04:42

Другие вопросы по теме