Поиск справки по использованию редактора Visual Basic
Excel для Microsoft 365 Word для Microsoft 365 Outlook для Microsoft 365 PowerPoint для Microsoft 365 Access для Microsoft 365 Visio, план 2 Excel 2021 Word 2021 Outlook 2021 PowerPoint 2021 Access 2021 Visio профессиональный 2021 Visio стандартный 2021 Excel 2019 Word 2019 Outlook 2019 PowerPoint 2019 Access 2019 Visio профессиональный 2019 Visio стандартный 2019 Excel 2016 Word 2016 Outlook 2016 PowerPoint 2016 Access 2016 Visio профессиональный 2016 Visio стандартный 2016 Excel 2013 Word 2013 Outlook 2013 PowerPoint 2013 Access 2013 Visio профессиональный 2013 Visio 2013 Excel 2010 Word 2010 Outlook 2010 PowerPoint 2010 Visio премиум 2010 Visio 2010 Visio стандартный 2010 Excel 2007 Word 2007 Outlook 2007 PowerPoint 2007 Visio 2007 Visio стандартный 2007 Office 2007 Еще. Меньше
Microsoft Visual Basic для приложений (VBA) позволяет записывать, сохранять и редактировать макросы для автоматизации задач в приложениях Office людям, не обладающим навыками программирования. В этой статье объясняется, где найти справку при использовании редактора Visual Basic в приложении Office.
Работа с Word — Создание, открытие, форматирование, закрытие и сохранение
Использование Word в приложениях на Visual Basic 6 открывает широчайшие возможности для создания профессионально оформленных документов (например отчетов). Это часто необходимо при работе в фирме или на предприятии для обеспечения документооборота. Основным преимуществом использования Wordа в этом случае является то, что практически на всех компьютерах, используемых в фирмах и на предприятиях установлены Windows и пакет Microsoft Office. Поэтому подготовленные документы Word не требуют каких-либо дополнительных усилий для их просмотра, печати и редактирования. Единственное что нужно помнить, это то что работа через автоматизацию OLE (связывание и внедрение объектов) на деле оказывается довольно медленной технологией, хотя и очень полезной.
Чтобы использовать объекты Word в Visual Basic , необходимо инсталлировать сам Word. После этого вы получаете в своё распоряжение библиотеку Microsoft Word Object Library, которую нужно подключить к текущему проекту через диалоговое окно «Разработать»>>»Ссылки» (References) и указать Microsoft Word 9.0 Object Library (для Word 2000).
Два самых важных объекта Word это Word.Application и Word.Document. Они обеспечивают доступ к экземпляру приложения и документам Word.
Поэтому в раздел Generals «Общее» формы введите следующий код для объявления объектных переменных приложения Word и документа Word.
Dim WordApp As Word.Application ' экземпляр приложения Dim DocWord As Word.Document' экземпляр документа
Чтобы создать новый экземпляр Word, введите такой код кнопки;
Private Sub Комманда1_Click() 'создаём новый экземпляр Word-a Set WordApp = New Word.Application 'определяем видимость Word-a по True - видимый, 'по False - не видимый (работает только ядро) WordApp.Visible = True 'создаём новый документ в Word-e Set DocWord = WordApp.Documents.Add '// если нужно открыть имеющийся документ, то пишем такой код 'Set DocWord = WordApp.Documents.Open("C:\DDD.doc") 'активируем его DocWord.Activate End Sub
Для форматирования печатной области документа используйте данный код:
(вообще-то Word использует для всех размеров своих элементов пункты, поэтому для использования других единиц измерения, необходимо использовать встроенные функции форматирования.)
- CentimetersToPoints(Х.ХХ) — переводит сантиметры в пункты.
- MillimetersToPoints(X.XX) — переводит миллиметры в пункты
Private Sub Комманда2_Click() 'отступ слева "2,0 сантиметра" DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2) 'отступ справа "1,5 сантиметра" DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5) 'отступ сверху "3,5 сантиметра" DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(3.5) 'отступ снизу "4,45 сантиметра" DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(4.45) End Sub
Небольшое отступление.
Для того чтобы в своём приложении не писать постоянно одно и тоже имя объекта, можно использовать оператор With.
Например код находящейся выше можно переписать так:
With DocWord.Application.Selection.PageSetup .LeftMargin = CentimetersToPoints(2) .RightMargin = CentimetersToPoints(1.5) .TopMargin = CentimetersToPoints(3.5) .BottomMargin = CentimetersToPoints(4.45) End With
Если вам необходимо создать документ Word с нестандартным размером листа, то используйте данный код:
With DocWord.Application.Selection.PageSetup .PageWidth = CentimetersToPoints(20) 'ширина листа (20 см) .PageHeight = CentimetersToPoints(25) 'высота листа (25 см) End With
Данный код меняет ориентацию страницы (практически меняет местами значения ширины и высоты листа):
DocWord.Application.Selection.PageSetup.Orientation = wdOrientLandscape
- wdOrientLandscape — альбомная ориентация ( число 1)
- wdOrientPortrait — книжная ориентация ( число 0)
Для сохранения документа под новым именем и в определенное место используйте данный код код:
'сохраняем документ как DocWord.SaveAs "c:\DDD.doc"
После такого сохранения вы можете про ходу работы с документом сохранять его.
'сохраняем документ DocWord.Save
Или проверить, были ли сохранены внесенные изменения свойством Saved и если изменения не были сохранены — сохранить их;
If DocWord.Saved=False Then DocWord.Save
Завершив работу с документом, вы можете закрыть сам документ методом Close и сам Word методом Quit.
'закрываем документ (без запроса на сохранение) DocWord.Close True 'закрываем Word (без запроса на сохранение) WordApp.Quit True 'уничтожаем обьект - документ Set DocWord = Nothing 'уничтожаем обьект - Word Set WordApp = Nothing
Если в методах Close и Quit не использовать необязательный параметр True то Word запросит согласие пользователя (если документ не был перед этим сохранён) на закрытие документа.
Если вам необходимо оставить Word открытым, просто не используйте методы Close и Quit.
Если вам необходимо поставить пароль на документ, то используйте код:
DocWord.Protect wdAllowOnlyComments, , "123456789"
Пример программы можно скачать здесь.
Начало работы с VBA в Office
Постоянно возникает проблема, вызванная повторяющейся очисткой данных в 50 таблицах в Word? Хотите, чтобы при открытии определенного документа пользователи получали запрос на добавление данных? Не знаете, как быстро и легко перенести список контактов из Microsoft Outlook в таблицу Microsoft Excel?
Вы можете выполнять эти задачи и значительно больше, используя Visual Basic для приложений (VBA) для Office — простой, но мощный язык программирования, который можно использовать для расширения приложений Office.
Данная статья предназначена для опытных пользователей Office, которые желают познакомиться с VBA и получить некоторое представление о том, как программирование может помочь им настроить Office.
Набор приложений Office обладает множеством возможностей. Существует множество разных способов создания, форматирования и управления документами, электронной почтой, базами данных, формами, электронными таблицами и презентациями. Значительное преимущество программирования на VBA в Office заключается в том, что почти каждое действие, осуществляемое с мышью, клавиатурой или диалоговым окном, можно выполнить с помощью VBA. Если действие можно выполнить с помощью VBA, значит в дальнейшем его можно легко осуществлять сотни раз. (На самом деле автоматизация повторяющихся задач — одно из наиболее частых применений VBA в Office).
Помимо возможности написания скрипта VBA для ускорения повседневных задач, VBA можно использовать для добавления новых функций в приложения Office или создания запросов и взаимодействия с пользователем ваших документов в соответствии с потребностями вашей организации. Например, можно написать код VBA, выводящий всплывающее сообщение, которое напоминает пользователям о необходимости сохранения документа на определенном сетевом диске при первой попытке его сохранения.
В этой статье описываются некоторые основные причины для использования возможностей программирования на VBA. Здесь описывается язык VBA и встроенные средства, которые можно использовать для работы со своими решениями. И, наконец, в данной статье можно найти советы и приемы, чтобы избежать некоторых распространенных ошибок программирования.
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.
Причины использования VBA
Есть несколько основных причин использовать программирование на VBA в Office.
Автоматизация и повторяемость
Программирование на VBA эффектно и эффективно при создании решений для устранения повторяющихся проблем форматирования и исправлений. Например, вам когда-нибудь приходилось изменять стиль абзаца в верхней части каждой страницы в Word? Или менять формат нескольких таблиц, скопированных из Excel в документ Word или электронную почту Outlook? А вносить одинаковые изменения в несколько контактов Outlook?
Если имеется изменение, которое нужно внести более десяти или двадцати раз, возможно, стоит реализовать его с помощью VBA. Если изменение нужно внести несколько сотен раз, определенно следует рассмотреть VBA. Почти все изменения форматирования или редакторские правки, которые можно внести вручную, можно реализовать на VBA.
Расширения возможностей взаимодействия с пользователем
Иногда некоторые действия пользователей с документом или приложением Office обязательны или желательны, но не доступны в стандартном приложении. Например, нужно уведомлять пользователей о необходимости что-то сделать при открытии, сохранении или печати документа.
Взаимодействие приложений Office
Нужно скопировать все контакты из Outlook в Word и отформатировать их определенным способом? Или же нужно переместить данные из Excel в набор слайдов PowerPoint? Иногда простое копирование и вставка не работают так, как надо, или же это происходит слишком медленно. Воспользуйтесь программированием на VBA для работы с данными в двух или более приложениях Office одновременно, а затем измените содержимое в одном приложении с учетом содержимого в другом.
Другой способ
Программирование на VBA — это мощное решение, но данный подход не всегда является оптимальным. Иногда, чтобы достичь поставленных целей, имеет смысл воспользоваться другими методами.
Важнейший вопрос состоит в поиске более легкого способа. Перед запуском проекта VBA обратите внимание на встроенные инструменты и стандартные функциональные возможности. Например, если необходимо выполнить времяемкую задачу редактирования или размещения элементов, для решения проблемы следует рассмотреть возможность использования стилей или сочетания клавиш. Можете ли вы выполнить задачу единожды, а затем повторить ее с помощью сочетания клавиш CTRL+Y («Повторить»)? Можно ли создать документ правильного формата или с нужным шаблоном и затем скопировать содержимое в новый документ?
Приложения Office обладают множеством возможностей. Возможно, нужное решение уже в них предусмотрено. Узнайте больше об Office, прежде чем начинать программирование.
Перед созданием проекта VBA убедитесь, что у вас есть время на работу с VBA. Программирование требует внимания и может оказаться непредсказуемым. Если вы начинающий программист, тем более не стоит увлекаться программированием, если не хватает времени на внимательную работу. Попытки написать «скрипт на скорую руку» для решения проблемы в сжатые сроки может привести к напряженной ситуации. Если вы торопитесь, воспользуйтесь более привычными методами, даже если они сопряжены с монотонностью и повторениями.
Введение в программирование на VBA
Использование кода для выполнения операций приложениями
Написание кода может казаться очень сложным и непонятным процессом. На самом деле, его базовые принципы основаны на применении повседневной логики и вполне доступны. Объекты в приложениях Microsoft Office, созданные для получения инструкций, можно сравнить с кнопками телефона. Когда вы нажимаете кнопку, телефон распознает команду и включает соответствующую цифру в набираемую последовательность. При программировании вы взаимодействуете с приложением, отправляя инструкции различным объектам. Эти объекты эффективны, но у них есть свои ограничения. Они смогут делать только то, для чего были разработаны, и выполнять только ваши инструкции.
Например, представьте себе пользователя, который открывает документ Word, вносит несколько изменений, а затем сохраняет и закрывает его. Для программирования на VBA приложение Word предоставляет объект Document. Используя код VBA, можно заставить объект Document выполнять такие действия, как открытие, сохранение и закрытие.
В следующем разделе описывается организация объектов.
Объектная модель
Разработчики организуют объекты программирования в виде иерархии, и такая иерархия называется объектной моделью приложения. В Word, например, есть объект верхнего уровня Application, который содержит объект Document. Объект Document содержит объекты Paragraph и т. д. В объектных моделях приблизительно отражено то, что вы видите в пользовательском интерфейсе. Они являются концептуальной картой приложения и его возможностей.
Определение объекта называется классом, и вы, возможно, увидите, как два этих термина используются попеременно. С технической точки зрения класс — это описание или шаблон, используемый для формирования или создания экземпляра объекта.
Уже существующим объектом можно управлять, задавая его свойства и вызывая его методы. Если представить объект в виде имени существительного, свойства станут прилагательными, описывающими существительное, а методы — глаголами, которые приводят его в действие. Изменение свойства приводит к модификации определенной характеристики внешнего вида или поведения объекта. Вызов одного из методов объекта заставляет последний выполнить какое-либо действие.
Код VBA в этой статье взаимодействует с приложением Office, в котором многие объекты, которыми управляет код, уже настроены и работают (например, объект Application приложения, Worksheet в Excel, Document в Word, Presentation в PowerPoint, объекты Explorer и Folder в Outlook). Узнав основную структуру объектной модели и некоторые ключевые свойства объекта Application, которые предоставляют доступ к его текущему состоянию, можно расширить возможности приложения Office с помощью VBA в Office.
Методы
В Word, например, можно изменить свойства и вызвать методы текущего документа Word с помощью свойства ActiveDocument объекта Application. Это свойство ActiveDocument возвращает ссылку на объект Document, активный в приложении Word. «Возвращает ссылку на» означает «предоставляет доступ к».
В приведенном ниже коде выполняется именно то, что сказано; т. е. активный документ приложения сохраняется.
Application.ActiveDocument.Save
Прочитайте код слева направо: «В этом приложении с документом, на который ссылается ActiveDocument, вызовите метод Save «. Имейте в виду, что Save — это простейшая форма метода; для этого не требуется никаких подробных инструкций от вас. Объекту Document дается команда сохранения (Save), а дополнительные данные вводить не нужно.
Если методу требуются дополнительные данные, они называются параметрами. В приведенном ниже коде выполняется метод SaveAs, для которого требуется указать новое имя файла.
Application.ActiveDocument.SaveAs ("New Document Name.docx")
Значения, которые указываются в скобках после имени метода — это параметры. Здесь новое имя файла — параметр метода SaveAs.
Свойства
Для задания свойства используйте такой же синтаксис, что и для чтения свойства. В приведенном ниже коде выполняется метод для выбора ячейки A1 в Excel и затем задается свойство для записи данных в ячейку.
Application.ActiveSheet.Range("A1").Select Application.Selection.Value = "Hello World"
Первая задача при программировании на VBA — осознать объектную модель каждого приложения Office и научиться читать синтаксис объекта, метода и свойства. Во всех приложениях Office объектные модели похожи, но каждая из них обладает особенными характеристиками в соответствии с типом документов и объектов, которыми управляет.
В первой строке фрагмента кода указан объект Application, на этот раз это приложение Excel, а затем объект ActiveSheet, который предоставляет доступ к активному листу. После этого используется термин , который не так знаком, Range, что означает «определить диапазон ячеек таким образом». Код указывает Range создать себя только с A1 в качестве определенного набора ячеек. Другими словами, в первой строке кода объявляется объект Range и запускается метод для его выбора. Результат автоматически сохраняется в другом свойстве объекта Application с именем Selection.
Во второй строке кода задается значение свойства Value объекта Selection, равное «Hello World» и отображающееся в ячейке A1.
Самый простой код VBA может предоставлять доступ к объектам в приложении Office, с которым вы работаете, и задавать их свойства. Например, можно получить доступ к строкам в таблице Word и изменить их форматирование в скрипте VBA.
Это звучит просто, но может быть невероятно полезно. Написав такой код, можно освоить всю мощь программирования для внесения одинаковых изменений в несколько таблиц или документов в соответствии с определенной логикой или каким-то условием. Сделать 1000 изменений для компьютера почти то же самое, что 10, поэтому при работе с большими документами и при решении множества проблем VBA может оказаться очень полезен и сэкономить много времени.
Макросы и редактор Visual Basic
Теперь вы кое-что знаете об объектных моделях в приложениях Office. Возможно, вам не терпится попробовать вызвать методы объекта, задать его свойства и отреагировать на события объекта. Для этого необходимо написать свой код так, чтобы он распознавался в Office. Обычно это делается с помощью редактора Visual Basic. Несмотря на то, что он установлен по умолчанию, многие пользователи даже не догадываются о его наличии до тех пор, пока не включат его на ленте.
Все приложения Office используют ленту. Одной из вкладок на ленте является вкладка Разработчик, где можно вызвать редактор Visual Basic и другие инструменты разработчика. Так как в Office вкладка Разработчик не показана по умолчанию, необходимо вывести ее на экран, выполнив указанные ниже действия.
Включение вкладки «Разработчик»
- На вкладке Файл выберите Параметры, чтобы открыть диалоговое окно Параметры.
- Выберите пункт Настроить ленту в левой части диалогового окна.
- В разделе Выбрать команды, расположенном слева в окне, выберите Часто используемые команды.
- В разделе Настроить ленту, который находится справа в диалоговом окне, выберите Основные вкладки в раскрывающемся списке, а затем установите флажок Разработчик.
- Нажмите кнопку OK.
В Office 2007 показ вкладки Разработчик выполняется путем нажатия кнопки Office, выбора пункта Параметры, а затем установки флажка Показать вкладку «Разработчик» на ленте в категории Популярные диалогового окна Параметры.
После включения вкладки Разработчик можно легко найти кнопки Visual Basic и Макрос.
Рис. 1. Кнопки на вкладке «Разработчик»

Проблемы безопасности
Для защиты документов Office от вирусов и вредоносных макросов не сохраняйте код макросов в стандартных документах Office со стандартным расширением файла. Следует сохранить код в файле с особым расширением. Например, сохраняйте макросы не в стандартном документе Word с расширением DOCX, а в специальном документе Word с поддержкой макросов и расширением DOCM.
При открытии DOCM-файла система безопасности Office все равно может запретить запуск макросов в документе, сообщая или не сообщая об этом. Изучите параметры и настройки центра управления безопасностью во всех приложениях Office. По умолчанию макросы отключены, но пользователь оповещается об этом и может включить их.
Можно указать специальные папки, в которых можно выполнять макросы, создав надежные расположения, надежные документы или надежных издателей. Самый универсальный способ — использовать надежных издателей. Этот способ подходит для работы с документами, у которых есть распространяемые вами цифровые подписи. Чтобы получить дополнительные сведения о параметрах безопасности в определенном приложении Office, откройте диалоговое окно Параметры, а затем выберите Центр управления безопасностью и Параметры центра управления безопасностью.
Некоторые приложения Office, такие как Outlook, сохраняют макросы по умолчанию в основном шаблоне на локальном компьютере. Хотя это позволяет уменьшить количество проблем с безопасностью на локальном компьютере при выполнении собственных макросов, для распространения своих макросов в этом случае потребуется стратегия развертывания.
Запись макроса
Если нажать кнопку Макрос на вкладке Разработчик, открывается диалоговое окно Макрос, которое предоставляет доступ к подпрограммам или макросам VBA, которые можно использовать из определенного документа или приложения. Кнопка Visual Basic открывает редактор Visual Basic, где можно создавать и редактировать код VBA.
На вкладке Разработчик в Word и Excel также есть кнопка Запись макроса, которая автоматически создает код VBA, позволяющий воспроизводить ваши действия в приложении. Запись макроса — это великолепное средство, которое можно использовать для изучения VBA. Читая такой код, можно понять язык VBA и объединить знания пользователя и программиста Office. Только помните о том, что этот код может быть запутанным, так как редактор макросов делает допущения насчет ваших намерений, которые не всегда точны.
Запись макроса
- Создайте книгу в Excel и откройте вкладку Разработчик на ленте. Нажмите кнопку Запись макроса и оставьте все параметры по умолчанию в диалоговом окне Запись макроса, в том числе имя Макрос1 и расположение Эта книга.
- Нажмите кнопку ОК, чтобы начать запись макроса. Обратите внимание, что текст кнопки изменяется на Остановить запись. Нажмите эту кнопку, когда выполните все записываемые действия.
- Выберите ячейку B1 и введите классическую первую строку программиста — Hello World. Прекратите ввод текста и посмотрите на кнопку Остановить запись. Она серая, так как Excel ждет, пока вы завершите ввод значения ячейки.
- Выберите ячейку B2, чтобы завершить действие в ячейке B1, а затем нажмите кнопку Остановить запись.
- Выберите пункт Макросы на вкладке Разработчик, выберите макрос Макрос1, если он еще не выбран, и нажмите кнопку Изменить, чтобы просмотреть код Макрос1 в редакторе Visual Basic.
Рис. 2. Код макроса в редакторе Visual Basic

Код
Созданный макрос должен выглядеть указанным ниже образом.
Sub Macro1() ' ' Macro1 Macro ' ' Range("B1").Select ActiveCell.FormulaR1C1 = "Hello World" Range("B2").Select End Sub
Учтите схожие моменты с предыдущим примером кода, в котором выбирается ячейка A1, и отличия от него. В этом примере кода выбирается ячейка B1, а затем строка «Hello World» записываются в активную ячейку. Кавычки вокруг текста обозначают строковое значение (в противоположность числовому значению).
Вспомните, что для отображения кнопки Остановить запись нужно было выбрать ячейку B2. Это действие также задается в строке кода. Средство записи макроса записывает каждое нажатие клавиши.
Строки кода, начинающиеся с апострофа и выделенные зеленым цветом — это комментарии, которые поясняют код или напоминают другим программистам его предназначение. VBA игнорирует любую строку или ее часть, которые начинаются с одинарной кавычки. Написание понятных и подходящих комментариев в коде очень важно, но в этой статье данная тема не затрагивается. В следующих ссылках на этот код в данной статье эти четыре строки комментариев отсутствуют.
Когда средство записи макроса генерирует код, оно использует сложный алгоритм для определения нужных методов и свойств. Если не удается распознать данное свойство, пользователь может воспользоваться множеством ресурсов. Например, в записанном макросе средство записи макроса сгенерировало код, который ссылается на свойство FormulaR1C1. Не знаете, что это значит?
Помните, что объект Application используется во всех макросах VBA. Записанный код работает с приложением в начале каждой строки.
Использование справки разработчика
Выберите FormulaR1C1 в записанном макросе и нажмите F1. Система справки запустит быстрый поиск, определит, что нужные темы есть в разделе «Разработчик» справки Excel, и укажет свойство FormulaR1C1. Можно щелкнуть ссылку, чтобы прочитать описание свойства, но прежде обратите внимание на ссылку Справочник по объектной модели Excel в нижней части окна. Щелкните ее, чтобы просмотреть список объектов, которые Excel использует в объектной модели для описания листов и их компонентов.
Выберите любой из них, чтобы просмотреть свойства и методы, которые применяются к этому объекту, а также ссылки на другие связанные с ними параметры. Многие записи справки содержат короткие примеры кода, которые могут быть полезны. Например, можно перейти по ссылкам в описании объекта Borders, чтобы узнать, как задать границу в VBA.
Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
Редактирование кода
Код с границами отличается от записанного макроса. В объектной модели есть несколько способов адресации любого объекта (ячейки A1 в этом примере), что может вызывать затруднения.
Иногда самый лучший способ изучить программирование — вносить небольшие изменения в определенный рабочий код и смотреть, что получается. Попробуйте сделать это сейчас. Откройте Макрос1 в редакторе Visual Basic и измените код указанным ниже образом.
Sub Macro1() Worksheets(1).Range("A1").Value = "Wow!" Worksheets(1).Range("A1").Borders.LineStyle = xlDouble End Sub
Используйте копирование и вставку, где это возможно, чтобы избежать опечаток.
Для запуска сохранять код не требуется, поэтому вернитесь в документ Excel, выберите Макросы на вкладке Разработчик, выберите Макрос1 и нажмите кнопку Запустить. Теперь в ячейке A1 есть текст Wow!, а вокруг него размещена граница из двойных линий.
Рис. 3. Результаты первого макроса

Только что вы записали макрос, прочитали документацию по объектной модели и написали простую программу на VBA, которая что-то делает. Поздравляем!
Программа не работает? Читайте дальше и узнайте о методах отладки в VBA.
Советы и приемы программирования
Начните с примеров
Сообщество программистов на VBA очень большое; поиск в Интернете почти всегда может дать пример кода на VBA, который выполняет почти те же действия, которые необходимы вам. Если не удается найти хороший пример, попробуйте разбить задачу на более мелкие модули и выполнить поиск каждого из них. Или попробуйте найти более общую, но аналогичную задачу. Если начать с примеров, это может сэкономить много времени.
Это не означает, что в Интернете всегда доступен бесплатный и качественный код. В действительности, в найденных программах могут быть ошибки. Идея в том, что примеры из Интернета или документации по VBA помогают начать работу. Помните, что для изучения программирования требуется время и умственные усилия. Перед тем как использовать очередное решение для решения проблемы, спросите себя, подходит ли VBA для этого.
Упрощение задачи
Программирование может быстро стать сложной задачей. Важно, особенно для новичка, разбивать задачу на мельчайшие логические модули, а затем отдельно писать и проверять каждую часть. Если перед вами слишком много кода и вы запутались, остановитесь и отложите задачу. Когда вы к ней вернетесь, скопируйте небольшую часть задачи в новый модуль, разберитесь с ней, напишите работающий код и проверьте его. Затем займитесь следующей частью.
Ошибки и отладка
Существует два основных вида ошибок программирования: синтаксические ошибки, которые нарушают грамматические правила языка программирования и ошибки времени выполнения, которые синтаксически правильны, но вызывают сбой, когда VBA пытается выполнить код.
Хотя исправлять синтаксические ошибки неприятно, их легко обнаружить; редактор Visual Basic выдает сопровождающееся звуковым сигналом сообщение об ошибке и меняет цвет текста, если при вводе кода найдена синтаксическая ошибка.
Например, в VBA строковые значения должны быть заключены в двойные кавычки. Чтобы узнать, что происходит при использовании одиночных кавычек, вернитесь в редактор Visual Basic и замените строку «Wow!» в примере кода на «Wow!» (т. е. слово Wow в одинарных кавычках). Если выбрать следующую строку, среагирует редактор Visual Basic. Сообщение об ошибке «Ошибка компиляции. Ожидается: выражение» не особо помогает, но строка, содержащая ошибку, становится красной, что говорит о синтаксической ошибке в этой строке. В результате программа не будет запускаться.
Нажмите кнопку ОК и измените текст на «Wow!».
Ошибки времени выполнения обнаружить сложнее, так как синтаксически все выглядит правильно, но при попытке выполнить код возникает сбой.
Например, откройте редактор Visual Basic и измените имя свойства Value на ValueX в макросе, намеренно вызывая ошибку среды выполнения, так как у объекта Range нет свойства ValueX. Вернитесь к документу Excel, откройте диалоговое окно Макрос и запустите Макрос1 еще раз. Вы увидите окно сообщения Visual Basic с описанием ошибки во время выполнения с текстом «Объект не поддерживает это свойство метода». Хотя этот текст не указан, выберите Отладка , чтобы узнать больше.
После возвращения в редактор Visual Basic будет включен специальный режим отладки, в котором желтым цветом выделяется строка кода с ошибкой. Как и ожидалось, желтым выделена строка со свойством ValueX.
Можно внести изменения в исполняемый код VBA, поэтому измените ValueX на Value и нажмите маленькую зеленую кнопку воспроизведения в меню Отладка. Программа должна запуститься без ошибок.
Будет полезно узнать, как эффективнее использовать отладчик для более длинных и сложных программ. Хотя бы изучите, как устанавливать точки останова, чтобы прекращать выполнение программы там, где нужно взглянуть на код, как добавлять контрольные значения, чтобы просматривать значения разных переменных и свойств во время выполнения кода, и как пошагово, строка за строкой, выполнять код. Все эти возможности доступны в меню Отладка, а серьезный пользователь отладчика обычно запоминает соответствующие сочетания клавиш.
Правильное использование справочных материалов
Чтобы открыть справочник разработчика, встроенный в справку Office, откройте справку в любом приложении Office, выбрав вопросительный знак на ленте или нажав клавишу F1. Затем справа от кнопки Поиск выберите стрелку раскрывающегося меню для фильтрации содержимого. Выберите Справочник разработчика. Если на левой панели не отображается содержание, щелкните маленький значок книги, чтобы открыть его, и разверните справочник по объектной модели.
Рис. 5. Фильтрация справки разработчика применяется ко всем приложениям Office

Время, потраченное на исследование справочника по объектной модели, быстро окупится. Когда вы изучите базовый синтаксис VBA и объектную модель приложения Office, с которым вы работаете, можно перейти от догадок к методичному программированию.
Конечно, центр разработки Microsoft Office — это прекрасный портал со статьями, советами и форумами сообщества.
Поиск в форумах и группах
Рано или поздно все программисты попадают в ситуацию, когда невозможно решить какую-либо проблему, даже прочитав все найденные статьи и проведя много бессонных ночей в поисках ее решения. К счастью, в Интернете появилось сообщество разработчиков, которые помогают друг другу при решении задач программирования.
Если поискать в Интернете «форум разработчиков Office», можно найти несколько таких групп обсуждений. Можно поискать «разработка Office» или описание проблемы и найти нужные форумы, блоги и статьи.
Если сделано все возможное, чтобы решить проблему, не бойтесь задать вопрос на форуме разработчиков. В таких форумах приветствуются вопросы от новичков-программистов, и многие опытные разработчики с радостью помогут им.
Далее описаны некоторые вопросы этикета, которых следует придерживаться при публикации на форуме разработчиков.
- Перед публикацией поищите на сайте часто задаваемые вопросы или инструкции, которые следует соблюдать. Убедитесь, что публикация соответствует этим инструкциям и расположена в нужном разделе форума.
- Представьте ясный и полный пример кода, и если он является частью более сложного кода, укажите это.
- Опишите проблему четко и кратко и укажите действия, выполненные для решения проблемы. Не спешите и напишите вопрос, как можно лучше, даже если вы взволнованны или вам не хватает времени. Опишите ситуацию так, чтобы читатели поняли ее после первого прочтения.
- Будьте вежливы и выражайте благодарность за все ответы.
Более подробное изучение программирования
Хотя это короткая статья, и в ней представлена лишь малая часть сведений о VBA и программировании, надеюсь, ее будет достаточно для начала.
В этом разделе кратко описываются некоторые другие важные темы.
Переменные
В примерах в этой статье использовались объекты, которые уже создало приложение. Иногда требуется создать собственные объекты для хранения значений или ссылок на другие объекты. Они называются переменными.
Чтобы использовать переменную в VBA, необходимо сообщить VBA, какой тип представляет переменная, с помощью оператора Dim. Затем задается значение переменной, и она используется для установки других переменных и свойств.
Dim MyStringVariable As String MyStringVariable = "Wow!" Worksheets(1).Range("A1").Value = MyStringVariable
Ветвление и циклы
В примерах простых программ в этой статье код выполняется строка за строкой, сверху вниз. Реальные возможности программирования состоят в том, что можно определять, какие строки кода выполнять, в зависимости от одного или нескольких указанных условий. Эти возможности можно расширить, если повторять операцию нужное количество раз. Например, приведенный ниже пример кода расширяет Макрос1.
Sub Macro1() If Worksheets(1).Range("A1").Value = "Yes!" Then Dim i As Integer For i = 2 To 10 Worksheets(1).Range("A" & i).Value = "OK! " & i Next i Else MsgBox "Put Yes! in cell A1" End If End Sub
Введите или вставьте код в редакторе Visual Basic и запустите его. Следуйте инструкциям в появившемся окне сообщений и измените текст в ячейке A1 с «Wow!» на «Yes!», а затем выполните программу еще раз, чтобы ознакомиться с возможностями циклов. В этом примере кода показаны переменные, ветвление и циклы. Просмотрите его внимательно после выполнения и попробуйте определить, что происходит после выполнения каждой строки.
Все приложения на вкладке «Мой Office»: примеры кода
Вот несколько скриптов, которые можно попробовать. Каждый из них решает реальную задачу Office.
Создание электронной почты в Outlook
Sub MakeMessage() Dim OutlookMessage As Outlook.MailItem Set OutlookMessage = Application.CreateItem(olMailItem) OutlookMessage.Subject = "Hello World!" OutlookMessage.Display Set OutlookMessage = Nothing End Sub
Помните, что бывают случаи, когда нужно автоматизировать электронную почту в Outlook или использовать шаблоны.
Удаление пустых строк на листе Excel
Sub DeleteEmptyRows() SelectedRange = Selection.Rows.Count ActiveCell.Offset(0, 0).Select For i = 1 To SelectedRange If ActiveCell.Value = "" Then Selection.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If Next i End Sub
Помните, что можно выбрать столбец ячеек и запустить этот макрос, чтобы удалить все строки в выбранном столбце с пустыми ячейками.
Удаление пустых текстовых полей в PowerPoint
Sub RemoveEmptyTextBoxes() Dim SlideObj As Slide Dim ShapeObj As Shape Dim ShapeIndex As Integer For Each SlideObj In ActivePresentation.Slides For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1 Set ShapeObj = SlideObj.Shapes(ShapeIndex) If ShapeObj.Type = msoTextBox Then If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then ShapeObj.Delete End If End If Next ShapeIndex Next SlideObj End Sub
Имейте в виду, что в коде выполняется цикл по всем слайдам и удаляются все текстовые поля, в которых нет текста. Переменная-счетчик уменьшается, а не увеличивается, так как при каждом удалении объекта он удаляется из коллекции, что уменьшает счетчик.
Копирование контакта из Outlook в Word
Sub CopyCurrentContact() Dim OutlookObj As Object Dim InspectorObj As Object Dim ItemObj As Object Set OutlookObj = CreateObject("Outlook.Application") Set InspectorObj = OutlookObj.ActiveInspector Set ItemObj = InspectorObj.CurrentItem Application.ActiveDocument.Range.InsertAfter (ItemObj.FullName & " from " & ItemObj.CompanyName) End Sub
Обратите внимание, что этот код копирует открытый контакт из Outlook в открытый документ Word. Этот код работает, только если в Outlook открыт контакт.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
Были ли сведения на этой странице полезными?
Создание макроса и работа с ним
Для обеспечения корректного построения отчетов, содержащих макросы, требуется установить доверие на доступ к объектной модели VBA .
В Microsoft Word 2007 это осуществляется следующей последовательностью действий:

нажать кнопку Office в верхнем левом углу, нажать кнопку «Параметры Word»;
выбрать закладку «Центр управления безопасностью», нажать кнопку «Параметры центра управления безопасностью»;
выбрать закладку «Параметры макросов», в разделе «Параметры макросов для разработчика» установить опцию «Доверять доступ к объектной модели проектов VBA «.
В Microsoft Word 2010/2013/2016:
выбрать пункт меню «Файл → Параметры…»;
в окне «Параметры Word» выбрать закладку «Центр управления безопасностью», нажать кнопку «Параметры центра управления безопасностью»;
выбрать закладку «Параметры макросов», в разделе «Параметры макросов для разработчика» установить опцию «Доверять доступ к объектной модели проектов VBA «.
Примечание
VBA — Visual Basic for Applications (Visual Basic для приложений) — упрощённая реализация языка программирования Visual Basic, встроенная в линейку продуктов Microsoft Office.
Начало создания макроса
Макрос для отчетов формата Word
Для того, чтобы создать или просмотреть макрос для отчета формата Word необходимо:
открыть отчет в Мастере отчетов;
на ленте «Разработчик» в группе «Код» нажать кнопку «Visual Basic» (или сразу нажать Alt+F11). Откроется окно приложения «Microsoft Visual Basic for Application»;
В окне «Project – TemplateProject» в дереве открыть узел «TemplateProject — Microsoft Word Objects – ThisDocument»;
В правой части окна приложения, где приведен код, будет макрос «ПослеВыполненияОтчета».

Рисунок 1. Вид окна среды VBA при работе с макросом для отчетов формата Word
Если макроса там не будет, его можно создать самостоятельно, введя в данном окне строки начала и конца макроса, а между ними — сам текст макроса:
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
Внимание!
В Word 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:
запустить MS Word;

нажать кнопку Office в верхнем левом углу, нажать кнопку «Параметры Word»;
на закладке «Основные» в разделе «Основные параметры работы с Word» установить опцию «Показывать вкладку «Разработчик» на ленте»
Макрос для отчетов формата Excel
Для того, чтобы создать или просмотреть макрос для отчета формата Excel, необходимо:
открыть отчет в Мастере отчетов;
нажать кнопку «2. Редактировать шаблон»;
в MS Excel на ленте «Разработчик» в группе «Код» нажать кнопку «Visual Basic» (или сразу нажать Alt+F11). Откроется окно приложения «Microsoft Visual Basic for Application»;
В окне «Project – VBAProject» в дереве открыть узел «VBAProject — Modules – Module1»;
В правой части окна приложения, где приведен код, необходимо перейти к макросу «ПослеВыполненияОтчета».

Рисунок 2. Вид окна среды VBA при работе с макросом для отчетов формата Excel
Внимание!
В Excel 2007 закладка «Разработчик» по умолчанию скрыта. Чтобы вывести ее на показ необходимо:
запустить MS Excel;

нажать кнопку Office в верхнем левом углу, нажать кнопку «Параметры Excel»;
на закладке «Основные» в разделе «Основные параметры работы с Excel» установить опцию «Показывать вкладку «Разработчик» на ленте»
Макрос «ПослеВыполненияОтчета»
Любой отчет изначально содержит следующий макрос:
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) ' MsgBox "MACRO ПослеВыполненияОтчета" + CStr(ob.Название) End Sub
Этот макрос будет запускаться после вставки данных в отчет. Он используется в отчетах баз данных, поставляемых с программой. Код по обработке отчета следует вставлять в этот макрос.
Переменные, которые передаются в макрос:
«ob» − объект, от которого был вызван отчет;
«app» − приложение, от которого был вызван отчет, то есть Business Studio.
Внимание!
Просмотреть объектную модель Word для разработки макросов в редакторе Visual Basic можно по клавише F2.
Название привязки для макроса
При решении ряда задач средствами программирования бывает удобно оперировать данными привязок отчета. Для этого необходимо:
Знать название привязки.
Связать переменные в коде VBA с этим названием.
Ниже описано, как это это делается для привязок разных типов.
Тип привязки: Объект
В отчете такие привязки представлены полями.
Использование названия привязки в коде:
ПеременнаяВКоде = Application.ActiveDocument.Variables.Item("НазваниеПривязки").Value
Тип привязки: Список и Фильтр
В отчете такие привязки представлены таблицей.
Использование названия привязки в коде:
Set ТаблицДляОбработки = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1)
Работа с таблицами
В отчетах Business Studio присутствует большое количество таблиц. Поэтому высока вероятность того, что основные задачи будут связаны с их обработкой.
Примеры ключевых функций, которые будут полезны при работы с таблицами, приведены ниже.
Работа с таблицей через название привязки
'переменная для работы с конкретной таблицей Set Table = Application.ActiveDocument.Bookmarks("НазваниеПривязки").Range.Tables(1) countColumn = Table.Columns.Count 'количество столбцов таблицы countRow = Table.Rows.Count 'количество строк таблицы СellText = Table.Cell(2,1).Range.Text 'значение ячейки во 2й строке 1го столбца
Работа с таблицей через её номер в документе
сountTables = ActiveDocument.Tables.Count 'количество таблиц в документе Selection.GoTo What:=wdGoToTable, Which:=wdGoToFirst, Count:=5, Name:="" 'перейти к таблице номер 5 countColumn = Selection.Tables(1).Columns.Count 'количество столбцов таблицы countRow = Selection.Tables(1).Rows.Count 'количество строк таблицы СellText = Selection.Tables(1).Cell(2,1).Range.Text 'значение ячейки во 2й строке 1го столбца
При работе с таблицами следует помнить ряд моментов:
Таблицы могут содержать объединенные ячейки. В случае перебора всех строк таблицы может возникнуть ошибка. Чтобы этого не было, необходимо использовать команду игнорирования ошибки:
On Error Resume Next ' игнорирование - ячейки таблицы имеют вертикальное объединение
При получении текста таблицы следует помнить, что полученное значение ячейки так же содержит в себе 2 служебных символа. Для обработки данных ячейки без этих служебных символов следует произвести «очистку» значения. Например:
СellText = Selection.Tables(1).Cell(3,2).Range.Text 'текст ячейки со служебными символами СellText = Left$(СellText, (Len(CellText) - 2)) 'убираем 2 последних символа ячейки - чистый текст
Приведенная выше информация не является полной для работы с таблицами, а лишь обращает внимание на наиболее возможные ситуации.
Определение направления формирования отчета
Один и тот же отчет Business Studio может рассматриваться из разных мест:
одиночный документ Word или Excel или несколько документов,
HTML -публикация,
Business Studio Portal.
При рассмотрение такого отчета в разных местах есть свои нюансы. Например, отчеты в HTML -публикации и Business Studio Portal не содержат колонтитулов, которые есть в отчете, сделанным отдельным документом Word.
Также могут быть и разные задачи по обработке отчета кодом в зависимости от направления формирования отчета. Для определения направления формирования отчета используются параметры: BSInThread, BSHtml и BSPortal.
| Направление формирования отчета | BSInThread | BSHtml | BSPortal |
|---|---|---|---|
| Одиночный файл (Word, Excel) | False | False | False |
| Пакетное формирование (Word, Excel) | True | False | False |
| HTML -публикация | True | True | False |
| Business Studio Portal | True | True | True |
Таблица 1. Значения специальных переменных в зависимости от направления формирования отчета
Пример использования в коде:
Dim HTMLCreate As Boolean HTMLCreate = Application.ActiveDocument.Variables("BSHtml").Value 'True или False If HTMLCreate Then MsgBox "Выводим для HTML: HTML-публикация или Business Studio Portal" Else MsgBox "Выводим в одиночный файл или потоком файлов" End If
Примечание
При формировании отчета типа HTML ( HTML -публикация, Business Studio Portal) так же происходит формирование и отдельного файла типа Word.
Работа со ссылками в отчетах для HTML
При обработке кодом VBA отчета, сформированного для HTML -публикации или Business Studio Portal, следует помнить, что после формирования отчет представляет собой отображение не тех данных, что видны в браузере, а документ с показом кодов полей. Это не позволяет вести обработку гиперссылок.
Для «нормализации» отображения данных следует сначала использовать следующий код:
ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt+F9 - видим не коды пол
Работа с копией отчета, содержащим макрос
При копировании отчета названия всех привязок изменяются.

Рисунок 3. Названия привязок в исходном отчете

Рисунок 4. Названия привязок в копии отчета
В случае, если в отчете используется макрос, который «опирается» на названия привязок, то следует помнить, что после копирования такой отчет не сможет формироваться таким же образом как оригинал без дополнительной обработки.
Для корректной работы макроса рекомендуется использование проверки на предмет наличия привязки в отчете.
Пример проверки наличия привязки типа «Список». В документе это закладки.
Определяем название привязки типа «Список», которая представляет нужную таблицу (см. Руководство пользователя → Пример определения названия привязки типа «Список»).
BookmarkName = "Изменения_процесса_e1ded8b0" 'название привязки 'Проверка на корректность названия привязки Dim BookmarkIs As Boolean 'сначала считаем, что нужной закладки нет Dim Bkm As Bookmark 'переменная типа Закладка For Each Bkm InActiveDocument.Bookmarks 'перебираем все закладки в документе IfBkm.Name = BookmarkName Then 'если нашли закладку с нашим именем BookmarkIs = True 'отмечаем, что закладка есть 'получаем таблицу по названию привязки Set SettableStatus = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) End If Next If BookmarkIs Then 'если в документе закладка есть 'производим необходимые действия c таблицей End If
Выводить какое-либо сообщение в случае отсутствия привязки не рекомендуется по причине того, что если не будет данных для формирования привязки, то и соответствующей привязки не будет.
Пример проверки наличия привязки типа Объект
Определяем название привязки типа «Объект», которая представляет нужное поле в отчёте (см. статью Руководство пользователя → Пример определения названия привязки типа «Объект»).
VarName = "Статус_процесса_c9a10e8d" 'название привязки 'Проверка наличия указанной привязки в документе Dim VarIs As Boolean 'сначала считаем что привязки нет 'перебираем все переменные документа For Each aVar In ActiveDocument.Variables If aVar.Name = VarName Then 'если среди них есть с нашим именем VarIs = True 'отмечаем это 'получаем значение переменной по названию привязки MyVar = Application.ActiveDocument.Variables.Item(VarName).Value End If Next aVar If VarIs Then 'если в документе привязка есть 'производим необходимые действия с переменной End If
Примечание
Закладки, не относящиеся к привязкам, например, созданные пользователем самостоятельно, при копировании отчетов не изменяются.
Обращение к данным из базы
Из отчета можно напрямую обращаться к данным из базы бизнес-модели. Это делается двумя способами:
Через обращение к параметрам объекта, от которого был вызван отчет.
Через использование механизма OLE.
Обращение к параметрам объекта
Обращение к параметрам объекта, от которого был вызван отчет, происходит таким образом:
«ob» — объект, от которого был вызван отчет;
<СистемноеНазваниеПараметра>− это системное название параметра объекта, которое можно просмотреть в Объектной модели (см. Руководство пользователя → Объектная модель).СистемноеНазваниеПараметра>
Например, при выводе отчета от процесса получить данные названия процесса можно таким образом:
Name = ob.Название 'получаем Название объекта, от которого вызвали отчет
Использование механизма OLE
Механизм OLE предоставляет более широкие возможности по обращению к данным бизнес-модели и выводу этих данных в отчетах по сравнению с обращением просто как данным объекта, от которого был вызван отчет.
Описание механизма OLE подробно описано в главе Руководство технического специалиста → Работа с Business Studio через OLE. Для задействования OLE в отчетах конкретной базы нет необходимости во включении опции «Разрешено использование OLE».
Внимание!
В отчетах при работе с OLE недоступны все методы класса «Система.OleApplication», поскольку в макросе «ПослеВыполненияОтчета» есть аргумент «app», который является приложением Business Studio, а не «Система.OleApplication».
Несколько задач в одном макросе
Бывают ситуации, когда:
В рамках одного отчета необходимо решить более чем одну задачу. Например, форматирование полей типа RTF и вставка столбца в таблицу.
Одну и ту же задачу необходимо применять к разным отчетам. Для этого необходимо скопировать код VBA , который решает поставленную задачу. И будет удобней, если этот код не пересекается с кодами других задач.
Отладку кода удобно вести по одной из задач, на время отключив выполнение других задач.
В таких случаях каждую решаемую задачу удобно оформлять отдельным макросом. А в ключевом макросе «ПослеВыполненияОтчета» лишь вызывать по очереди нужные макросы. Все эти макросы оформляются в том же окне, где и ключевой макрос и делается так:
Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) Call Macros1 Call Macros2 'любые другие макросы End Sub Sub Macros1 () 'В рамках этого макроса решается одна задача End Sub Sub Macros2 () 'В рамках этого макроса решается другая задача End Sub
Если такие макросы имеют одинаковые части кода, то их тоже можно (и рекомендуется) выносить в отдельные макросы или функции в том же окне с ключевым макросом. Например, функция для определения присутствия в отчете необходимой привязки типа «Список» (см. Работа с копией отчета, содержащим макрос) может быть следующей:
Function BookmarkIs(BookmarkName As String) As Boolean 'Проверка на корректность названия привязки Dim Bkm As Bookmark 'переменная типа Закладка BookmarkIs = False 'сначала считаем, что нужной закладки нет For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем BookmarkIs = True 'отмечаем, что закладка есть End If Next End Function
Использование этой функции из макроса может быть таким:
Sub MacrosN () BookmarkName = "НазваниеЗакладкиТипаСписок" If BookmarkIs(BookmarkName) Then 'если в документе закладка есть 'Выполняются необходимые действия End If End Sub
Отладка кода
Разработка макроса, как и любая другая работа, это определенный путь, в котором будут допущены ошибки и будет их исправление. Ошибки могут быть обнаружены сразу или не видны при первом взгляде. Более детально об этом описано в главе Подходы к отладке кода.
Примеры решения задач с использованием макросов
Примеры работы с отчетами при использовании макросов приведены в статье Примеры решения задач.