Удалить выделенные пробелы

#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) рецензента о том, что некоторые тексты выделены (перед этим я должен очистить все ложноположительные выделения, то есть невидимые выделения, чтобы оставались только те, которые требуют внимания). Первоначально я думал, что выполню некоторую невидимую очистку символов (которые выделены), например, дважды выделенные пробелы, но это больше не мое внимание, поскольку это может испортить макет.