Полезный макрос для word

Простой инструмент для перфекционистов, который сэкономит много времени.

Много лет назад, работая редактором и вылавливая бесконечные лишние пробелы и прочие огрехи оформительства, я попросила мужа как-нибудь спасти меня от рутины. И он сделал простую, но страшно полезную штуку — редакторский макрос. Нажимаешь заданное сочетание клавиш, и проблема решается автоматически.

Переживать о двойных пробелах — тот ещё перфекционизм, им не страдает 99% населения. Но если вы работаете с текстом (не только как пиарщик, журналист или редактор, но и, допустим, как продажник, пишущий КП), то позаботьтесь о его идеальном оформлении. Это выдаст в вас интеллигентного человека :)

Так выглядит текст до обработки: двойные пробелы, дефис вместо тире, длинное тире, путаница с кавычками.

Пример неряшливого текста

Подобные тексты часто попадают к редактору, их чистка может занимать очень много времени. Два нажатия сочетания клавиш Сtrl + «ё» (именно такое сочетание установлено у меня) — и текст оформлен аккуратно.

Пример аккуратного текста

Как это работает? С помощью простого макроса для Word, который легко установит даже с трудом понимающий слово «макрос» человек. Нужно скачать файл и следовать инструкции.

Что умеет макрос:

  • менять двойные пробелы на одинарные;

  • заменять дефис на среднее тире, а длинное тире — на среднее;

  • заменять «ё» на «е»;
  • заменять кавычки-«лапки» на кавычки-«ёлочки»;
  • убирать неразрывные пробелы;
  • убирать пробел перед запятой, точкой, закрывающей скобкой.

Полный список команд можно увидеть в тексте макроса. Команды связаны со стандартами моей прежней работы, их можно отдельно убрать, если вы любите букву «ё» или длинное тире, а также добавить свои.

Пользуйтесь! И пусть ваши тексты будут выглядеть идеально!

Angry word helper

Возможно, у вас есть ощущение, что тема макросов в Ворде достаточно маргинальная. Кто ими может пользоваться-то вообще? Ну, малварь делают иногда… Да и пишутся они на давно забытом VBA (Visual Basic for Applications, он же несколько урезанный Visual Basic 6 в интерпретируемом виде), фу!

Но на самом деле у многих ведь возникает потребность то какой-нибудь отчётик в ворде написать, то курсовую оформить, то резюме перед отправкой в компанию вашей мечты подправить… А у некоторых работа напрямую связана с Word. Часто различные системы документации предлагают экспорт в форматы doc или docx, которые нужны вашим заказчикам. И бывает, что документы после экспорта выглядят фигово, приходится их исправлять.

Работа в ворде нередко подразумевает выполнение каких-то однообразных повторяющихся действий, которые иногда (но далеко не всегда!) решаются грамотной настройкой стилей и их применением, а также использованием шаблонов. Как же автоматизировать всё остальное? Тут-то нам на помощь приходят те самые макросы.

Что же в них такого хорошего? Ну, например, они автоматически и достаточно быстро выполняют за вас однообразные действия. Могут что-то подсчитать, переформатировать документ, пометить аннотациями подозрительные места, — словом, всё, что запрограммируете. Могут даже в режиме реального времени что-то исправлять и о чем-то предупреждать, пока вы пишете документ. VBA в Word позволяет автоматизировать практически все действия, которые вы можете выполнить с документом вручную.

Макросы можно прикрепить как к конкретному документу (в чём для нас мало пользы, а для писателей троянов это единственная опция), так и к самому ворду, что позволяет применять макросы к любому документу, с которым вы работаете.

Макросы работают в любой версии Word и требуют минимум правок при переносе с одной версии на другую (а чаще всего вообще не требуют). На макросах можно даже реализовать полноценный пользовательский интерфейс с формами!

Давайте же занырнём в Visual Basic и напишем что-нибудь полезное! В качестве первого примера я покажу, как сделать макрос, который заменит два и более последовательных перевода строки на единственный. Это часто требуется при исправлении документов после экспорта из систем документации, или если вы хотите удалить случайно проставленные лишние переводы строк в собственноручно написанном документе. Макрос сделаем добротный, с пользовательским интерфейсом и прогрессом выполнения операции.

Чтобы начать писать или использовать макросы, сначала требуется убедиться, что в Word’е отображается панель «Разработчик» («Developer»). Если она у вас не отображается, следует зайти после создания нового документа в меню «Файл» («File») -> «Параметры» («Options») -> «Настроить ленту» («Customize Ribbon»), после чего найти там и установить флажок «Разработчик» («Developer»).

Enable Word developer tab

После этого нужно зайти на вкладку «Разработчик» и выбрать меню «Visual Basic».

Word Visual Basic button

В открывшемся окне слева вы увидите два проекта: «Normal» и проект, относящийся к текущему открытому документу. Возможно, в проекте «Normal» у вас уже будет какой-то файл в каталоге «Modules». В любом случае, создайте новый модуль, кликнув правой кнопкой по проекту «Normal» и выбрав «Insert» -> «Module».

Word insert new module

Созданный модуль представляет из себя файл, куда мы и будем писать код макросов. Можно переименовать модуль (по умолчанию его имя будет «Module1») в окне «Properties» -> «Name». Я назову свой модуль «AllMacros». Теперь откроем код модуля, дважды кликнув по его имени, и приступим к созданию макроса. Напомню, что наша цель — заменить два и более последовательных перевода строки на единственный, произведя замены по всему документу. Очевидно, нам потребуется функция, которая осуществляет поиск по тексту, ведь мы хотим найти несколько последовательных переводов строки. В Word это эквивалентно началу нового параграфа. Вы могли бы осуществить поиск начала нового параграфа через обычное окно поиска, введя в поле поиска ^p, ^13 или ^013 (что соответствует ASCII-коду перевода строки). Функция поиска будет выглядеть так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Private Function FindNextText(text As String, useWildcards As Boolean)

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = text

        .Forward = True

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchKashida = False

        .MatchDiacritics = False

        .MatchAlefHamza = False

        .MatchControl = False

        .MatchWildcards = useWildcards

        .MatchSoundsLike = False

        .MatchAllWordForms = False

        .Wrap = wdFindStop

    End With

    Selection.Find.Execute

    FindNextText = Selection.Find.Found

End Function

Давайте разберём, что тут происходит. Мы объявляем функцию с двумя параметрами. Первый имеет тип String — это текст для поиска, а второй Boolean говорит о том, нужно ли использовать символы подстановки (wildcards). Про них я поговорю позже. В следующих двух строках 2 и 3 мы очищаем форматирование для строки поиска и строки замены, если оно было задано пользователем. Word позволяет задать форматирование строки поиска/замены, а для нашей задачи это не требуется. Далее мы задаём набор параметров для объекта Selection.Find: выставляем неинтересные нам параметры в False, параметр Text — это текст, который мы хотим найти, а параметр MatchWildcards указывает на использование символов подстановки. Параметр Wrap говорит о том, следует ли продолжать поиск, когда мы дошли до той точки, с которой поиск начали, и у нас его значение установлено в wdFindStop, так как мы хотим остановиться, когда дойдём до конца документа, и не зацикливать поиск.

Вообще, всё это обилие свойств и объектов из объектной модели Word, Excel и PowerPoint (да, там тоже есть макросы) хорошо описано в MSDN. Например, вот тут перечислены свойства и методы объекта Find. Есть русская документация (скажем, эта страница), но она выполнена совершенно кринжовым машинным переводом, невозможно читать:

Есть совершенно смехотворные страницы:

В общем, лучше читайте на английском. :D

Кроме того, все доступные объекты, их свойства и методы можно посмотреть прямо в редакторе VBA в самом Word’е. Для этого нужно нажать F2 или выбрать меню «View» -> «Object browser», что приведет к открытию браузера объектов (Object browser), в котором можно пролистать или поискать то, что вам доступно.

Word object browser

Но вернёмся к нашей функции. На строке 19 мы непосредственно выполняем поиск заданного текста с указанными параметрами. Строка 20 — эта конструкция, аналогичная return в си-подобных языках, указывает возвращаемое значение функции. Мы возвращаем булевое значение Selection.Find.Found, которое говорит о том, было ли что-то найдено.

