#vba #loops #replace #ms-word #selection
#vba #циклы #заменить #ms-word #выбор
Вопрос:
Я пытаюсь удалить выделенные символы пробела из текста Word с помощью макроса, но он зависает / зацикливается всякий раз, когда встречает некоторые комментарии или URL-адреса (не все). Как это возможно? И каким будет решение?
Sub checkforHighlightsOrg()
Application.ScreenUpdating = False
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "^s $" ' highlighted text having multiple white-space/invisible chars only
Selection.Find.ClearFormatting
Selection.Find.Highlight = True
With Selection.Find
.text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
.Replacement.Highlight = True
.Replacement.ClearFormatting
End With
Dim bReplaced As Boolean
bReplaced = False
Do While Selection.Find.Execute = True
If Selection.Find.Found Then
If regex.Test(Selection.text) Then
bReplaced = True
Selection.text = regex.Replace(Selection.text, "")
End If
End If
DoEvents
Loop
If bReplaced Then MsgBox "Highlighted white-spaces have been removed."
Set rngTemp = ActiveDocument.Range
With rngTemp.Find
.ClearFormatting
.Highlight = True
.Forward = True
.Execute
End With
If rngTemp.Find.Found = True Then
MsgBox ("There have been non-white-space highlights found.")
End If
Application.ScreenUpdating = True
End Sub
Другая версия, которую я пробовал, выглядит следующим образом:
Sub checkforHighlightsV2()
Application.ScreenUpdating = False
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "s " ' highlighted text having multiple white-space/invisible chars only
ActiveDocument.Select
Dim regex2 As Object, str As String
Set regex2 = CreateObject("VBScript.RegExp")
With regex2
.Pattern = "s"
.Global = True 'If False, would replace only first
End With
Selection.Find.ClearFormatting
Selection.Find.Highlight = True
With Selection.Find
.text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
.Replacement.Highlight = True
.Replacement.ClearFormatting
End With
Dim bReplaced As Boolean
bReplaced = False
Dim a As Range
restart:
Do While Selection.Find.Execute = True
If Selection.Find.Found Then
'Selection.MoveEnd wdParagraph, 1
Set a = Selection.Range.Duplicate
'Debug.Print Asc(a.text)
'a.MoveEnd wdCharacter, -1
Dim res As String
If regex.Replace(Replace(a.text, Chr(160), ""), "") = "" Then
Debug.Print "empty"
Selection.Delete
End If
' If a.text = vbCr Or a.text = vbLf Or a.text = vbCrLf Or a.text = vbNewLine Or a.text = vbTab Then
' ' Debug.Print "newline"
' bReplaced = True
' Selection.Delete
' GoTo restart
'
' End If
' If a.text = " " Then Selection.Delete
'
''
'' If regex.Test(a.text) Then
'' bReplaced = True
'' 'a.text = regex.Replace(a.text, "")
'' Selection.Delete
''
'' End If
End If
DoEvents
Loop
If bReplaced Then MsgBox "Highlighted white-spaces have been removed."
Set rngTemp = ActiveDocument.Range
With rngTemp.Find
.ClearFormatting
.Highlight = True
.Forward = True
.Execute
End With
If rngTemp.Find.Found = True Then
MsgBox ("There have been non-white-space highlights found, this usually means default text.")
End If
Application.ScreenUpdating = True
End Sub
Сначала я думал, что мне не следует заменять текст при активном выборе поиска, поэтому я попытался исправить это, создав версию 2 и вызвав selection .удалить, но почему-то это тоже не работает.
Обычный диалог поиска никогда не зацикливается, но символ пробела там не разрешен. Спасибо за вашу помощь.
Редактировать: я также попробовал это (удаляет только выделение; не удаляет пробелы, также при наличии новой строки / нового абзаца, который выделяется всякий раз, когда я нажимаю enter для вставки текста — это говорит о том, что разметка / выделение активны для символа новой строки / абзаца — я попробовал несколько вариантовнапример, ^w ^ p, но я не могу использовать его в сочетании с опцией «Использовать подстановочные знаки», когда я хочу использовать оператор OR)
Sub Macro6()
'
' Macro6 Macro
'
'
Selection.Find.ClearFormatting
Selection.Find.Highlight = True
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = False
With Selection.Find
.Text = "^w"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Последняя версия:
Sub RemoveHighlightedWhiteSpace()
Application.ScreenUpdating = False
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Highlight = True
.Replacement.Highlight = False
.text = "[ ,^9,^11,^12,^13," amp; Chr(160) amp; "," amp; Chr(164) amp; "]{2,}"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
Комментарии:
1. Вы пробовали выполнять расширенный поиск в Word, используя ^w в качестве текста поиска?
2. Да, я пытался, я отредактировал сообщение с таким результатом.
3. ^ w найдет табуляцию, пробел, неразрывный пробел и 1/4 em пробел. Если оставить текст замены пустым, эти символы будут удалены, а не просто удалено выделение. Какие символы, в частности, вы хотите заменить?
4. Он удаляет выделение, но когда я указываю мышью / курсором в середине страницы (в левой части она ранее была выделена желтым цветом) по горизонтали, он остается там мигающим, что говорит о том, что пустая замена не выполняется?
5. Это работает для меня в O365. Какие символы, в частности, вы хотите заменить?
Ответ №1:
Попробуйте приведенный ниже код. Единственный символ, который я не могу найти способ включить, — это vbLf .
Чтобы удалить выделение, вам нужно использовать Format = True
, но это не приведет к удалению символов, поэтому их необходимо запускать отдельно.
Sub DeleteHighlightedWhiteSpace()
'finds at least any 2 of vbTab, vbVerticalTab, vbFormFeed, vbCr, non-breaking space
Application.ScreenUpdating = False
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Highlight = True
.text = "[ ,^9,^11,^12,^13," amp; Chr(160) amp; "]{2,}"
.Replacement.text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
Sub RemoveHighlighting()
Application.ScreenUpdating = False
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Highlight = True
.Replacement.Highlight = False
.Forward = True
.Wrap = wdFindContinue
.Format = True
.Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
РЕДАКТИРОВАТЬ: то, чего вы пытаетесь достичь, все еще неясно. Из ваших комментариев кажется, что вы пытаетесь удалить все выделения из всего документа. Если это так, то есть простой способ сделать это:
Sub RemoveAllHighlighting()
Dim story As Range
For Each story In ActiveDocument.StoryRanges
story.HighlightColorIndex = wdNoHighlight
Next story
End Sub
Комментарии:
1. Спасибо. Я пришел к выводу, что не очень полезно удалять эти выделенные пробелы (это испортило бы макет). Я немного изменил вашу версию (см. Основной пост). Он по-прежнему не удаляет невидимое выделение из ячеек таблицы (я использовал ^ 7 и chr (164) в качестве маркера «конца ячейки», первый, по-видимому, не разрешен). Моя цель — очистить все выделения для пробелов, которые работают почти сейчас, за исключением тех, которые находятся в ячейках. После этого мне нужно найти незаполненные пробелы. но [! ^w] не работает.
2. @Mat90 — до сих пор неясно, какова ваша точная цель здесь. Было бы лучше, если бы вы включили в свой вопрос скриншоты, показывающие до / после.
3. @Mat90 — Если все, что вы хотите сделать, это удалить все выделения из документа, то это именно то, что делает процедура RemoveHighlighting в моем ответе.
4. Да, это работает, после замены, за исключением «пустых» ячеек (когда я ищу выделение, оно находит их в ячейках)
5. Спасибо за вашу помощь. Цель состоит в том, чтобы удалить все выделения на невидимых символах. Поэтому при нажатии return я не начинаю печатать с включенным выделением. После этого мне нужно предупредить (messagebox) рецензента о том, что некоторые тексты выделены (перед этим я должен очистить все ложноположительные выделения, то есть невидимые выделения, чтобы оставались только те, которые требуют внимания). Первоначально я думал, что выполню некоторую невидимую очистку символов (которые выделены), например, дважды выделенные пробелы, но это больше не мое внимание, поскольку это может испортить макет.