1

Тема: Как применить стиль текущего абзаца

Здравствуйте! Подскажите пожалуйста, как можно написать макрос для MS Word на VBA, который применяет стиль текущего абзаца (того, в котором находится курсор) ко всем Заголовкам второго уровня в документе?
Пыталась написать с помощью рекордера, назначить Основной стиль абзаца, но в таком случае применяется стандартный Times New Roman 12. Как получить стиль текущего абзаца?

2

Re: Как применить стиль текущего абзаца

Вот код:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
Dim prgName As String
    prgName = Selection.Paragraphs(1).Style ' Определяем имя стиля текущего абзаца
    ActiveDocument.Range.Find.ClearFormatting
    ActiveDocument.Range.Replacement.ClearFormatting
    With ActiveDocument.Range.Find
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .Style = "Заголовок 2" ' Найти абзац с именем стиля "Заголовок 2"
        .Replacement.Style = prgName ' Заменить на стиль prgName
    End With
    ActiveDocument.Range.Find.Execute Replace:=wdReplaceAll ' Заменить все
End Sub

3

Re: Как применить стиль текущего абзаца

Спасибо большое! Только немного не работает... Вот тут показывает ошибку

Post's attachments

код.jpg 35.32 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

4

Re: Как применить стиль текущего абзаца

Замените на

ActiveDocument.Range.Find.Replacement.ClearFormatting

5

Re: Как применить стиль текущего абзаца

Опять не работает. Только теперь вообще не выдает, где ошибка...
Пишет только

Line is not an executable statement

А какая line не пишет...

6

Re: Как применить стиль текущего абзаца

Попробуйте так:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
Dim prgName As String
    prgName = Selection.Paragraphs(1).Style ' Определяем имя стиля текущего абзаца
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("Заголовок 2")
    Selection.Find.Replacement.Style = ActiveDocument.Styles(prgName)
    With Selection.Find
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll ' Заменить все
End Sub

7

Re: Как применить стиль текущего абзаца

Спасибо, что помогаете)
Теперь ошибку не выдает, все как будто работает, только ничего не делает) Заголовки как были так и остаются...
У меня вот этот работает, только здесь меняет Заголовок 2 не на текущий стиль, а на Times New Roman

Sub Макрос3()
'
' Макрос3 Макрос
' Макрос записан 14.12.2011 Admin
'   
    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("Заголовок 2 знак")
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles( _
        "Основной шрифт абзаца")
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

8

Re: Как применить стиль текущего абзаца

Так естественно будет менять на Times New Roman 12 т.к. это шрифт стиля "Основной шрифт абзаца".
В документе создайте другой стиль шрифта с нужными вам параметрами и в строке

Selection.Find.Replacement.Style = ActiveDocument.Styles( _
        "Основной шрифт абзаца")

Вставьте название созданного стиля

9

Re: Как применить стиль текущего абзаца

Так я ж о чем и говорю! Мне нужно чтобы меняло не на конкретный созданный стиль, а на стиль любого активного абзаца. Это я просто показала пример макроса, который у меня хоть как-то работает. Я понимаю, что "Основной стиль абзаца" ни на что другое менять не будет. Просто думала, может можно этот макрос как-то изменить, чтобы был стиль текущего. Метод Copy.Format может какой-то?

10

Re: Как применить стиль текущего абзаца

Чет я не понял, ведь надо искать уровень, а не стиль. Вместо:

aap77 пишет:
.Style = "Заголовок 2" ' Найти абзац с именем стиля "Заголовок 2"

Надо:

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

11

Re: Как применить стиль текущего абзаца

Вождь пишет:

ведь надо искать уровень, а не стиль

У меня в задании написано, что нужно применить форматирование текущего абзаца к определенным текстовым элементам документа - названиям разделов 2 уровня.
В моем макросе оно находит эти Заголовки, только меняет не на то, что нужно

12

Re: Как применить стиль текущего абзаца

Apple-girl пишет:

...У меня в задании ....названиям разделов 2 уровня...

И я об этом. Во всех макросах ветки все почему-то ищут стили, а по заданию надо уровень.
Apple-girl, попробуйте в вашем макросе вместо:

Selection.Find.Style = ActiveDocument.Styles("Заголовок 2 знак")
Selection.Find.ParagraphFormat.OutlineLevel = wdOutlineLevel2
Макросы под заказ и готовый пакет - mtdmacro.ru

13

Re: Как применить стиль текущего абзаца

Поменяла. Ничего не изменилось. Вернее, так вообще не находит Заголовки. Тут же дело не в них.
Меня больше интересует, как узнать стиль текущего абзаца, НА КОТОРЫЙ нужно менять.

14

Re: Как применить стиль текущего абзаца

Apple-girl пишет:

...стиль текущего абзаца...

Стиль первого из выбранных абзацкв: Selection.Paragraphs.First.Style
Э-хе-хе. Пришлось написать самому smile

Sub Макрос_Alex()
' присвоить стиль первого из выбранных абзацев всем заголовкам 2-го уровня
        
    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = Word.wdFindContinue
        .Format = True
        .ParagraphFormat.OutlineLevel = Word.wdOutlineLevel2
        .Replacement.Style = Selection.Paragraphs.First.Style
    End With
    Selection.MoveStart Unit:=Word.wdStory, Count:=-1
    Selection.Find.Execute Replace:=Word.wdReplaceAll
    
End Sub
Макросы под заказ и готовый пакет - mtdmacro.ru

15

Re: Как применить стиль текущего абзаца

Вождь пишет:

Пришлось написать самому smile

Я, конечно, извиняюсь, уже наверное заколебала тут всех, но Ваш макрос тоже не делает того, что мне надо. Он выделяет текст до того места, где стоит курсор, и всё... А у Вас работает или не проверяли?

16

Re: Как применить стиль текущего абзаца

Проверял конечно. Мой макрос делает точно то, что сказано в вашем первом сообщении ветки. Да, опечатался, вместо MoveStart лучше Move. Но это не мешает работоспособности.

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

17

Re: Как применить стиль текущего абзаца

Ну, товарищи, можно вообще радикально макрос сделать используя ко конструкцию If Then End If и With End With:

Dim rng As Range
Dim prg As Paragraph

    Set rng = ActiveDocument.Range
         For Each prg in rng.Paragraphs ' Перебераем все абзацы
               If prg.ParagraphFormat.OutlineLevel = Word.wdOutlineLevel2 and InStr(prg.Style, "Заголовок") > 0 Then
                    prg.Style = Selection.Paragraphs.First.Style
               End If
         Next prg

                   
По условию если Уровень абзаца = 2 и в названии абзаца присутствует заголовок, то стиль абзаца = стилю первого абзаца выделения (стиль абзаца в положении курсора)

18

Re: Как применить стиль текущего абзаца

Вождь пишет:

Проверял конечно. Мой макрос делает точно то, что сказано в вашем первом сообщении ветки

У меня он совершенно ничего не делает...

aap77, последний вариант выдает ошибку и не работает...

19

Re: Как применить стиль текущего абзаца

Apple-girl пишет:

последний вариант выдает ошибку и не работает...

На какой строке дает ошибку?

20

Re: Как применить стиль текущего абзаца

Apple-girl пишет:

...ничего не делает...

А что должен? smile Давайте разберемся. Что в задании вы назвали "...Заголовкам второго уровня..."? Дополните пожалуйста: создала новый документ, выбрала первый абзац,........., в результате получила заголовок второго уровня. В моем понимании - это абзац, стиль которого имеет параметр "Уровень" равный 2.

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