Форум по VBA, Excel и Word

Word => Макросы в Word => Тема начата: sashgera от 13 августа 2014, 22:01

Название: Количество обнаруженных символов в MsgBox
Отправлено: sashgera от 13 августа 2014, 22:01
Здравствуйте.
Есть макрос, который заливает кириллические символы красным цветом.
Не могу сделать так, чтобы в MsgBox выводилось количество обнаруженных кириллических символов.

Код
Sub Procedure_1()
    Dim myFindRange As Word.Range
    Dim myFind As Word.Find
    Set myFindRange = ActiveDocument.Range
    Set myFind = myFindRange.Find
    myFind.Text = "[А-ЯЁа-яё]"
    myFind.MatchWildcards = True
    myFind.Format = True
    myFind.Replacement.Font.Color = wdColorRed
    myFind.Execute Replace:=wdReplaceAll
   
    With CreateObject("vbscript.regexp") 'как правильно вывести в msgbox количество обнаруженных РУССКИХ символов?
    .Pattern = "[А-ЯЁа-яё]": .Global = True
    ActiveDocument.Range: n = n + myFind.Execute
    If n Then
  MsgBox "обнаружено русских букв: " & n
Else
  MsgBox "русских букв не обнаружено"
End If
  End With '
       
    End Sub
[свернуть]
Название: Re: Количество обнаруженных символов в MsgBox
Отправлено: Администратор от 13 августа 2014, 22:10
sashgera, почему у Вас в этой строке две открывающие квадратные скобки? Есть смысл в этом:?
myFind.Text = "[[А-ЯЁа-яё]"
Название: Re: Количество обнаруженных символов в MsgBox
Отправлено: sashgera от 13 августа 2014, 22:19

две открывающие квадратные скобки?
myFind.Text = "[[А-ЯЁа-яё]"
Очепятка, исправил.
Название: Re: Количество обнаруженных символов в MsgBox
Отправлено: Администратор от 13 августа 2014, 22:32
Ваш вопрос частый - как узнать, сколько было замен. Но в VBA-Word не предусмотрено инструмента для этой задачи. Команда "ReplaceAll" делает замену, но не даёт информацию, сколько было замен.

Поэтому нужно использовать обходные пути. Предложу свой обходной путь:

Макрос
Sub Procedure1()

    Dim rngCursor As Word.Range
    Dim myFind As Word.Find
    Dim lngCount As Long
   
   
    'Отключение обновления монитора - может это ускорит работу макроса.
    Application.ScreenUpdating = False
   
    'Вставка виртуального курсора (которого не видно на мониторе, но который будет
        'находиться в документе) в начало файла. Затем этот курсор будет перемещаться.
    'Назначение VBA-имени виртуальному курсору. Назначаем имя "rngCursor".
    Set rngCursor = ActiveDocument.Range(Start:=0, End:=0)
   
    'Создание и VBA-наименование объекта, который будет вести поиск.
    'Этот объект будет связан с виртуальным курсором.
    Set myFind = rngCursor.Find
   
    'Настройка объекта "myFind".
    myFind.Text = "[А-ЯЁа-яё]"
    myFind.MatchWildcards = True
       
    'Собственно поиск и закраска.
   
    'Поиск будет вестись от начала документа и до конца.
    'В этом коде нигде явно не указано, что нужно остановить поиск, дойдя до конца документа,
        'но это произойдёт само по себе.
   
    'Команда "myFind.Execute" осуществляет поиск.
    'Если будет найдено, то команда "myFind.Execute"  даст "True".
    Do While myFind.Execute = True
       
        'Подсчитываем.
        'Будет находиться именно один символ, а не сразу несколько символов.
        lngCount = lngCount + 1
       
        'Если будет найдено, то виртуальный курсор окружит найденный символ
            '(похоже на то, как пользователь в файле выделяет символ).
        'Выделяем цветом.
        rngCursor.Font.ColorIndex = wdRed
       
        'Смещаем виртуальный курсор вправо (в Word аналогично, если нажать клавишу "Стрелка вправо",
            'когда выделен символ), чтобы продолжить дальше поиск.
        rngCursor.Collapse Direction:=wdCollapseEnd
       
    Loop
   
    'Обновляем монитор, чтобы изменения были видны на мониторе до появления сообщения,
        'чтобы было удобнее пользователю.
    Application.ScreenRefresh
   
    'Включение обновления монитора.
    Application.ScreenUpdating = True
   
    'Сообщение.
    MsgBox "Было найдено: " & lngCount

End Sub
[свернуть]
Название: Re: Количество обнаруженных символов в MsgBox
Отправлено: sashgera от 13 августа 2014, 22:53
Спасибо, все работает.