1

Тема: Как найти все вхождения слова с заданным форматированием

Как найти все вхождения слова с заданным форматированием, но при этом форматирование нужно получить, выделив это слово.
Например, выделим "бык",  а затем ищем всех оставшихся (в данном случае полужирных и курсивных) быков, а просто полужирных или просто курсивных не трогаем.
В двух словах: как получить информацию о форматировании выделенного слова?

2

Re: Как найти все вхождения слова с заданным форматированием

Понятие "форматирование" слишком общо и включает в себя форматирование шрифта, абзаца, нумерацию и т.д.
Если интересует только шрифт, то можно попробовать так:

With ActiveDocument.Range.Find
  .Text = Selection.Text 'выделенное слово
  .Font = Selection.Font 'Задаём шрифт. Если не получится, тогда нужно будет задавать отдельные элементы шрифта
  While .Execute
    'Что делать, если слово найдено
  Wend
End With

Код c коленки, не проверял, но идея такова.

Лучше день потерять — потом за пять минут долететь!

3

Re: Как найти все вхождения слова с заданным форматированием

viter.alex пишет:

.Font = Selection.Font

К сожалению, не работает. Основная проблема была именно считать формат: какое начертание, какой цвет, если есть... В справке по Word VBA свойство .Font по идее  возвращает форматирование выделения (Returns or sets a Font object that represents the character formatting of the specified object), но

msgbox Selection.Font

выдает ошибку.
Меня в основном интересует полужирность и курсив, поэтому придумал, как паллиатив, проверять исходное вхождение на эти 2 параметра.

With Selection.Font ' проверяем форматирование выделенной пометы
        If .Italic = True Then bItalic = True Else bItalic = False
        If .Bold = True Then bBold = True Else bBold = False
End With

А затем уже использовать эти переменные при поиске.

4

Re: Как найти все вхождения слова с заданным форматированием

MsgBox Selection.Font

и будет давать ошибку, т.к. нет преобразования из Font в строку.
Да, действительно с присвоением шрифта не работает. Вообще ничего не находит и ошибки не даёт. Тогда, как я уже и писал, нужно присваивать отдельные свойства шрифта.
В переменные записывать значения отдельных свойств шрифта нецелесообразно, если переменные больше нигде не используются:

With ActiveDocument.Range.Find
  .Text = Selection.Text 'выделенное слово
  .Font.Bold = Selection.Font.Bold
  .Font.Italic = Selection.Font.Italic
  .Font.Color = Selection.Font.Color
  While .Execute
    'Что делать, если слово найдено
  Wend
End With

А если всё-таки записывать, то гораздо понятнее будет такая запись:

With Selection.Font ' проверяем форматирование выделенной пометы
        bItalic = .Italic
        bBold = .Bold
End With
Лучше день потерять — потом за пять минут долететь!

5

Re: Как найти все вхождения слова с заданным форматированием

У меня на работе есть что-то подобное.. Во всяком случае - полужирность, курсив и подчеркнутость распознается.. И еще распознается цвет шрифта.. Если еще будет нужно, в понедельник вечером могу скинуть..

6

Re: Как найти все вхождения слова с заданным форматированием

viter.alex пишет:

В переменные записывать значения отдельных свойств шрифта нецелесообразно

Да, спасибо, это абсолютно решает вопрос! Подправлю.

andrkar пишет:

Если еще будет нужно, в понедельник вечером могу скинуть

Буду признателен, если поделитесь.

Отредактировано Денис (13.03.2010 23:00:46)

7

Re: Как найти все вхождения слова с заданным форматированием

