Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Макрос Word. Поиск слов Добавлено: 16.10.08 21:34  

Автор вопроса:  Дмитрий
Доброго всем времени суток.

Задача: поиск в форматированном пробелами тексте фразы и размещение в определённом месте под ней другой фразы (подписи) с сохранением форматирования. Длина форматированной строки – 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                
                 _ _ _ _ _ _ _ _ _ _ _ _ _ _                
                                                            
                                                            
                                                            

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

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

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 Anton



Вопросов: 2
Ответов: 4
 Профиль | | #1 Добавлено: 17.10.08 13:02
Отвечу на один вопрос - номер страницы, где находится курсор ввода, можно узнать так:
Sub SelNumPage()
'Вывод номера страницы, где произошло выделение или находится курсор ввода
MsgBox CStr(Selection.Information(wdActiveEndPageNumber))
End Sub

Ну вот еще и на второй - позиция курсора по горизонтали и по вертикали:
Sub HorPos()
'Определение позиции курсора по горизонтали в сантиметрах
Dim Location As Double
Location = Selection.Information(wdHorizontalPositionRelativeToTextBoundary)
MsgBox PointsToCentimeters(Location)
End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам