#vba #ms-word
Вопрос:
У меня есть документ, в котором я хочу начать поиск в разделе 3 до конца документа, и выделенный жирным шрифтом текст на основе моего пользовательского стиля, поскольку другие используемые стили могут содержать то же слово, которое я не хочу выделять жирным шрифтом, включая возможность заголовка/раздела.
У меня есть код VBA, который работает, находя мой пользовательский стиль по всему документу и выделяя его жирным шрифтом только для одного соответствия стилю. Однако, в .Стиль в стиле .find не позволяет указывать стиль подстановочных знаков, т. Е. мой пользовательский набор стилей «Requirement1 через Requirement9», которые основаны на стиле заголовков 1-9. Я предполагаю, что мне придется создать цикл for за пределами «с», который находит мой пользовательский стиль, который передается по одному за раз, чтобы выделять текст жирным шрифтом в соответствии с одним стилем за раз, т. е. с требованиями от 1 до 9. Есть ли лучший способ? см. Код ниже.
Следующий вопрос-сфокусировать поиск этого текста на выделении жирным шрифтом, чтобы начать в определенном разделе до конца документа. Для меня его раздел 3 до конца документа или до тех пор, пока он не встретит другой стиль, определенный как Appendix1, и остановится. У меня есть пользовательские стили Appendix1 через Appendix9, которые также основаны на заголовках 1-9. Причина поиска по стилю в качестве отправной точки заключается в том, что эти другие разделы перед разделом 3 или описательный текст в разделе 3 и далее могут содержать слово, которое я пытаюсь выделить жирным шрифтом, чего я не хочу делать, за исключением случаев, когда было применено мое конкретное пользовательское требование к стилю 1-9, которое используется в разделе 3 и далее. Пытаясь реализовать эту часть, прежде чем выполнять поиск слов и выделение жирным шрифтом, я искал на основе стиля «Заголовок 1», и когда я нашел третий, я знаю, что нахожусь в разделе 3. Я не могу использовать поиск VBA «разделы», так как он включает все подразделы документа, которые могут варьироваться от документа к документу, и указывает разделы.пункт(3) не означает, что я получу третий раздел моего документа, соответствующий третьему стилю Заголовка1.
Поскольку я не настолько хорошо разбираюсь в различных разделах VBA,абзацах,предложениях, символах и всем остальном, когда применяю «диапазон» либо до, после, либо и то, и другое в любом из них (кажется, никогда не работает так, как ожидаешь. Даже инструменты подсказок VBA говорят, что это можно сделать, но время выполнения говорит об ошибке) Я начал с указания начала/конца всего диапазона activedocument.range. Затем я выполняю «.find» стиля «Heading1» в цикле for три раза, который их находит. Затем я пытаюсь присвоить последнее значение найденного диапазона Heading1 в качестве начального значения для использования в следующем встроенном «поиске», который будет выполнять поиск и применять полужирный шрифт к стилю «Requirement1». (Возможно, потребуется создать цикл для поиска стилей Requirement1-9, как указано выше). Чтобы помочь мне понять, где я нахожусь, я пытаюсь сбросить данные с помощью debug.print положение диапазона, но он сбрасывает весь текст документа в окно отладки, а не целое значение, которое я думал получить. В чем проблема с этим? Я даже попытался использовать selection.range и сбросить полученный текст в окно debug.print, но безуспешно. Это усугубляет ситуацию, так как время обработки, кажется, длится вечно. wdFindStop также не заставляет находку останавливаться на третьей находке.
Итак, как: а). найдите и сбросьте позицию диапазона в окно отладки вместе с текстом в этой позиции. И номер, и текст сообщат мне, где я нахожусь. в). Как назначить позицию диапазона на основе поиска третьей позиции «Заголовок 1» в документе, чтобы вторая «с» могла выполнять поиск и применять выделение жирным шрифтом к тексту, который я хочу выделить жирным шрифтом. d). Как выполнить поиск по подстановочным знакам на .Стиль, определенный пользователем в стиле Requirement1-9,вместо того, чтобы создавать цикл for для поиска по одному за раз?
Ниже приведен код VBA, который я написал.
Attribute VB_Name = "BoldMustShall2_M"
Option Explicit
Public Sub BoldMustShall2()
' If .Parent.Bold = True is used with wdReplaceall, the whole
' document is bolded even when the sentence doesn't have any of the words
' being searched for.
Dim myRange, rngSel As Range
Dim oDoc As Word.Document
Dim pos1, pos2 As Long
Dim numchars As Long
Set oDoc = ActiveDocument
Set rngSel = Selection.Range
Application.ScreenUpdating = False
'Set the starting Heading to search as Section 3
pos1 = oDoc.Range.Start
pos2 = oDoc.Range.End
Set myRange = oDoc.Range(Start:=pos1, End:=pos2)
'Another way is to find the "Heading1" style and set the range start to the third one found which is section 3.
'Counting Word sections can vary alot so its not the best way.
'The same would apply if Appendix1 style is used and assuming that requiremens start in the third one.
Debug.Print "My Start Range " myRange
With myRange
.TextRetrievalMode.IncludeFieldCodes = False ' don't want to search fieldcodes for must/shall
.TextRetrievalMode.IncludeHiddenText = False ' don't want to search hiddentext for must/shall
' Get the range position for Heading1 style for section 3 of PRD.
Dim i As Integer
Dim ReqHDR As Range
Dim bFind As Boolean
With .Find
.ClearFormatting
.Forward = True
'.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = True
.MatchWildcards = False
.Style = "Heading1"
'Loop three times for Style
For i = 1 To 3 Step 1
'bFind = .Execute
.Execute Wrap:=wdFindStop
If .Found = True Then
rngSel = oDoc.Range 'This should be the current position in the Document for the requirements.
' When found it outputs the message once
Debug.Print "Found a Heading1 style "
.Replacement.Font.Size = 20
End If
'.Wrap = wdFindStop
Next i
End With
Debug.Print "End of Heading1 Search "
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = True
.MatchWildcards = False
.Replacement.Font.Bold = True
.Replacement.Font.Name = "Times New Roman"
.Replacement.Font.Size = 12
.Replacement.Font.Italic = True
'.Style = "Requirement1" ' A loop is needed to cycle thru all the Requirement1-9 styles. No wildcard.
'.Style = wdStyleNormal
.Replacement.Text = "^amp;" ' This is the contents of the find what box in word.
' In this case the .find.text "must" statement.
' Alternate is to specify "must" or "shall" but this
' would require two replace.text statements instead of
' just this one. The ^amp; is a special command that eliminates
' the need to set the replacement.Text info.
'.Text = "must"
.Execute FindText:="must", Replace:=wdReplaceAll
If .Found = True Then
' When found it outputs the message once
Debug.Print "Found one or more must "
End If
'.Text = "shall"
.Execute FindText:="shall", Replace:=wdReplaceAll
If .Found = True Then
' When found it outputs the message once
Debug.Print "Found one or more shall "
End If
End With
End With
Application.ScreenUpdating = True
Debug.Print "Completed searching for must/shall in document."
End Sub
Комментарии:
1. Я предлагаю вам сузить свой вопрос до одной проблемы за раз. И предоставьте некоторые примеры данных и скриншоты . Также не забудьте принять ответы на предыдущие вопросы, если они действительно помогли вам
Ответ №1:
Предполагая, что, когда вы ссылаетесь на «Разделы», вы имеете в виду части вашего документа, очерченные разрывами разделов, возможно, что-то вроде:
Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, i As Long
With ActiveDocument
Set Rng = .Range(.Sections(3).Range.Start, .Range.End)
With .Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Replacement.Text = ""
.Forward = True
.Format = True
.Wrap = wdFindContinue
.Style = "Appendix1"
.Execute
End With
Rng.End = .Start
End With
With Rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Format = True
.Replacement.Style = "Strong"
.Wrap = wdFindStop
.Replacement.Text = "^amp;"
.Text = "must"
For i = 1 To 9
.Style = "Requirement" amp; i
.Execute Replace:=wdReplaceAll
Next
.Text = "shall"
For i = 1 To 9
.Style = "Requirement" amp; i
.Execute Replace:=wdReplaceAll
Next
End With
End With
Application.ScreenUpdating = True
End Sub
Обратите внимание, что вместо использования жесткого форматирования для замены я просто применил встроенный «Сильный» стиль Word. Ваш собственный код также должен использовать стиль, будь то «Сильный» стиль Word или другой стиль символов по вашему собственному определению.