У меня есть текстовый документ на 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
Я ожидаю, что на выходе будет скопирован весь текст с определенным цветом выделения, вставлен в новый документ с сохранением всего форматирования, а затем разорвана страница. Вернитесь назад, выберите следующий цвет выделения и вставьте его в документ, пока не будут получены все цвета.
Я внес коррективы в ваш код, основываясь на том, что, как я понимаю, вы хотите сделать. В некоторых случаях я пытался сделать его немного более читабельным, например, я удалил один из методов 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
@NakaMichie, я отредактировал код, чтобы он захватил весь абзац форматированного текста, содержащий выделенную часть. Независимо от того, использую ли я один цвет выделения или три или более цветов, код работает нормально и не вызывает сбоев Word. У вас должна быть какая-то другая проблема в вашей системе.
Спасибо, думаю, это был тот компьютер, на котором я сидел. Пробовал в Word 2016, отлично работает. Спасибо!
Спасибо. Можешь объяснить, что ты здесь делал? Я новичок в этом, поэтому немного медленно. Я попробовал приведенный выше код, и он не копирует форматирование, а только выделенные области, и когда у меня есть более двух цветов, он сходит с ума, и MS Word аварийно завершает работу. Не уверен, что сделал что-то не так.