Хочу заметить, что использование объекта Selection.Find и изменение его свойств заменит их значения и для пользователя. Например, если вы в Word искали что-то хитроумное с конкретно заданными параметрами, то выполнение макроса заменит ваши параметры поиска на те, которые мы задали в макросе. В идеале, их можно запомнить, а потом вернуть, но мы не будем так сильно заморачиваться, а просто всё за собой подчистим. Сделаем функцию, которая сбрасывает параметры в значения по умолчанию:

Private Sub ClearFindAndReplaceParameters()

    With Selection.Find

       .ClearFormatting

       .Replacement.ClearFormatting

       .Text = «»

       .Replacement.Text = «»

       .Forward = True

       .Wrap = wdFindStop

       .Format = False

       .MatchCase = False

       .MatchWholeWord = False

       .MatchWildcards = False

       .MatchSoundsLike = False

       .MatchAllWordForms = False

    End With

End Sub

Обратите внимание, что это уже Sub, а не Function, потому что мы не хотим из этой процедуры возвращать никакое значение. Это аналог функции void в си-подобных языках.

Теперь нужно определить, как нам найти два или более последовательных перевода строки. Для этого нам и потребуются упомянутые ранее wildcards. Word поддерживает символы подстановки при поиске, и по своей функциональности они напоминают регулярные выражения. Кстати, вы можете ими пользоваться и без макросов из окна расширенного поиска:

Word wildcards

Хорошее описание символов подстановки я нашел здесь, правда, на английском языке. Составим регулярное выражение для поиска двух и более последовательных переводов строки: [^013]{2,}. Это очень похоже на классическое регулярное выражение Perl или PCRE, но в квадратных скобках в уникальном стиле Word мы задаем символ перевода строки. Фигурные скобки указывают, что символов перевода подряд должно быть два или более. Тут, кстати, есть нюанс: не во всех версиях/локализациях Word такая регулярка заработает. В некоторых случаях вместо запятой потребуется указать точку с запятой (да, в Microsoft иногда делают крайне странные вещи). Чтобы сделать наш макрос более универсальным, напишем функцию, которая вернёт регулярное выражение, пригодное для поиска в той версии Word, в которой эту функцию запустили:

Private Function GetLineBreakSearchRegExp()

    On Error GoTo Err

    FindNextText «[^013]{2,}», True

    GetLineBreakSearchRegExp = «[^013]{2,}»

    Exit Function

Err:

    GetLineBreakSearchRegExp = «[^013]{2;}»

End Function

Здесь мы сначала пытаемся осуществить поиск с помощью wildcard’а [^013]{2,}. Если всё окей, то вернём из функции этот самый wildcard как рабочий (строка 4). В противном случае произойдёт ошибка, но мы готовы её обработать: мы установили обработчик всех ошибок в строке 2. Нас перекинет на метку Err, и тут мы вернём wildcard, который пригоден для других ревизий Word (в котором запятая внутри фигурных скобок заменена на точку с запятой).

Далее напишем функцию, которая будет заменять несколько последовательных переводов строки на единственный:

Private Sub RemoveNextEnters()

    Selection.MoveStart wdWord, 1

    If Selection.Range.Start <> Selection.Range.End Then Selection.Delete

End Sub

Эта функция подразумевает, что вызывать её будут тогда, когда объект Selection указывает на найденные несколько переводов строки. В строке 2 перемещаем начало выделения (а в выделены у нас будут все найденные последовательные переводы строки) на один символ вперед, а затем в строке 3, если начало выделения не совпадает с его концом, удаляем его содержимое. Таким образом, если было выделено три перевода строки, мы отступаем вперед на 1 символ (оставляя один перевод строки нетронутым), а затем удаляем оставшиеся два.

Осталось написать последнюю функцию, которая будет всем управлять.

Sub RemoveExcessiveEnters()

    Dim lineBreakSearchRegExp As String

    lineBreakSearchRegExp = GetLineBreakSearchRegExp()

    Selection.HomeKey Unit:=wdStory

    While FindNextText(lineBreakSearchRegExp, True) = True

        RemoveNextEnters

    Wend

    ClearFindAndReplaceParameters

End Sub

Здесь мы оперируем ранее написанными функциями. Сначала получаем текст регулярного выражения (wildcard’а) для поиска нескольких переводов строки подряд, затем вызовом HomeKey в строке 5 переходим в самое начало документа (перемещаем туда курсор), а затем в цикле ищем все интересующие нас места и удаляем излишние переводы строки. В конце сбрасываем параметры поиска на значения по умолчанию.

Finished word macro

Вот и всё, макрос можно запускать! Обратите внимание, что все функции, кроме последней, мы пометили Private. Мы не хотим, чтобы их вызывали напрямую. Доступной для вызова снаружи будет только функция RemoveExcessiveEnters. Перед запуском макроса стоит убедиться, что макросы включены. Если вылазит такая панель, то нужно нажать «Включить содержимое» («Enable content»):

Word enable content

Если такой панели нет, то можно зайти в меню «Файл» («File») -> «Сведения» («Info») и включить макросы уже оттуда:

Word enable content from info menu

Вы можете включить макросы на время одного сеанса Word (это по умолчанию и происходит, если нажимаете «Включить содержимое»), так что после перезапуска Word макросы снова будут отключены. Для запуска макроса возвращаемся в Word на панель «Разработчик» и нажимаем кнопку «Макросы» («Macros»), выбираем наш макрос RemoveExcessiveEnters и нажимаем «Выполнить» («Run»). Разумеется, у вас должен быть открыт какой-нибудь подопытный документ, где имеются лишние переводы строк. В качестве бонуса наш макрос ещё и удалит пустые элементы списков, потому что они представляют из себя точно такие же несколько переводов строки подряд.

Word macro: before and after

Макрос выполняется достаточно быстро. Его действие можно отменить (каждый шаг независимо), открыв меню выполненных действий:

Undo Word macro

Макросы можно отлаживать через окно VBA, в котором мы писали макрос. Кликнув слева от строки кода, можно, как и в других средах разработки, поставить точку останова, а потом запустить макрос кнопкой «Run». Запустится та функция, на которой у вас находится курсор. Если вы поставите курсор на функцию с параметрами, то появится обычный запрос на выбор макроса для запуска, как при нажатии на кнопку «Макросы» в Word.

Debug Word macros

Думаю, что материала для одной статьи уже вполне достаточно. Я, конечно, пообещал горы функционала в виде интерфейса пользователя, отслеживания прогресса выполнения, и всё это обязательно будет, но в следующей публикации.

Код макроса можно скачать тут. Вы сможете его импортировать к себе в Word, кликнув правой кнопкой на «Normal» -> «Import file…» и выбрав загруженный файл.

P.S. Кстати, рекомендую создавать бэкапы своих макросов, экспортируя их куда-нибудь на диск. Даже лицензионный Word имеет свойство их иногда по какой-то причине удалять из шаблона Normal, в котором мы их создавали.

Макросы в Word — это такая полезная штука, которую просто обязан знать каждый, кто много работает с текстами.

Предысторию написания данной статьи, а также ее полезность можно оценить по видеоролику.

Макросы — теория

Теперь немного теории. Как известно, в текстовом редакторе Word есть очень полезная функция «Найти и заменить« (вызывается через сочетание клавиш Ctrl+H или меню «Правка» -> «Заменить…»), которой, к сожалению, пользуются не так часто. Но еще реже используют данную функцию в режиме «Подстановочные знаки«.

Галочка "подстановочные знаки" (макросы)

А между тем данное умение может принести неоценимую пользу. Свое знакомство с подстановочными знаками и их изучение можно начать со статьи Сергея Хозяинова (будет полезна для новичков).

Я же хочу рассказать о более конкретных случаях применения этого знания, а именно: использование замены с помощью подстановочных знаков и форматирование текста в макросах.

Макросы — это такие полезные штуки, которые позволяют автоматизировать часто выполняемые операции (в случае примера на видео, это форматирование текста). О способах записи и создания макросов можно найти тысячи статей на просторах Интернета. Нас же будет интересовать вариант, при котором макрос записывается вручную во встроенном в Word редакторе Visual Basic. Суть использования макросов мною основана на принципе конструктора: макрос состоит из набора кирпичиков-функций, которые заранее прописаны и могут размещаться в любой требуемой последовательности. Каждая же из функций является действием, либо набором действий, она имеет свое уникальное имя. В макросе же надо лишь указать имя функции для ее вызова.

