Как сделать чтобы макрос работал постоянно

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024


Офисные приложения Word и Excel имеют широкий функционал, который избыточен для рядового пользователя. Но, как всегда это бывает, нужной функции под рукой, в самый неподходящий момент, может не оказаться.

Как мы знаем, для таких случаев разработчик снабдил все приложения из пакета Microsoft Office встроенным языком программирования Visual Basic for Applications (VBA).

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

Видеоурок по данной теме "Автозапуск макросов в Word и Excel" вы можете найти на нашем Youtube-канале "Учите компьютер вместе с нами!"

Прежде всего, следует помнить, что обычные документы хранятся в файлах типа *.docx или *.xlsx и не предусматривают наличие макросов. Поэтому, первое, что нужно сделать, это включить такую поддержку. Для этого, во вкладке " Файл " выбираем пункт " Сохранить как " и в открывшемся окне " Сохранение документа ", в списке " Тип файла " выбираем " Документ Word с поддержкой макросов " или " Книга Excel с поддержкой макросов ", указываем требуемое имя файла и нажимаем кнопку " Сохранить ".


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

1. Автозапуск макросов в Word. Здесь все предельно просто. Если вы хотите, чтобы макрос автоматически выполнялся при открытии документа, тогда вам нужно присвоить ему специальное имя "Autoopen".

Находясь в редакторе VBA, выбираем пункт меню "Insert/Вставка", "Module/Модуль". Далее, в открывшемся окне модуля набираем программный код:

Начало макроса записывается командой Public Sub , конец - End Sub . Все что находится между ними - это команды VBA, которые будут автоматом выполняться при открытии данного документа, например:


2. Автозапуск макросов в Excel. Как ни странно, но в Excel такой подход не срабатывает. Здесь "Autoopen" не является зарезервированным именем и такой макрос не будет выполняться автоматически при открытии книги.

Вместо этого, надо указать, что когда с объектом "Рабочая книга" случается событие "Открыть", то нужно выполнить заданный набор команд.

Для этого, в редакторе VBA, в окне "Project" выполняем двойной щелчок левой кнопкой мыши на объекте "ЭтаКнига". В открывшемся окне модуля, из верхнего левого списка выбираем объект "Workbook", а из правого списка - событие "Open", как показано на рисунке ниже.


То есть, название макроса записывается в формате: Объект_Событие . Теперь, вместо многоточия прописываем требуемый программный код. В нашем случае, это команда MsgBox ("Hello, World!") .

Макросы в Microsoft Excel

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

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

В Microsoft Office встроен специальный язык программирования, благодаря которому, человек может записывать определенные макрокоманды – макросы. При помощи таких программ, серферу не нужно выполнять одни и те же команды вручную.

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








Excel 2003

Для одной из первых версий 2003 года процесс запуска макрокоманды следующий:

  1. На Панели управления ищете вкладку Сервис, затем из выпадающего списка выбираете строку Макрос и переходите в раздел Безопасность.


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

На заметку! Чтобы изменения окончательно вступили в силу, необходимо закрыть и открыть редактор. Это общее правило для всех поколений Microsoft Office.

Как включить макросы в Эксель

Как включить макросы в Эксель

Прежде чем приступить к активации, следует запомнить, что:

  • Макрорекордер запишет все действия пользователя, в том числе и ошибки.
  • Записываться будут только те действия, которые выполняются в Microsoft Excel. При переключении на другую программу запись остановится.
  • Макрорекордер способен записать действия, выполняемые серфером вручную.

Чтобы Макрос работал корректно, не допуская оплошностей, обязательно продумайте действия перед началом записи.


Ввод в код макроса функций и процедур

Теперь усложним код макроса, задав ему два параметра:

1. Название месяца отчета запрашиваем у пользователя.

2. Последняя строка отчета БДР (в случае если она плавающая) рассчитывается в коде макроса.

Функция InputBox

Чтобы запросить у пользователя месяц отчета, воспользуемся функцией Inputbox, которая выводит диалоговое окно, в котором пользователь может самостоятельно задать значение переменной, используемой в коде. Синтаксис функции InputBox:

где Zapros — введенная вами переменная (имя придумываете вы сами), а в скобках через запятую перечисляются аргументы функции.

Обратите внимание: первый аргумент является обязательным, то есть любое диалоговое окно должно сопровождаться пояснительным текстом, чего вы ждете от пользователя. Следующие аргументы обязательными не являются и их можно не указывать. То есть если вы хотите задать значение по умолчанию, но не хотите писать текст в шапке диалогового окна, разделите первый и третий аргументы двумя запятыми, как это будет сделано в нашем примере (см. далее).

Для удобства присвойте полученное значение функции InputBox какой-нибудь введенной вами переменной, особенно если в коде макроса вы будете несколько раз использовать значение этой функции.

Важно

Имена вводимых переменных не должны совпадать с уже занятыми VBA словами под название объектов, свойств или функций!

В нашем примере присвоим результат вызова функции InputBox переменной Mes.

Например, нельзя завести свою переменную Range, Cells или Month — компилятор VBA предупредит вас, что делать этого нельзя, и не запустит макрос, пока вы не устраните ошибку (рис. 6).