Sub test()
With Selection.Font
        ИмяШрифта = .Name
        MsgBox ИмяШрифта
        РазмерШрифта = .Size
        MsgBox РазмерШрифта
        If .Bold = True And .Italic = True Then Шрифт = "полужирный курсив" Else: Шрифт = "Неизвестно"
        If Шрифт = "Неизвестно" And .Bold = True And .Italic = False Then Шрифт = "Полужирный"
        If Шрифт = "Неизвестно" And .Bold = False And .Italic = True Then Шрифт = "Курсив"
        If Шрифт = "Неизвестно" And .Bold = False And .Italic = False Then Шрифт = "Обычный"
        MsgBox Шрифт
        ЦШ = .Color
        Select Case ЦШ
            Case Is = wdColorAutomatic
                ЦветШрифта = "Авто"
            Case Is = wdColorBlack
                ЦветШрифта = "Черный"
            Case Is = wdColorBrown
                ЦветШрифта = "Коричневый"
            Case Is = wdColorOliveGreen
                ЦветШрифта = "Оливковый"
            Case Is = wdColorDarkGreen
                ЦветШрифта = "Темно-зеленый"
            Case Is = wdColorDarkTeal
                ЦветШрифта = "Темно-сизый"
            Case Is = wdColorDarkBlue
                ЦветШрифта = "Темно-синий"
            Case Is = wdColorIndigo
                ЦветШрифта = "Индиго"
            Case Is = wdColorGray80
                ЦветШрифта = "Серый 80%"
            Case Is = wdColorDarkRed
                ЦветШрифта = "Темно-красный"
            Case Is = wdColorOrange
                ЦветШрифта = "Оранжевый"
            Case Is = wdColorDarkYellow
                ЦветШрифта = "Коричнево-зеленый"
            Case Is = wdColorGreen
                ЦветШрифта = "Зеленый"
            Case Is = wdColorTeal
                ЦветШрифта = "Сине-зеленый"
            Case Is = wdColorBlue
                ЦветШрифта = "Синий"
            Case Is = wdColorBlueGray
                ЦветШрифта = "Сизый"
            Case Is = wdColorGray50
                ЦветШрифта = "Серый 50%"
            Case Is = wdColorRed
                ЦветШрифта = "Красный"
            Case Is = wdColorLightOrange
                ЦветШрифта = "Светло-оранжевый"
            Case Is = wdColorLime
                ЦветШрифта = "Травяной"
            Case Is = wdColorSeaGreen
                ЦветШрифта = "Изумрудный"
            Case Is = wdColorAqua
                ЦветШрифта = "Темно-бирюзовый"
            Case Is = wdColorLightBlue
                ЦветШрифта = "Темно-голубой"
            Case Is = wdColorViolet
                ЦветШрифта = "Фиолетовый"
            Case Is = wdColorGray40
                ЦветШрифта = "Серый 40%"
            Case Is = wdColorPink
                ЦветШрифта = "Лиловый"
            Case Is = wdColorGold
                ЦветШрифта = "Золотисный"
            Case Is = wdColorYellow
                ЦветШрифта = "Желтый"
            Case Is = wdColorBrightGreen
                ЦветШрифта = "Ярко-зеленый"
            Case Is = wdColorTurquoise
                ЦветШрифта = "Бирюзовый"
            Case Is = wdColorSkyBlue
                ЦветШрифта = "Голубой"
            Case Is = wdColorPlum
                ЦветШрифта = "Вишневый"
            Case Is = wdColorGray25
                ЦветШрифта = "Серый 25%"
            Case Is = wdColorRose
                ЦветШрифта = "Розовый"
            Case Is = wdColorTan
                ЦветШрифта = "Светло-коричневый"
            Case Is = wdColorLightYellow
                ЦветШрифта = "Светло-желтый"
            Case Is = wdColorLightGreen
                ЦветШрифта = "Бледно-зеленый"
            Case Is = wdColorLightTurquoise
                ЦветШрифта = "Светло-бирюзовый"
            Case Is = wdColorPaleBlue
                ЦветШрифта = "Бледно-голубой"
            Case Is = wdColorLavender
                ЦветШрифта = "Сиреневый"
            Case Is = wdColorWhite
                ЦветШрифта = "Белый"
        End Select
                MsgBox ЦветШрифта
End With
End Sub

в данном процедуре у выделенного фрагмента определяется - Шрифт, размер шрифта, начертание шрифта, цвет шрифта.. Вроде примерно то, что вам нужно было? Думаю, не составить труда поменять что-то для своих нужд???

8

Re: Как найти все вхождения слова с заданным форматированием

Несколько замечаний. Всё сделано правильно, за исключением того, что ни одна переменная не объявлена, переменные имеют кириллические имена и записей типа:

If .Bold = True Then

Это масло масляное. Достаточно написать:

If .Bold Then

или

If Not .Bold Then
Лучше день потерять — потом за пять минут долететь!

9

Re: Как найти все вхождения слова с заданным форматированием

согласен.. Просто писалось давно, когда только начинал.. В настройках еще не стоял флаг обязательного объявления переменных smile Да и кириллицей уже не присваиваю давно:) Ну и по приведенным конструкциям - обязательно будем учитывать в дальнейшем.. Благо, еще много чего предстоит написать в макросах.. smile