Word VBA — найдите текстовую строку, в которой одно слово (не все слова в строке) имеет определенный стиль или формат

#replace #ms-word

Вопрос:

Я пытался создать некоторый код для поиска текста, в котором одно слово в тексте имеет определенный формат или стиль. Например, я хотел бы выполнить поиск текста «Привет, мир, все хорошо», но только в тех случаях, когда слово «все» выделено жирным шрифтом.

Я подумал о поиске первых нескольких слов «Привет, мир «; сворачивании выделения, поиске следующих трех символов вперед для слова «все» полужирным шрифтом; сворачивании выделения (если верно), а затем поиске следующего бита для слов «хорошо». Это привело бы к тому, что вся фраза была бы выделена жирным шрифтом, но это кажется действительно неэффективным и не очень гибким. Кроме того, чтобы затем выбрать все предложение целиком, мне нужно написать код, чтобы переместить выделение обратно в начало и расширить выделение вперед. Затем мне нужно сбросить поиск, чтобы продолжить движение вперед с этой позиции.

Есть ли какой-нибудь простой/простой/более элегантный способ поиска строки, в которой только одно слово в строке имеет определенные свойства, такие как жирный шрифт? Я специально хочу, чтобы поиск игнорировал те случаи фразы, в которых соответствующее слово не выделено жирным шрифтом.

Я потратил несколько часов на поиск в Google и stackflow и ничего не могу найти по этому поводу.

Я не публиковал код, потому что я не очень хорошо пишу код, и я действительно хочу понять, существует ли гибкий/элегантный способ делать то, что я хочу. Негибкий корень, который я объяснил выше, настолько негибок, что я не хочу утруждать себя кодированием чего-либо.

Спасибо, Джереми

Ответ №1:

Метод, который я бы использовал, заключается в поиске строки и, если она найдена, затем в строке найдите слово. Вот пример.

 Sub Demo()  Dim StringRange As Range  Dim MatchFound As Boolean    With ActiveDocument.Range.Find  ' The string to find  .Text = "Hello world, all is good"    ' Search the document  Do While .Execute  ' Capture the string  Set StringRange = .Parent.Duplicate    With .Parent.Duplicate.Find  ' The word to find  .Text = "all"  .Font.Bold = True    ' Search the string  If .Execute Then  MatchFound = True  StringRange.Select    If MsgBox("Match found. Continue searching?", vbQuestion   vbYesNo) = vbNo Then  Exit Sub  End If  End If  End With  Loop    If MatchFound Then  MsgBox "Finished searching document", vbInformation  Else  MsgBox "No match found", vbInformation  End If  End With End Sub  

Комментарии:

1. Вау. Огромное спасибо. Это именно то, что я хотел сделать. С вашей стороны невероятно великодушно написать такой код. Спасибо. Я удивлен, что этот вопрос не возникает более регулярно. Еще раз спасибо вам. Это абсолютно идеально.