1

Тема: Подобие автозамены на VBA

Здравствуйте.
Подскажите пожалуйста в каком направлении думать. Необходим алгоритм напоминающий автозамену , после окончания ввода слова начинающегося с * (или другого префикса), слово обрабатывается и заменяется на результат работы формулы.

Например:
*40/60/15 заменяется на 0.036 куб.м
*10-56 заменяется на десять рублей 56 копеек
*10.11.12 заменяется на 10 ноября две тысячи двенадцатого года

Саму обработку сделать не проблема, а вот каким образом передать макросу введённое слово для проверки на присутствие префикса не знаю. Какое событие соответствует окончанию ввода слова не понятно, скорее всего надо отслеживать нажатие пробела или enter. Можно префикс внести в список автозамены и обработать срабатывание AutoCorrect, но такого события не нашёл.

2

Re: Подобие автозамены на VBA

Зачем нагружать Word макросами слежения? Проще назначить сочетание клавиш макросу (или одну, на время набора): ввел слово - нажал клавишу - получил результат. Если ваша цель - ускорить набор текста, то быстрее не будет, появятся запинки из-за работы макроса. Можно сделать так, что если нечего не выбрано, макрос работает с текстом под курсором, если выбран фрагмент, то макрос работает все помеченное в нем.

Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Подобие автозамены на VBA

Спасибо за ответ.
Пока стоял в пробке вспомнил про smart-tag'и, но поразмыслив осознал что Вы всё-таки правы, лучший вариант назначить на кнопку * запуск макроса. Но в ворде раньше не прогал, в основном эксель аксес. Не подскажете как передать в макрос не выделенное слово а то на котором просто в любом месте стоит курсор?

Sub AutoOpen()
CustomizationContext = ActiveDocument
KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyNumericMultiply), KeyCategory:=wdKeyCategoryMacro, Command:="Test"
End Sub

Sub Test()
MsgBox Selection.Text
End Sub

Sub AutoClose()
KeyBindings.ClearAll
End Sub

4

Re: Подобие автозамены на VBA

Vopitel пишет:

...как передать в макрос не выделенное слово а то на котором просто в любом месте стоит курсор?...

Слово где курсор:

Selection.Words.First.Text

Но в ваших примерах не одно слово! Например, "40/60/15" - это пять слов - 40, /, 60, /, 15. Можно попробовать брать текст от курсора до пробела:

With Selection.Words.First
        .MoveStartUntil CSet:=" ", Count:=wdBackward
        MsgBox .Text
    End With

Но тоже не всегда прокатит. Надо знать, что у вас за текст, чтобы опираться на набор знаков. Например так:

    With Selection.Words.First
        Do While .Start > 0
            If Not (.Previous.Text Like "[A-ZА-ЯЁа-яё0-9/.-]") Then Exit Do
            .MoveStart Unit:=wdWord, Count:=-1
        Loop
        MsgBox .Text
    End With
Макросы под заказ и готовый пакет - mtdmacro.ru

5

Re: Подобие автозамены на VBA

Спасибо.
А ведь точно, не одно слово получается, придётся брать от пробела до пробела. Опыт всё-таки великое дело. Теперь на выходных будет чем заняться  big_smile