Макрос Word. Поиск слов

Программирование на Visual Basic for Applications
GolovanovD
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 16.10.2008 (Чт) 20:49

Макрос Word. Поиск слов

Сообщение GolovanovD » 16.10.2008 (Чт) 20:55

Доброго всем времени суток.

Задача: поиск в форматированном пробелами тексте фразы и размещение в определённом месте под ней другой фразы (подписи) с сохранением форматирования. Длина форматированной строки – 61 символ.

С VisualBasic’ом я раньше почти не сталкивался, но, немного поразмыслив, накидал следующий код:

Код: Выделить всё
Function DuplicateRes()
    RES_STR_LEN = 61 ' длина форматированной пробелами строки
    With Selection.Find
        .Text = "R E S U L T   S U M M A R Y" ' основная фраза
        .Replacement.Text = ""
    End With
    ResStr = "( Р Е З У Л Ь Т А Т Ы )" ' подпись
    Dim ResLen As Long                 ' длина подписи
    ResLen = Len(ResStr)
    ' запоминаем изначально выделенный диапазон
    Dim SelRange As Range
    Set SelRange = Selection.Range
    ' цикл поиска
    While Selection.Find.Execute
        ' смещаемся вниз, перемещаемся в начало строки
        Selection.MoveDown Unit:=wdLine, Count:=3
        Selection.HomeKey Unit:=wdLine
        ' размещаем подпись посередине без потери форматирования
        Selection.MoveRight Unit:=wdCharacter, _
            Count:=Fix((RES_STR_LEN - ResLen) / 2)
        Selection.Delete Unit:=wdCharacter, Count:=ResLen
        Selection.TypeText Text:=ResStr
        ' выделяем диапазон для дальнейшего поиска
        Selection.SetRange Start:=Selection.Start, End:=SelRange.End
    Wend
    ' восстанавливаем выделение
    Selection.SetRange Start:=SelRange.Start, End:=SelRange.End
End Function

Sub AutoPIPE_DuplicateRes()
    ' задаём параметры поиска
    With Selection.Find
        .ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    ' заходим в функцию поиска
    DuplicateRes
End Sub


Немного громоздко, по-моему, получилось, назрел следующий вопрос: можно ли как-то улучшить этот код? И ещё три маленьких вопроса:
Как узнать, на сколько символов сдвинут относительно начала строки курсор?
Как узнать номер страницы, на которой находится курсор?
Как сделать так, что бы пользователь после всех манипуляций с текстом, производимых макросом, мог одним нажатием Ctrl+Z все эти манипуляции отменить?

О да! Чуть не забыл! Собственно, текст, подлежащий изменению, выглядит примерно так:

Код: Выделить всё
                                                           
                 R E S U L T   S U M M A R Y               
                 _ _ _ _ _ _ _ _ _ _ _ _ _ _               
                                                           
                                                           
                                                           

                                                           
                 R E S U L T   S U M M A R Y               
                 _ _ _ _ _ _ _ _ _ _ _ _ _ _               
                                                           
                                                           
                                                           

                                                           
                 R E S U L T   S U M M A R Y               
                 _ _ _ _ _ _ _ _ _ _ _ _ _ _               
                                                           
                                                           
                                                           

Заранее благодарен за ответы.

Голованов Дмитрий

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Макрос Word. Поиск слов

Сообщение alibek » 17.10.2008 (Пт) 8:05

Шрифт моноширинный?
Lasciate ogni speranza, voi ch'entrate.

GolovanovD
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 16.10.2008 (Чт) 20:49

Re: Макрос Word. Поиск слов

Сообщение GolovanovD » 17.10.2008 (Пт) 14:17

Да, моноширный

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Макрос Word. Поиск слов

Сообщение GDK » 16.12.2008 (Вт) 18:49

Насчёт отмены не знаю. Насчёт номера страницы - скорее всего можно (см. св-ва объектов Selection и его Range или св-ва окна или документа).
Насчёт позиции курсора - точно возможно её определить. Как?-уже не помню, но это достаточно просто. (см. св-ва объектов Selection и его Range).
Насчёт улучшения - у объектов Range тоже есть св-во Find, возвращающее объект Find. Короче, не обязательно заново выделять диапазон поиска после того как строка найдена, достаточно единожды определить диапазон перед началом поиска (например диапазон охватывает весь документ). Отказаться от объекта Selection, т.к. это пугает пользователя. Вместо Selection использовать Range.

baston
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 13.09.2007 (Чт) 11:21

Re: Макрос Word. Поиск слов

Сообщение baston » 17.12.2008 (Ср) 11:03

Номер страницы, на которой находится курсор ввода:
Код: Выделить всё
MsgBox CStr(Selection.Information(wdActiveEndPageNumber))


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList