105

Основы программирования в Microsoft Word. Работа с макросами

Предыдущие статьи:

1. Учимся работать в Microsoft Word правильно

2. Учимся работать в Microsoft Word правильно. Работа с рисунками

3. Учимся работать в LibreOffice Writer правильно


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

Основное меню для работы с макросами расположено в «Вид – Макросы».

Как записывать макрос мы разбирать не будем, потому что это слишком просто и описано уже миллион раз. Вместо этого мы будем учиться писать макросы самостоятельно.

Макросы в MS Word пишутся на упрощенной реализации языка Visual Basic – VBA

или сисярпе. В данном уроке мы написание макросов на сисярпе разбирать не будем – я этого языка попросту не знаю, т. к. не питаю особенно теплых чувств к разработкам Microsoft.

Для данного урока я написал следующие макросы, помогающие исключить из работы всплывающие окна с последующим выбором из списков (что отнимает уйму времени):


1. Для вставки нумерации рисунков и таблиц (бывает полезно, когда приходится оживлять чужой документ, набранный на печатной машинке производства Microsoft);

2. Для вставки подписей к рисункам и таблицам вида «Рисунок 1 – » и «Таблица 1 – »;

3. Для вставки ссылок на нумерацию рисунков и таблиц вида «°Рисунок , «°Таблица , где перечеркнутый текст имеет тип «hidden», то есть мы автоматизируем то, что делали вручную в статье «Учимся работать в Microsoft Word правильно. Работа с рисунками».


Велик соблазн хранить все макросы в отдельном шаблоне global_macros.dotm, как это описано здесь. Но, как выяснилось, работает это только в MS Office for MAC.

Под Windows, после переноса файла global_macros.dotm в папку STARTUP (C:\Documents and Settings\{{user}}\Application Data\Microsoft\Word\STARTUP),

MS Word видит этот шаблон, но в окне «Вид – Макросы» создать, изменить или удалить макросы из global_macros.dotm мы не можем.
Также при нажатии на кнопку «Отладка» мы получаем сообщение «Project is unviewable».

Настроек, подобных «Личные параметры – Расположения файлов» в Microsoft Word 2013 for Windows я не обнаружил (возможно, это уже реализовано в MS Word 2016 или 365). Поэтому, в качестве более универсального решения, я рекомендую добавлять макросы в базовый шаблон Normal.dotm с помощью редактора Microsoft Visual Basic for Applications, который открывается из MS Word с помощью комбинации клавиш «Alt + F11».


Из-за проблем с кодировкой копировать код с русскими буквами нужно только при включенной русской раскладке.

Более хирургические варианты решения этой проблемы описаны тут.


Итак, с помощью контекстного меню «Insert – Module» к шаблону «Normal» добавляем новый модуль, в который мы будем копировать скрипт.

У меня этих модулей 6 штук,
но можно все процедуры, начинающиеся с команды Sub, поместить и в один модуль.
После того, как мы скопируем все процедуры в шаблон Normal.dotm, мы должны увидеть в окне «Вид – Макросы» что-то типа этого.
Велик соблазн написать название процедуры по-русски, чтобы название макроса по-русски же отображалось в меню «Вид – Макросы», но не делайте этого, потому что у вас случайным образом перестанут работать горячие клавиши, назначенные на запуск макросов.

Этот эффект лично у меня проявился не сразу (через несколько дней после начала работы с макросами, изначально все назначенные горячие клавиши работали как надо), но он исчез сразу после того, как я переименовал все процедуры.

Теперь настроим горячие клавиши для запуска макросов.

Для этого переходим в «Файл – Параметры – Настроить ленту – Сочетания клавиш: Настройка...»

Затем слева в окне «Настройка клавиатуры» выбираем «Макросы», а справа макрос, для запуска которого мы хотим назначить комбинацию клавиш.
Поместив курсор в поле «Новое сочетание клавиш» и набрав его на клавиатуре, нажимаем «Назначить». На данный момент все наиболее удобные комбинации клавиш в MS Word уже назначены разработчиками, но Вы можете спокойно переназначить те из них, которые Вы не используете.

В данном примере мы теперь можем добавить подпись к таблице комбинацией клавиш «Ctrl + Shift +ю».


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


В принципе, программирование на бейсике особо ничем не отличается от программирования на остальных языках. Современный бейсик похож на Python и Ruby тем, что в нем используются отступы. Комментарии (неисполняемые строки) начинаются с одинарной кавычки.


Как я уже упоминал, процедура в VBA начинается со слова Sub, и заканчивается End Sub.

Переменная объявляется с помощью команды Dim, значение переменной устанавливается с помощью команды Set.


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


Писать скрипты можно непосредственно в редакторе Microsoft Visual Basic for Applications (он «на лету» исполняет скрипт и показывает ошибки), но мне для демонстрации проще делать это в текстовом редакторе Notepad++.

Опишем скрипт InsertImageSequence.bas (вставить номер рисунка).


В целом для написания собственных скриптов вам понадобится научиться работать с полями и текстом.


Логика написания скрипта такая:

1. Нам нужно добавить поле, которое выводит номер последовательности. Посмотреть вид этого поля можно в контекстном меню «Коды / значения полей», кликнув по полю, полученному традиционным способом, правой кнопкой мыши;

Слово MERGEFORMAT в данном случае не имеет значения, т. к. это просто директива «не менять формат», которую MS Word добавляет автоматически.


2. Далее необходимо указать место, в которое мы хотим вставить текст / поле. В данном случае это текущее местонахождение выделения / курсора. Все основные операции с текстом в VBA замечательно описал Биллиг Владимир Арнольдович, и для понимания работы с объектами Range и Selection, которые мы будем использовать, я рекомендую прочитать его статью;


3. Необходимо в выделение добавить поле с присвоенным ему типом (в данном случае SEQ). Для этого мы будем использовать метод Add, описанный в документации Microsoft. Как обозначаются типы полей в скриптах описано здесь. В данном случае нам необходимо узнать, как обозначается в скрипте тип поля SEQ (wdFieldSequence), чтобы указать его в качестве параметра Type метода Add. Также необходимо указать параметры, которые мы посмотрели в пункте 1.


В итоге у нас получается что-то типа этого

Сложно? Нет! Попробуем посложнее – опишем скрипт InsertCaptionToImage.bas (добавить подпись к рисунку).

Элементарно. Здесь просто добавились некоторые методы из статьи Биллига для добавления текста до и после поля.

Наконец, рассмотрим скрипт InsertRefToImage.bas (добавить ссылку на изображение).

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

1. Неразрывный пробел средствами VBA

2. Getting User Input in a Dialog Box

3. Word Macro for Insert Cross-Reference

4. How to: Programmatically Hide Text in Documents


Все эти замечательные рецепты ищутся в обыкновенном google по запросу, начинающемуся на «word macro» или «word vba».


В следующей статье мы рассмотрим основные правила типографики и работу со списком литературы в MS Word.


Ссылка на макросы


Ссылка на обновленный шаблон Normal.dotm

Вы смотрите срез комментариев. Показать все
2
Автор поста оценил этот комментарий

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

1. На шарпе не пишут скрипты, только надстройки VSTO.

2. Через SET устанавливаются не значение, а ссылки на обьекты.

Dim Text as String
Text = "Привет"
Dim WS as Worksheet
set WS =  Thisworkbook.Worksheets(1)

3. На счет невозможности редактирования кода через подключение надстройки.

А зачем вам этот функционал в работе с готовым скриптом?

п.с. Хотя решение и вправду спорное, тот же эксель позволяет это свободно делать.

4. Зачем вам 5-6 разных процедур, а не одна большая, которая будет делать все за 1 клик?

5. Не думали ввести публичную переменную, которая будет хранить номера рисунков. Дабы не вводить их постоянно при постепенном редактировании файла?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий
4. Назначение горячих клавиш можно встроить и в сам код, и сделать одну процедуру для всего, но тогда люди не смогут быстро настроить комбинации по своему усмотрению, и им придется править код.
0
Автор поста оценил этот комментарий
1. Я рад за них. Только это не соответствует действительности. В тексте есть ссылка how to: programmatically hide text in documents. Там на двух языках;
2. В данном случае нам это по-барабану — мы не на С++ пишем, где это дюже критично;
3. А зачем ограничивать редактирование кода в надстройке?
4. Может быть потому что мне не нужна одна процедура, выполняющая 6 разных действий одновременно?
5. Вы всегда редактируете рисунки строго один за другим? Зачем это нужно, если я сделал универсальный input?
раскрыть ветку (2)
3
Автор поста оценил этот комментарий

1. Так-то, по вашей ссылке примеры кода на vb.net и с# для написания десктопных приложений и VSTO надстроек. Кусочек кода на vb.net элементарный, поэтому без проблем переносится на vba почти без изменеий, но это не всегда так.

2.

В данном случае нам это по-барабану

Но почему-то ренжи вы устанавливаете через сет, а стринги без него. А попробуйте наоборот, прикола ради)

3. Хз. Безопасности ради может быть. Так то, редактирование кода всё также доступно при открытии файла .docm, в котором он и находится. Вы один фиг не лазиете в него при каждой работе.

4. Ну я фиг знаю, зачем вы у меня это спрашиваете? Если у вас есть ответ на вопрос, нужно его отвечать в утвердительной форме, а не вопросом.

5. Я вообще не редактирую рисунки.

А после этого вашего предложения:

бывает полезно, когда приходится оживлять чужой документ, набранный на печатной машинке производства Microsoft

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

Зачем это нужно, если я сделал универсальный input?

Чтобы не держать в уме, при возникновении ситуации последовательного заполнения, какой же там был рисунок, 33 или 34, или это таблица была 33, а рисунок 32...

Если же вам так нравятся инпуты, никто не мешает при наличии в нем номера, печатать его, а при пустом значении, ставить просто следующее число. И тогда алгоритм из "хоткей-число-интер", превращается в "хоткей-интер".

Мы ж тут топим как я понял за оптимизацию труда.


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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Я предложения, подобные вашим, называю "эстетизм".
1. Для того чтобы писать в ms office на C#, нужно поставить студию. Это все отличие;
2. По поводу присвоения и создания ссылки с помощью Set критику принимаю. Сам об этом на днях читал — из бошки почему-то выпало. На VB сам не пишу, не успел еще дойти до подробностей;
3. Там вообще не предполагается, что это нужно таким образом использовать. Доки этих "надстроек" для MS office Word для Mac. Я просто экспериментировал. Исходно все должно быть доступно — в доках написано как сделать, чтобы было доступно, но под Mac.
5. Так сделать безусловно можно, но не в учебном материале, который и так сложный для большинства людей.
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества