Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как пометить заголовки в Ворде

248
08 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Вот такая задача. В документе есть заголовки 1, 2, 3 и 4-го уровня ( и неск. др. используемых стилей). Для последующей обработки в программе верстки я сделал макрос, который ищет заголовок каждого из этих уровней и в начале каждого вписывает метку-тег Zag1, Zag2, Zag3 и Zag4 (в верстке по этим меткам я в авторежиме расставляю стили). Есть и другие типы тегов к другим типам оформления (но это уже детали). На мой взгляд, я написал это довольно примитивно:
Код:
Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    For i = 1 To 100
    Selection.Find.Style = ActiveDocument.Styles("Заголовок 1")
    With Selection.Find
        .Text = ""
        .Replacement.Text = "": .Forward = True: .Wrap = wdFindStop: .Format = True: .MatchCase = False
    End With
    Selection.Find.Execute
    If Selection.Find.Found = False Then GoTo Enn
    Selection.HomeKey Unit:=wdLine
    Selection.TypeText Text:="Zag1"
    Selection.MoveDown Unit:=wdLine, Count:=1
    Next i
Enn:


Можно ли как-то покрасивее это делать? (мне кажется, можно). :o
267
08 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Не очень ясен смысл цикла For i = 1 To 100
248
08 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
А смысл цикла в том, что заголовков в тексте имеется явно меньше ста штук (15-20-40 - максимум). Поэтому пусть макрос выполняет цикл до посинения, вернее, до срабатывания условия
 
Код:
If Selection.Find.Found = False Then GoTo Enn
''' пререходит по метке за пределы цикла.
Т.е. будут гарантировано перебраны все вхождения заданного стиля и обработаны моим тегом.
267
08 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Тогда скажу, что использовать оператор Goto - плохая привычка и дурная манера. Попробуем переписать вот так:

Код:
Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("Заголовок 1")
    With Selection.Find
        .Text = ""
        .Replacement.Text = "": .Forward = True: .Wrap = wdFindStop: .Format = True: .MatchCase = False
    End With    
    Selection.Find.Execute
   
    While Selection.Find.Found
        Selection.HomeKey Unit:=wdLine
        Selection.TypeText Text:="Zag1"
        Selection.MoveDown Unit:=wdLine, Count:=1
        Selection.Find.Execute
    Wend


Пишу прямо здесь, без компиляции, так что заранее извиняюсь за возможные синтаксические ошибки.
248
08 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Цитата:
плохая привычка и дурная манера


Это я чувствовал всегда. Но это крайняя мера, что бы хоть чего-то делалось. Ваш вариант, ессно, красивее и логичнее.
А вот можно ли измерить время выолнения макроса? (Мне показалось, что вариант c [COLOR="Navy"]While - Wend[/COLOR] сработал побыстрее, чем мой убогий с [COLOR="Navy"]If... than goto.[/COLOR]). А то ж я не знаю операторов, возвращающих "время", впрочем и кучю других тоже :o )

267
09 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Цитата: Dmitry2064
А вот можно ли измерить время выолнения макроса?



Конечно.

В начале макроса:
Dim TStart As Date, TEnd As Date
TStart = Now

В конце макроса:
TEnd = Now
Msgbox Format(TEnd - TStart, "h:mm:ss")

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог