#vba #ms-office #word
#vba #ms-office #word
Вопрос:
Так что я полный новичок, когда дело доходит до использования VB. Я пытаюсь выделить слово, когда за ним не следует другое конкретное слово в следующих двух словах. Я попробовал следующий код, но, похоже, это только первое слово. Заранее большое спасибо.
Sub fek()
'
'
'
'
Selection.Find.ClearFormatting
With Selection.Find
.Text = "n."
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
If Selection.Find.Found = True Then
With Selection.Range
.MoveStart wdWord, 2
End With
With Selection.Find
.Text = "fek"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
End If
If Selection.Find.Found = False Then
Selection.Range.HighlightColorIndex = wdYellow
End If
End Sub
Ответ №1:
Приведенный ниже код должен делать то, что вы хотите. Вы должны иметь в виду, что то, что Word определяет как a Word
, может отличаться от того, что сделал бы человек, например, IP-адрес считается как 7 слов!
Sub fek()
Dim findRange As Range
Dim nextWords As Range
Set findRange = ActiveDocument.Content
With findRange.Find
.ClearFormatting
.Text = "n."
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
Do While .Execute = True
'findRange is now the range of the match so set nextWords to the 2 next words
Set nextWords = findRange.Next(wdWord)
nextWords.MoveEnd wdWord, 3
'look for the specific text in the next two words
If InStr(nextWords.Text, "fek") = 0 Then findRange.HighlightColorIndex = wdYellow
'collapse and move findRange to the end of the match
findRange.Collapse wdCollapseEnd
findRange.Move wdWord, 4
Loop
End With
End Sub
Комментарии:
1. Просто измените
nextWords.MoveEnd wdWord
наnextWords.MoveEnd wdWord, 3
2. Спасибо за ваш ответ. Код, казалось, работал изначально, но, похоже, он выделяет слово независимо от того, находится ли рядом слово fek. Я расширил диапазон, основываясь на том, что вы сказали о том, как word подсчитывает слова, но, похоже, это не имеет никакого значения. Я использую это на греческом языке — я не знаю, может ли это быть проблемой, но оно отлично работает с другими частями кода.
3. Пожалуйста, смотрите отредактированный ответ. Сначала я неправильно понял, что вы хотели, и когда я понял, что вы хотите выделить начальное слово, только если следующего слова не было, я быстро изменил логику, забыв, что
InStr
тогда это не будет равно True / False . Код в моем ответе работает в моем тестировании, хотя я не тестирую его на греческом тексте.4. Это отлично работает и на греческом языке тоже. Я действительно благодарен!
Ответ №2:
Следующее, вероятно, будет значительно быстрее, если в документе много строк «n».:
Sub Demo()
Application.ScreenUpdating = False
Dim i As Long
i = Options.DefaultHighlightColorIndex
Options.DefaultHighlightColorIndex = wdYellow
With ActiveDocument.Range
With .Find
.Forward = True
.Format = False
.MatchCase = False
.Wrap = wdFindContinue
.MatchWildcards = True
.ClearFormatting
.Replacement.ClearFormatting
.Replacement.Highlight = True
.Text = "n."
.Replacement.Text = "^amp;"
.Execute Replace:=wdReplaceAll
.Replacement.Highlight = False
.Text = "n.[^s ]@fek"
.Execute Replace:=wdReplaceAll
.Text = "n.[^s ]@[!^s ]@fek"
.Execute Replace:=wdReplaceAll
.Text = "n.[^s ]<[!^s ]@>[^s ]@fek"
.Execute Replace:=wdReplaceAll
.Text = "n.[^s ]<[!^s ]@>[^s ]@[!^s ]@fek"
.Execute Replace:=wdReplaceAll
End With
End With
Options.DefaultHighlightColorIndex = i
Application.ScreenUpdating = True
End Sub