Рис. 6. Пример ошибки при заведении переменной

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

Итак, приступим к редактированию кода макроса. Добавим в самое начало кода макроса строки:

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


Рис. 7. Диалоговое окно для указания месяца

С помощью функции InputBox можно запросить у пользователя и длину отчета. Но мы научим Excel высчитывать ее самостоятельно. Для этого нам потребуется процедура While.

Процедура While

Используется в коде, если надо сделать одинаковые действия несколько раз подряд до тех пор, пока выполняется какое-либо условие. Синтаксис процедуры While:

Условие может состоять из одного выражения или содержать несколько, перечисленных через оператор AND (то есть оба условия должны быть выполнены) или OR (достаточно выполнения только одного из перечисленных условий). Также условие обязательно должно содержать переменную-счетчик (это может быть номер строки или столбца ячейки, значения которой вы проверяете).

В список команд обязательно должна входить команда наращивания переменной-счетчика, иначе процедура зациклится (так как она постоянно будет сравнивать одно и то же значение) и макрос придется прерывать принудительно.

Рассмотрим применение процедуры While для поиска конца отчета БДР.

Обратите внимание!

Помним, что все текстовые значения надо брать в кавычки. Числа записываем без кавычек:

‘ Ищем последнюю строку отчета

Row_End = 1 ‘ Присваиваем ей номер 1

‘ Запрашиваем у пользователя месяц отчета

‘ Ищем последнюю строку отчета

Row_End = 1 ‘ Присваиваем ей номер 1

‘ Выделяем отфильтрованный диапазон полужирным шрифтом, снимаем фильтр

‘ Форматируем на печать: верхний колонтитул, центрирование по горизонтали, масштаб 75 %

Если нам принципиально, правильно ли макрос нашел последнюю строку отчета, после окончания процедуры While (строка Loop) можно добавить блок проверки значения Row_End и запроса у пользователя подтверждения на продолжение макроса.

Для этого изучим функцию MsgBox, процедуру IF и команду Exit Sub.

Функция MsgBox

Она имеет два вида записи:

1. Мы просто сообщаем пользователю какую-то информацию. В этом случае аргументы функции перечисляются сразу же за функцией, без использования скобок:

На экране отобразится диалоговое окно, и после нажатия пользователем кнопки Ок продолжится выполнение макроса (рис. 8).


Рис. 8. Первый вид записи функции MsgBox

2. Нам важно, что ответил пользователь, мы записываем его ответ в значение какой-то переменной (рис. 9). В этом случае аргументы функции заключаются в скобки, а перед функцией обязательно должна стоять переменная, в которую мы записываем, на какую кнопку нажал пользователь:

Рис. 9. Второй вид записи функции MsgBox

Варианты вида кнопок:

  • vbOKOnly — только кнопка ОК;
  • vbOKCanсel — кнопки ОК и Cancel;
  • vbYesNo — кнопки Yes и No;
  • vbYesNoCancel — кнопки Yes, No и Cancel.

Соответственно в зависимости от нажатой кнопки значения функции MsgBox могут быть vbOK, vbCancel, vbYes или vbNo.

Процедура If

С помощью данной процедуры можно разбить команды кода на две ветки в зависимости от выполнения заданного условия. Синтаксис процедуры If:

Обязательным к заполнению является только условие. Список команд в обоих блоках заполнять не обязательно. В зависимости от ваших задач вы можете заполнить оба блока или только один из них. Условие может состоять из одного выражения или содержать несколько выражений, перечисленных через оператор AND (то есть оба условия должны быть выполнены) или оператор OR (достаточно выполнения только одного из перечисленных условий).

Команда Exit Sub

Прекращает выполнение макроса. Обычно ее используют в ветках процедуры If при проверке допустимости дальнейшего исполнения макроса. Обратите внимание: ни одно действие после команды Exit Sub выполнено не будет. Поэтому если вы хотите сообщить пользователю о принудительном прекращении процедуры, команду MsgBox нужно расположить выше команды Exit Sub.

‘ и спрашиваем подтверждение о продолжении выполнения макроса

If Row_End = 100 Then

Exit Sub ‘ 2. останавливаем макрос

В нашем коде прошло вложение одной процедуры If в другую:

Каждая процедура If должна заканчиваться командой End If. Если количество строк с командой If не будет соответствовать количеству строк с командой End If, компилятор VBA сообщит об ошибке и вам придется искать, где вы потеряли конец процедуры If.

Поэтому рекомендуется сразу писать обе строки, а потом уже наполнять процедуру командами.

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

Как сохранить

Как включить макросы в Эксель

Как включить макросы в Эксель

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

Правила написания команд в VBA

Любая команда макроса состоит из двух блоков, разделенных точкой:

Объект.Действие с объектом или свойство объекта

Объектами в Excel являются, например:

Примеры действий с объектами:

Примеры свойств объектов:

Обратите внимание: предыдущая строка закончилась символом нижнего подчеркивания _, значит, текст команды не уместился на одну строку и окончание команды перенесено на следующую

