Перебрать предложение

Я хочу найти в нем предложение с синим текстом, выделить все предложение и удалить синие слова одно за другим. Мой код удаляет только первое синее слово в предложении, прежде чем перейти к оператору With.

Я ищу что-то вроде этого псевдокода:
While objSelectionChange.Sentences(1).Find.Font.Color = wdColorBlue
Это будет вложенный цикл while только для выбранное предложение

Do While True
objSelectionChange.Find.Forward = True
objSelectionChange.Find.Format = True
objSelectionChange.Find.Font.Color = wdColorBlue
objSelectionChange.Find.Execute
If objSelectionChange.Find.Found Then
    strg2 = objSelectionChange.Sentences(1).Text
    count = count + 1
    ReDim strgArray(count)
    strgArray(count) = objSelectionChange.Text
    MsgBox strgArray(count) & " Located In Array Index # " & count
    MsgBox strg2
    strg3 = Replace(strg2, strgArray(count), "")
    strg3 = Replace(strg3, "  ", " ")
    strg3 = Mid(strg3, 1, Len(strg3) - 2)
    MsgBox strg3
Else
    Exit Do
End If
    Set objRangeOrig = objDocOrig.Content
    '''''Search the string in the original manual'''''
    With objRangeOrig.Find
    .MatchWholeWord = False
    .MatchCase = False
    .MatchPhrase = True
    .IgnoreSpace = True
    .IgnorePunct = True
    .Wrap = wdFindContinue
    .Text = strg3
    .Replacement.Text = Left(strg2, Len(strg2) - 2)
    .Execute Replace:=wdReplaceOne
    End With
Loop

person Kurt Leadley    schedule 24.09.2015    source источник


Ответы (2)


Когда вы выполняете замену, .Replacement.Text представляет собой просто текстовую строку без форматирования. Любые последующие синие слова заменяются цветными = автоматическими словами (возможно, черными). Поэтому Find не может ничего найти после первой замены.

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

Dim rSearch As Range

Set rSearch = ThisDocument.Range

Do
    rSearch.Find.Forward = True
    rSearch.Find.Format = True
    rSearch.Find.Font.Color = wdColorBlue
    rSearch.Find.Execute
    If rSearch.Find.Found Then
        rSearch.Delete wdWord, 1
    Else
        Exit Do
    End If
Loop
person Dick Kusleika    schedule 24.09.2015
comment
Это сработало бы, если бы мне просто нужно было удалить слова, но мне нужно точно сопоставить 2 строки. Вот почему я удаляю синие слова. Исходная строка — это строка без синих слов, в которой я сравниваю. Мне трудно сформулировать это, и я на самом деле задавал этот вопрос раньше, но безуспешно. Вот ссылка со всей историей моего вопроса. Мне пришлось попытаться сузить свой вопрос, чтобы получить ответ, что вы и сделали. stackoverflow.com/questions/32619642/ - person Kurt Leadley; 29.09.2015

Обновите objSelectionChange внутри цикла, так как при первой замене он может измениться

person Shalvin Abraham    schedule 24.09.2015