Макросы — практика

Показать скрытое содержание
Function Tire()
‘заменяет дефис в начале абзаца на тире
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «^p- »
.Replacement.Text = «^p^= »
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Function
Function Tire2()
‘заменяет дефис окруженный пробелами на тире
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = » — »
.Replacement.Text = » ^= »
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Function
Function Defis()
‘заменяет тире в начале абзаца на дефис
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «^p^=»
.Replacement.Text = «^p-»
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Function
Function Prob()
‘заменяет множественные пробелы на одиночный
‘удаляет множественные и одиночные пробелы в начале абзаца
‘удаляет множественные и одиночные пробелы в конце абзаца
‘удаляет знаки абзаца идущие до текста в начале документа
‘и знаки абзаца идущие после текста в конце документа
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.MatchWildcards = False
.Execute «^w», , , , , 0, , , 0, » «, 2
.Execute «^p^w», , , , 0, , , , 0, «^p», 2
.Execute «^w^p», , , , 0, , , , 0, «^p», 2
End With
If ActiveDocument.Paragraphs.Count > 1 Then
Do While ActiveDocument.Paragraphs.Last.Range.Text = Chr(13) And _
ActiveDocument.Paragraphs.Count > 1
ActiveDocument.Paragraphs.Last.Range.Delete
Loop
End If
Selection.HomeKey wdStory
While Selection.Paragraphs.First.Range.Characters.Count = 1
Selection.Paragraphs.First.Range.Delete
Wend
End Function
Function Format()
‘весь текст делает 14 размером TimesNewRoman
‘с 1,5 интервалом и выравнивает его по ширине
ActiveDocument.Content.Font.Name = «Times New Roman»
ActiveDocument.Content.Font.Size = 14
ActiveDocument.Content.ParagraphFormat.LineSpacing = LinesToPoints(1.5)
ActiveDocument.Content.ParagraphFormat.Alignment = wdAlignParagraphJustify
Selection.HomeKey wdStory
End Function
Function Format2()
‘весь текст делает 11 размером Arial
‘с 1,5 интервалом и выравнивает его по ширине
ActiveDocument.Content.Font.Name = «Arial»
ActiveDocument.Content.Font.Size = 11
ActiveDocument.Content.ParagraphFormat.LineSpacing = LinesToPoints(1.5)
ActiveDocument.Content.ParagraphFormat.Alignment = wdAlignParagraphJustify
Selection.HomeKey wdStory
End Function
Function Zagol()
‘делает заголовок (первый абзац) документа жирным
‘и выравнивает его по центру
ActiveDocument.Paragraphs(1).Range.Select
Selection.Font.Bold = True
Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
Selection.HomeKey wdStory
End Function
Function Symb()
‘Подсчитывает количество символов в документе
‘и выводит сообщение
spacecount = ActiveDocument.Content.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
MsgBox «В тексте содержится символов (включая пробелы) — » & spacecount & » »
End Function
Function Krasn()
‘Делает красный шрифт у выделенного слова
Selection.Font.Color = wdColorRed
End Function
Function Intjyr()
‘Выделяет жирным все вопросы «И:»
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «(^0013^0013И:)(*)(^0013)»
.MatchWildcards = True
.Forward = True
.Replacement.Text = «123″
.Replacement.Font.Bold = True
.Execute Replace:=wdReplaceAll
End With
End Function
Function One_to_Two()
‘Разделяет одно предложение на два (перед выполнением курсор ставить после запятой)
Selection.TypeBackspace
Selection.TypeText Text:=».»
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.Range.Case = wdTitleSentence
End Function
Function Two_to_One()
‘Склеивает два предложения в одно (перед выполнением курсор ставить после точки)
Selection.TypeBackspace
Selection.TypeText Text:=»,»
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.Range.Case = wdTitleSentence
End Function
Function Nimerstr()
‘Вставляет нумерацию страниц справа вверху
Selection.Sections(1).Headers(1).PageNumbers.Add PageNumberAlignment:= _
wdAlignPageNumberRight, FirstPage:=True
End Function
Function MastifTime()
‘Находит и заменяет тайм-коды в обычном формате (чч:мм:сс), на формат
‘требуемый для Мастифа (чч-мм-сс)
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «(^0013)(([0-9]@:[0-9]@:[0-9]@))»
.MatchWildcards = True
.Forward = True
.Replacement.Text = «12»
.Execute Replace:=wdReplaceAll
End With
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «:([0-9]@):»
.MatchWildcards = True
.Forward = True
.Replacement.Text = «-1-»
.Execute Replace:=wdReplaceAll
End With
End Function
Function Troetoch()
‘Заменяет три точки идущие подряд на знак троеточия
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «…»
.Replacement.Text = «…»
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Function
Function Tehnik()
‘Ищет в тексте технические надписи в скобках
‘если они прописаны без точки, то перед закрывающей скобкой ставится точка,
‘если они написаны (случайно) не курсивом, то выделяются им
Dim MyCollection As New Collection
With MyCollection
.Add («Аплодисменты»)
.Add («Говорят одновременно»)
.Add («Дефект записи»)
.Add («Дефект звука»)
.Add («Смена кадра»)
.Add («Обрыв записи»)
.Add («Техническая съемка»)
.Add («Техническая реплика»)
.Add («Технический разговор»)
.Add («Конец просмотра видеоролика»)
.Add («Начало просмотра видеоролика»)
.Add («Просмотр видеоролика»)
.Add («Возобновление тайм-кода»)
.Add («Остановка тайм-кода»)
.Add («Смена тайм-кода»)
.Add («Смех»)
.Add («Смеется»)
.Add («Кашель»)
.Add («Кашляет»)
End With
Dim i As Integer
For i = 1 To MyCollection.Count
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «((» & MyCollection.Item(i) & «))»
.MatchWildcards = True
.Forward = True
.Replacement.Text = «(1.)»
.Replacement.Font.Italic = True
.Execute Replace:=wdReplaceAll
End With
ActiveDocument.Content.Find.ClearFormatting
ActiveDocument.Content.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.Text = «((» & MyCollection.Item(i) & «.))»
.MatchWildcards = True
.Forward = True
.Replacement.Text = «(1)»
.Replacement.Font.Italic = True
.Execute Replace:=wdReplaceAll
End With
Next i
End Function
Sub Zamena()
‘ Комплекс последовательных функций при форматировании работ всех видов кроме Первого канала.
Prob
Tire2
Tire
Troetoch
Nimerstr
Tehnik
Symb
End Function
Sub Zamena2()
‘ Комплекс последовательных функций при форматировании работ Первого канала.
Prob
Defis
Tire2
Troetoch
Nimerstr
Tehnik
Symb
End Function
Sub ФОРМАТ()
Format
Prob
Tire2
Tire
Troetoch
Intjyr
Tehnik
Nimerstr
Zagol
Symb
End Sub
Sub МАСТИФ()
Format2
Prob
Intjyr
Tehnik
MastifTime
Nimerstr
Zagol
Symb
End Sub

Прописав это и сохранив в шаблоне «Normal.dot« можно получить доступ к этим макросам из любого документа. Вызывается окно выбора макросов горячей клавишей Alt+F8.

Я предпочитаю использовать кнопки на панели инструментов. Поместить на нее кнопку и привязать к ней макрос очень легко. Об этом доступно написано в данной статье.

Данная статья затронула обширную тему, которая, прежде всего, нацелена на понимание и самостоятельное изучение вопроса. Поэтому более подробно расписывать не стал. Но всегда можно задать вопросы в комментариях.

готовые макросы word

Макрос для таблицы

Урок 60. Макрос для таблицы

Приходилось ли вам выполнять при форматировании документа несколько раз повторять одни и те же команды? Предположим, в документе 50 таблиц. И каждую надо привести в порядок. Повторяющиеся заголовки, выравнивание назначить, да мало ли чего ещё Дальше

Нередко простановка HTML тегов в статье занимает почти столько же времени, сколько ее написание. Особенно часто такая проблема возникает со статьями со сложной версткой, включающей множество заголовков, списков, цитат и стилей.

Заметно облегчить работу по подготовке текстов к публикации на web-сайте помогут макросы Word, которые могут автоматизировать любую задачу. Для написания такого макроса требуется знание языка программирования Visual Basic for Applications (VBA), встроенного не только в линейку программных пакетов от MicroSoft, но и многие другие приложения. Однако, благодаря тому, что VBA представляет собой упрощенную версию Visual Basic, начать писать простейшие скрипты может любой пользователь.

Кроме того, упростить задачу по написанию VBA макроса поможет возможность записи всех действий пользователя, которые автоматически преобразуются в программный код. Таким образом, чтобы создать простейший макрос, достаточно:

  • выбрать пункт меню Вид –> Макросы –> Запись макроса;
  • Запись макроса

  • дать ему любое имя;
  • Имя макроса

  • выполнить необходимые действия, которые вы хотите автоматизировать;
  • остановить запись (Вид –> Макросы –>Остановить запись).

Остановка записи

Кликнув по пункту меню Вид –> Макросы –> Запись макроса, вы откроете окно со список всех имеющихся у вас макросов и сможете запустить их, отредактировать или удалить.

Расстановка тегов абзаца <P> в Word при помощи VBA макроса

Предварительная простановка тегов

в тексте перед его размещением требуется при работе со многими CMS. Далеко не все встроенные в web-движки редакторы могут автоматически опознать абзацы в статье и автоматически вставить туда тексты. Кроме того, нередко разбивку текста HTML-тегами требуют и от копирайтеров, чтобы размещение статьи занимало у заказчика как можно меньше времени.

Самый простой способ автоматизировать вставку HTML-тега в Word – это использование опции автозамены (окошко «Найти и заменить»), вызываемой сочетанием клавиш Ctrl+H.

Вставляем в строку «Найти» сочетание ^p, а в строку «Заменить на» </p>^p<p> и жмем на кнопку «Заменить все». Word автоматически проставит необходимые HTML-теги в тексте.

Замена абзацев на HTML-теги

Чтобы перевести данное действие в макрос, запустим его запись перед выполнением всех действий.

  1. Включаем запись макроса.
  2. Выполняем замену абзацев на HTML-теги в тексте при помощи опции «Заменить все».
  3. Останавливаем запись.

Теперь, чтобы проставить тег <P> в статье, вам будет достаточно нажать единственную кнопку запуска макроса.

Готовый код (помимо простановки тегов, он изменяет шрифт текста на Times New Roman и устанавливает размер 11):

Sub P()



Selection.WholeStory
Selection.Font.Name=»TimesNewRoman»
Selection.Font.Size=11
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
WithSelection.Find
.Text=»^p»
.Replacement.Text=»</p>^p<p>»
.Forward=True
.Wrap=wdFindAsk
.Format=False
.MatchCase=False
.MatchWholeWord=False
.MatchWildcards=False
.MatchSoundsLike=False
.MatchAllWordForms=False
EndWith
Selection.Find.ExecuteReplace:=wdReplaceAll
Selection.HomeKeyUnit:=wdStory
Selection.TypeTextText:=»<p>»
Application.Browser.Next
Selection.EndKeyUnit:=wdStory
Selection.TypeBackspace
Selection.TypeBackspace
Selection.TypeBackspace
Selection.TypeBackspace
End Sub

Учтите, что если в конце вашего текста есть много лишних абзацев, то данный VBA скрипт обязательно заменит их на HTML-теги, поэтому обязательно проверяйте то, как выглядит конец статьи, перед ее непосредственной публикацией на сайте.

Как видите, код интуитивно понятный, и многие команды VBA имеют говорящее название, указывающее на их функцию:

  • Selection.Find.Replacement.ClearFormatting – заменить в выбранном тексте,
  • .Text – текст, который нужно найти;
  • .Replacement.Text – текст для замены.

Команда Selection.TypeBackspace обозначение удаление одного символа, стоящего впереди курсора. Она необходима, так как в случае выполнения замены абзацев на HTML-теги

в конце всегда будет находиться лишний открывающий тег <P>.

Продолжим писать наш макрос для «Ворда». Пусть он обрамляет тегами <b></b> или <strong></strong> или <span class=»bolder»></span> текст, выделенный жирным.

Сделать это при помощи автозамены можно так.

В поле «Найти» вставляем текст (<*>). В пункте «Формат» выбираем Шрифт –> Полужирный. Ставим галочку в пункте «Подстановочные знаки». В поле «Заменить на» пишем <b>1</b>. Нажимаем «Заменить все».

Замена жирного текста в Ворде

У такой опции есть один недостаток: программа расставит обрамляющие HTML-теги не возле вокруг всего «куска» жирного текста, а вокруг каждого слова, следовательно, итоговый код будет очень грязный.

Лишние HTML-теги

Чтобы исправить эту ошибку, просто заменим </b> <b> на пробел.

Удаляем лишние теги

Итоговый код (на примере замены на <span class=»bolder»></span>):

Sub B()



Selection.Find.ClearFormatting
Selection.Find.Font.Bold=True
Selection.Find.Replacement.ClearFormatting
WithSelection.Find
.Text=»(<*>)»
<span class=»»bolder»»>1</span>
.Forward=True
.Wrap=wdFindContinue
.Format=True
.MatchCase=False
.MatchWholeWord=False
.MatchAllWordForms=False
.MatchSoundsLike=False
.MatchWildcards=True
EndWith
Selection.Find.ExecuteReplace:=wdReplaceAll
WithSelection.Find
.Text = «</span><span class=»»bolder»»>»
.Replacement.Text=»»
.Forward=True
.Wrap=wdFindContinue
.Format=False
.MatchCase=False
.MatchWholeWord=False
.MatchWildcards=False
.MatchSoundsLike=False
.MatchAllWordForms=False
EndWith
Selection.Find.ExecuteReplace:=wdReplaceAll
End Sub

Двойные кавычки в коде – это не опечатка, так как именно таким образом осуществляется экранирование кавычек в VBA-скриптах.

Аналогичным способом вы можете дополнить макрос, например, обрамляя курсив тегами <i></i> или <blockquote></blockquote>.

Автоматическая простановка тегов заголовков

Чтобы автоматически расставить заголовки H1, H2, H3, H4, H5 и H6, необходимо задать для них размер шрифта, отличный от остального текста. Например, если вы пишите статью 12 размером, можно выделять заголовки 16 размером. Тогда опция автозамены будет выглядеть так:

  • в поле «Найти» (<*>),
  • в поле «Заменить на» <h2>1</h2>,
  • ставим галочку «Подстановочные знаки»,
  • в разделе «Формат» указываем 16 шрифт.

Простановка тегов H1

Затем заменяем лишние «</h2> <h2>».

Макрос будет выглядеть следующим образом:

Selection.Find.ClearFormatting
Selection.Find.Font.Size=18
Selection.Find.Replacement.ClearFormatting
WithSelection.Find
.Text=»(<*>)»
.Replacement.Text=»<h2>1</h2>»
.Forward=True
.Wrap=wdFindContinue
.Format=True
.MatchCase=False
.MatchWholeWord=False
.MatchAllWordForms=False
.MatchSoundsLike=False
.MatchWildcards=True
EndWith
Selection.Find.ExecuteReplace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.Size=16
Selection.Find.Replacement.ClearFormatting
WithSelection.Find
.Text=»</h2><h2>»
.Replacement.Text=»»
.Forward=True
.Wrap=wdFindContinue
.Format=True
.MatchCase=False
.MatchWholeWord=False
.MatchWildcards=False
.MatchSoundsLike=False
.MatchAllWordForms=False
EndWith
Selection.Find.ExecuteReplace:=wdReplaceAll
EndSub

Используя приведенные примеры, вы можете создавать собственные макросы, форматируя текст, как вам удобно, что позволит ускорить работу по подготовке тексте перед размещением на сайте.

Понравилась статья? Поделить с друзьями:
  • Полезные функции для excel
  • Полезные функции excel если
  • Полезные формулы в excel уроки
  • Полезные формулы в excel для таблиц
  • Полезные формулы в excel для анализа данных