Обратите внимание: какой бы длины ни был ваш следующий отчет, для которого вы будете применять этот макрос, выделится всегда только диапазон до 34 строки!

Как сделать этот диапазон любой длины — обсудим немного позже

Для объекта ActiveSheet (Текущий лист) применить следующие параметры свойства PageSetup (Параметры печати):

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

Подведем итоги

Мы с вами научились:

  • записывать макросы через команду Вид Макросы Запись макроса;
  • редактировать автоматически записанный макрос, удалять из него лишние команды;
  • унифицировать код макроса, вводя в него переменные, которые макрос запрашивает у пользователя или рассчитывает самостоятельно,

а также изучили функции InputBox и MsgBox, процедуры While и If, команду Exit Sub.

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

Расширение файлов Excel, которые содержат макросы

Когда вы записываете макрос или вручную записываете код VBA в Excel, вам необходимо сохранить файл с расширением файла с поддержкой макросов (.xlsm).

До Excel 2007 был достаточен один формат файла — .xls. Но с 2007 года .xlsx был представлен как стандартное расширение файла. Файлы, сохраненные как .xlsx, не могут содержать в себе макрос. Поэтому, если у вас есть файл с расширением .xlsx, и вы записываете / записываете макрос и сохраняете его, он будет предупреждать вас о сохранении его в формате с поддержкой макросов и покажет вам следующее диалоговое окно:

Сохранение файла с поддержкой макросов

Что нельзя сделать с помощью макрорекодера?

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

Запуск макроса каждые 10 минут
Как можно сделать , чтобы определенный макрос запускался , каждые 10 минут ?

Автозапуск макроса в Excel
Вот что-то не соображу, как сделать так, что бы при открытии любого файла Excel запускался макрос.

Автозапуск макроса в Access
Здравствуйте! Подскажите пожалуйста, как организовать автозапуск макроса при открытии БД в Access.

Автозапуск VBA макроса
Народ, как сделать так, чтобы мой макрос на VBA автоматически запускался при открытии.


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

Автозапуск макроса на открытии документа
В общем, у пользователей стоит повышенная защита от макросов - как снять програмно ?


Автозапуск макроса при сохранении файла
Доброго всем дня! Есть макрос, который при попытке его сохранить, проверяет, были ли внесены.

excel visual basic автозапуск макроса
Подскажите как автоматически запускать макрос в visual basic для excel. Мне необходимо обновлять.

Автозапуск макроса при печати на принтере
Возможно ли сделать, что бы макрос запускался при попытке распечатать документ в Ворде? Если да, то.

image


Так уж сложилось, что на сегодняшний день много кому приходится работать(писать макросы) на VBA в Excel. Некоторые макросы содержат сотни строк кода, которые приходится выполнять каждый день (неделю, месяц, квартал и так далее) и, при этом, они занимают изрядное количество времени. Вроде бы и и процесс автоматизирован и человеческого вмешательства не нужно, но время, занимаемое выполнением макроса, может охватывать десятки минут, а то и несколько часов. Время, как говориться, — деньги и в этом посте я постараюсь значительно ускорить время выполнения Вашего макроса и, возможно, это положительно скажется на ваших делах, а в итоге и деньгах.

Перед началом работы

Перед тем, как перейти прямо к сути, я хотел бы обратить внимание на пост: Несколько советов по работе с VBA в Excel. В частности, в блоке “Ускорение работы макросов” есть полезные примеры кода, которые стоит использовать вместе с моими советами по ускорению работы, для достижения максимального результата.

Ускоряем работу макроса

Итак, к сути… Для того что бы реально ускорить работу VBA в Ecxel нужно понимать, что обращение к ячейке на листе — занимает значительно время. Если Вы хотите записать в ячейку одно значение, то это не займет значительного времени, но если Вам потребуется записать(прочитать, обратиться) к тысячам ячеек, то это потребует гораздо большего времени. Что же делать в таких случаях? На помощь приходят массивы. Массивы хранятся в памяти, а операции в памяти VBA выполняет в сотни, а то и в тысячи раз быстрее. Поэтому, если у Вас в данных тысячи, сотни тысяч значений, то время выполнения макроса может занимать от нескольких минут до нескольких часов, а если эти данные перенести в массив, то выполнение макроса может сократиться до нескольких секунд (минут).

Я наведу пример кода и в комментариях объясню что к чему, так будет яснее. К тому же, могут пригодиться некоторые строки кода, не относящееся прямо к процессу ускорения.

Пример

Предположим, что у нас есть данные на “Лист1” (“Sheet1”). Данные содержаться в 50 колонках (колонки содержат названия) и 10 000 строк. К примеру, нам нужно в последнюю колонку внести значение, которое равно значению во второй колонке, деленное на значение в третьей колонке (начиная со 2-й строки, так как первая содержит заглавие). Потом мы возьмем первые 10 колонок и скопируем их на “Лист2” (“Sheet2”), для дальнейшей обработки (для других потребностей). Пусть пример и банальный, но, как мне кажется, он может отобразить всю суть данного поста.

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

Заключение

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

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

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

Читайте также: