Создание макросов в разных версиях Excel для автоматизации повторяющихся действий пользователя, которые могут быть простыми или сложными, часто повторяющимися или редко. Для использования макросов на практике обычно их приходится корректировать в редакторе VBA. Чтобы Excel мог запускать макросы, необходимо разрешить их выполнение.
Вкладка «Разработчик»
Запись макроса осуществляется встроенным рекордером, кнопка запуска которого находится на вкладке «Разработчик» главного меню программы Excel. По умолчанию эта вкладка не отображается. Добавить вкладку на панель можно следующим образом:
Excel 2010-2016
Переходим по пути: Файл — Параметры — Настроить ленту. В разделе «Настроить ленту» справа в списке «Основные вкладки» устанавливаем флажок «Разработчик» и нажимаем кнопку «OK».
Excel 2007
Переходим по пути: значок «Microsoft Office» — Параметры Excel — категория «Основные», в категории «Основные» устанавливаем флажок «Показывать вкладку «Разработчик» на ленте» и нажимаем кнопку «OK».
Excel 2000-2003
Здесь ничего отображать не надо: кнопки по работе с макросами и редактором VBA находятся в главном меню на вкладке «Сервис» — «Макрос».
На самом деле в Excel для работы с макросами используются не кнопки, а пункты меню, но, для удобства, продолжу называть их кнопками.
Запись макроса
Excel 2007-2016
На ленте во вкладке «Разработчик» нажмите кнопку «Запись макроса».
Excel 2000-2003
Пройдите по пунктам меню «Сервис» — «Макрос» — «Начать запись».
Откроется окно:
Окно «Запись макроса»
Имя макроса: можно изменить или оставить по умолчанию («Макрос» с очередным номером). Если у вас уже есть макрос с таким именем, он будет записан в новый программный модуль, который будет создан автоматически.
Сочетание клавиш: добавьте букву, если хотите запускать макрос сочетанием клавиш Ctrl+«буква». В какой раскладке вы впишите букву (например, «й» или «q»), в той и будет запускаться макрос. Если буква будет вписана в верхнем регистре («Й» или «Q»), используйте для запускa макроса сочетание клавиш Ctrl+Shift+«буква».
Сохранить в: выберите книгу, в которой должен быть сохранен макрос:
- «Эта книга» — макрос будет записан в книге, из которой рекордер был запущен (нажата кнопка «Запись макроса»).
- «Новая книга» — откроется новая книга и макрос будет записан в ней.
- «Личная книга макросов» — макрос запишется в Личную книгу макросов и будет доступен из всех открытых книг Excel.
Описание: здесь можно добавить краткое описание макроса, которое будет отображаться в окне доступных макросов при выделении его в списке.
Заполнив окно, нажимаем кнопку «OK», кнопка «Запись макроса» меняет свое название на «Остановить запись», и можно приступать, собственно, к записи макроса. Выполните на рабочем листе операции, последовательность которых вы хотите автоматизировать и, после их завершения, нажмите кнопку «Остановить запись». Макрос будет записан и появится в списке макросов.
Список макросов
Окно со списком макросов открывается во всех версиях Excel нажатием кнопки «Макросы». Выглядит оно следующим образом:
Список макросов во всех открытых книгах
- Выполнить — выделенный макрос будет запущен на выполнение.
- Войти — переход к коду макроса, запущенному и поставленному на паузу, как при обнаружении ошибки в коде.
- Изменить — переход к коду макроса для редактирования.
- Создать — кнопка станет активной при записи имени нового макроса в поле «Имя макроса».
- Удалить — удаление выделенного макроса.
- Параметры… — редактирование сочетания клавиш для запуска макроса и его описания.
- Находится в: — здесь можно выбрать все открытые книги или одну из них.
- Описание — текст, добавленный в одноименное поле при создании макроса или редактировании его параметров.
Запуск макроса
Запустить записанный макрос можно следующими способами:
- Сочетанием клавиш, указанным в параметрах макроса.
- Кнопкой «Выполнить» из окна списка макросов.
- Кнопкой «Run Sub» или клавишей «F5» из редактора VBA.
- Кнопкой, добавленной на лист Excel из раздела «Элементы управления формы» и которой назначен запускаемый макрос.
Кроме этого макрос можно назначить изображению, добавить кнопку запуска на панель быстрого доступа и в меню (на ленту).
Пример записи простого макроса
Выполните следующие действия:
Excel 2007-2016
- Откройте книгу Excel или создайте новую и сохраните ее как книгу с поддержкой макросов (.xlsm).
- На вкладке «Разработчик» нажмите кнопку «Запись макроса».
- В окне «Запись макроса» нажмите кнопку «OK», оставив параметры по умолчанию.
- Перейдите на вкладку «Главная» и выберите любой цвет заливки ячеек.
- Нажмите кнопку «Остановить запись».
Excel 2000-2003
- Откройте книгу Excel или создайте новую и сохраните ее с расширением по умолчанию (.xls).
- Включите запись макроса, пройдя по пунктам меню «Сервис» — «Макрос» — «Начать запись».
- В окне «Запись макроса» нажмите кнопку «OK», оставив параметры по умолчанию.
- На панели инструментов выберите любой цвет заливки ячеек.
- Нажмите кнопку «Остановить запись».
В результате будет записан простейший макрос окрашивания фона выделенной ячейки или диапазона.
Откройте список макросов, выберите записанный макрос и нажмите кнопку «Изменить». Вы увидите код вашего макроса:
Sub Макрос1() ‘ ‘ Макрос1 Макрос ‘ ‘ With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 5296274 .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub |
Число (5296274) в вашем примере будет другим, в зависимости от выбранного цвета заливки.
Выберите на активном листе любую ячейку или диапазон, вернитесь в редактор VBA и нажмите клавишу «F5» (курсор должен находиться в любом месте внутри кода запускаемого макроса). На активном листе выделенный диапазон окрасится в выбранный при записи макроса цвет.
Рекордер макросов может записывать много лишних строк, без которых можно обойтись. Точно также макрос будет работать и в такой редакции:
Sub Макрос2() Selection.Interior.Color = 5296274 End Sub |
Скопируйте этот код и вставьте его внизу, под вашим макросом, в редакторе VBA (числовое значение цвета можете изменить на свое или оставить, как в примере). Проверьте его работоспособность, выбрав незакрашенные ячейки и запустив макрос клавишей «F5», не забыв о том, что курсор должен находиться внутри этого макроса.
Имена макросов должны различаться в пределах одного модуля, но еще лучше — всем макросам одной книги давать уникальные имена.
Назначение макроса кнопке
Теперь давайте назначим записанный макрос (любой из двух) кнопке, добавленной на лист Excel из раздела «Элементы управления формы»:
Excel 2007-2016
- На вкладке «Разработчик» нажмите кнопку «Вставить» и в разделе «Элементы управления формы» кликните по изображению кнопки.
- Переведите курсор на табличную область листа, курсор примет вид крестика, и кликните левой кнопкой мыши.
- В открывшемся окне «Назначить макрос объекту» выберите один из новых макросов и нажмите кнопку «OK». Если нажать кнопку «Отмена», новая кнопка будет создана без назначенного макроса. Его можно будет назначить позднее, кликнув по ней правой кнопкой мыши и выбрав в контекстном меню «Назначить макрос…»
Excel 2000-2003
- Отобразите панель инструментов «Формы», пройдя по пунктам меню «Вид» — «Панели инструментов» — «Формы».
- Кликните по Кнопке на панели инструментов «Формы», затем переведите курсор на табличную часть рабочего листа, нажмите левую кнопку мыши и, не отпуская ее, нарисуйте прямоугольник (контур кнопки) нужного размера, затем отпустите кнопку мыши.
- В открывшемся окне «Назначить макрос объекту» выберите один из новых макросов и нажмите кнопку «OK». Если нажать кнопку «Отмена», новая кнопка будет создана без назначенного макроса. Его можно будет назначить позднее, кликнув по ней правой кнопкой мыши и выбрав в контекстном меню «Назначить макрос…»
Кнопка создана. Выберите ячейку или диапазон и нажмите созданную кнопку. Цвет фона изменится.
Вы можете записать еще один такой же макрос, только выбрать на палитре «Нет заливки», создать еще одну кнопку и назначить ей вновь созданный макрос. Теперь, первая кнопка будет окрашивать выделенный диапазон, а вторая очищать его от заливки.
Сокращенный вариант кода по очистке фона будет выглядеть так:
Sub Макрос3() Selection.Interior.Pattern = xlNone End Sub |
Чтобы отредактировать кнопку — изменить надпись, шрифт, размер, переместить и т.д. — используйте контекстное меню и маркеры, появляющиеся после клика по ней правой кнопкой мыши. Если вы хотите, чтобы кнопка не уезжала из зоны видимости при прокрутке листа, закрепите верхнюю строку и разместите кнопку на ней.
Остановка макроса (процедуры)
При тестировании нового макроса (процедуры) может возникнуть бесконечный цикл, который приведет к зависанию Excel. Способы остановки выполнения бесконечного цикла:
- Если панель инструментов редактора VBA доступна, нажмите кнопку Break или Reset.
- Если редактор VBA не доступен, нажмите сочетание клавиш Ctrl+Break.
- Если сочетание клавиш Ctrl+Break не срабатывает, закройте программу Excel через Диспетчер задач.
- Если Диспетчер задач долго не открывается, остается только выключение компьютера большой кнопкой или кнопкой «Перезагрузка».
How to make a macro stop or pause for a specified amount of time.
This allows you to slow down the execution of a macro.
Method 1 — Simple but Not Versatile
Add this line of code anywhere in your macro where you want it to pause.
Application.Wait(Now + TimeValue("00:00:01"))
This will pause the macro for 1 second.
The first set of zeros is hours; the second set is minutes; the third set is seconds.
Method 2 — More Work but Better — Fractions of Seconds
Sometimes you need to pause a macro for a fraction of a second and, for this, we need to do something else.
Put this piece of code at the top of your module:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
It would look like this:
Notice that it was put above the first Sub in the module.
Then, make the macro stop or pause using this method:
This is in milliseconds, so 1000 equals 1 second, 2000 equals 2 seconds and anything less than a thousand is a fraction of a second.
Both Methods in the VBA Editor
Notes
Both methods have their place; use whichever one works best for you.
Download the sample file attached to this tutorial to see these macros in Excel.
Excel VBA Course — From Beginner to Expert
200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides
Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)
View Course
Similar Content on TeachExcel
Minimize or Maximize the Ribbon Menu in Excel
Tutorial:
This is a simple way to get more space in Excel, reduce clutter, and streamline the inte…
Make Users Enable Macros in Order to View a Workbook in Excel
Tutorial: Tutorial showing you how to make a user enable macros in a workbook in order to view the w…
Round Numbers Up or Down in Excel
Tutorial: How to round a number up or down and also to a specified number of decimal places in Excel…
Increment a Value Every X Number of Rows in Excel
Tutorial: (New Easier Version for Excel 2010 and Later)
How to increment a value, number, percent, e…
Delete Blank Rows in Excel
Macro: This is a macro which will delete blank rows in excel. This version will delete an entire …
Generate a Non-Repeating List of Random Numbers in Excel — UDF
Macro: Generate a series of non-repeating random numbers in Excel with this UDF (user defined fun…
Subscribe for Weekly Tutorials
BONUS: subscribe now to download our Top Tutorials Ebook!
Excel VBA Course — From Beginner to Expert
200+ Video Lessons
50+ Hours of Video
200+ Excel Guides
Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)
View Course
Остановка выполнения Excel Macro при нажатии Esc не будет работать
Я запускаю excel 2007 на XP.
Есть ли способ остановить выполнение макроса во время его выполнения, кроме нажатия escape? Обычно, если я думаю, что я создал цикл infinate или иначе что-то испортил, я нажал кнопку escape, и он выдает ошибку, но макрос останавливается.
На этот раз (и я сделал это раньше, но не так плохо), я установил msgbox для быстрой отладки. Оказывается, он должен был зацикливаться около 6000 раз, что означает, что я должен был «ОК» 6000 ящиков сообщений, что заняло несколько минут. Я не сохранил перед запуском (еще одна ошибка), поэтому я не смог открыть диспетчер задач для выхода.
Есть ли другой способ остановить выполнение макроса в случае, если я снова выйду из него?
Используйте CRTL + BREAK , чтобы приостановить выполнение в любой точке. Вы будете переведены в режим разрыва и можете нажать F5 , чтобы продолжить выполнение, или F8 , чтобы выполнить пошаговый код в визуальном отладчике.
Конечно, это работает только при отсутствии открытого окна сообщения, поэтому, если ваш код VBA постоянно открывает окна сообщений, по какой-то причине будет немного сложно нажать клавиши в нужный момент.
Вы даже можете редактировать большую часть кода во время его работы.
Используйте Debug.Print для вывода сообщений в Immediate Window в редакторе VBA, что более удобно, чем MsgBox .
Используйте точки останова или ключевое слово Stop , чтобы автоматически остановить выполнение в интересных областях.
Вы можете использовать Debug.Assert для остановить выполнение условно.
CTRL + SCR LK (Scroll Lock) работал у меня.
Иногда правильный набор ключей ( Pause , Break или ScrLk) недоступен на клавиатуре (чаще всего это происходит с пользователями ноутбуков) и нажатие Esc 2, 3 или несколько раз не останавливается макрос тоже.
Я тоже застрял, и в итоге нашел решение в функции доступности Windows, после чего я попробовал все исследованные варианты, и 3 из них работали для меня в 3 разных сценариях.
Шаг # 01. Если ваша клавиатура не имеет определенного ключа, не волнуйтесь и откройте «OnScreen Keyboard» из Windows Utilities, нажав Win + U .
Шаг # 02. Теперь попробуйте любой из нижеперечисленных параметров, и они определенно будут работать в зависимости от вашей системной архитектуры, то есть версии ОС и Office
- Ctrl + Pause
- Ctrl + ScrLk
- Esc + Esc (дважды нажмите последовательно)
Вы будете переведены в режим разрыва с использованием вышеуказанных комбинаций клавиш, поскольку макрос приостанавливает выполнение, немедленно заканчивая текущую задачу. Напр. если он вытаскивает данные из сети, то он останавливается сразу перед тем, как вызывать любую следующую команду, но после вытаскивания данных, после чего можно нажать F5 или F8 , чтобы продолжить отладку.
Как остановить выполнение макроса в excel
Здравствуйте, i-s-v, Вы писали:
ISV>Как програмно завершить работу макроса? Макрос вызываеться при нажатии на настроенную кнопку. и должен останавливаться при закрытии формы. Какая процедура завершает работу макроса?
ISV>
Такой процедуры нет. Однако можно попытаться выкрутиться. Пример:
1. В VBA-проекте новой книги добавить стандартный модуль
2. В добавленный модуль вставить код:
3. Добавить в проект форму
4. Добавить обработчик события Terminate этой формы:
5. На какую-нибуть панель инструментов добавить 2 кнопки: на кнопку 1 назначить макрос testMacros, на кнопку 2 — testForm
6. Расположить окна MS Excel и проекта VBA так, чтобы они одновременно были видны целиком на экране. В окне VBA сделать видимым окно отладки (например, нажать Ctrl+G)
7. Нажать на кнопку 1 — в окно отлаки VBA начнут сыпаться значения системного времени
8. Нажать на кнопку 2 — на экране должна появиться форма, дерьмо в окно отладки продолжает сыпаться
9. Закрыть форму — поток дерьма иссякнет.
Суть:
1) при выполнении макроса надо вызывать DoEvents, давая таким образом возможность обрабатываться другим событиям, например, щелчкам мышью на кнопках панели инструментов.
2) в ходе выполнения макроса проверять значение глобальной переменной, разрешающей выполнение, если выполнение запрещено — выходить из цикла(процедуры) макроса
3) воздействовать на глобальную переменную из любой удобной точки — применимо к текущему примеру — при закрытии формы
Корявенько, но для некоторых случаев вполне работоспособно.
Остановка макроса из UserForm[vbModeless]
1. Как раз DoEvents ща смотрю, надежд пока мало (событие Click там не любят или спец. скрывают. )
2. Да, эта наша тяжелая артиллерия. :-).
иногда правда бывает, что через API получается даже изящнее, так что будем дерзать, если что найду, обязательно напишу, потому что вещь я думаю нужная всем кто пишет макросы для общего употребления. Да и просто приятно..
Прикольно. Спасибо за совет — DoEvents — заработал.
Я его понаставлял в разные куски макроса, как раз где у меня FormWait.Repaint обновляется (чтобы значение ProgressBar увеличить и текст того чем он щас занимается обновить).
А работает он следующим образом, когда нажимаешь на кнопку «Прервать», то событие до нее дойдет, как только в макросе повстречает DoEvents. (когда промежуток между соседними DoEvents большой, то получается так — на кнопку жмешь. ничего не происходит, кнопка не шевелится, потом через 5-10 сек раз и полезло то, что на кнопке висело..) Весело вообщем.
А для того, чтобы после нажатие кнопки «Прервать» выполнение макроса прекратить, я лучше ничего не нашел, как сделать это так:
Private Sub ButCancel_Click()
Dim Response
Response = MsgBox(«Вы точно хотите прервать работу макроса?», vbQuestion + vbOKOnly + vbOKCancel, «Внимание!»)
If Response = 1 Then
Unload FormWait
MyModule.blnBreak = True
Else
End If
End Sub
А в макросе, после каждого DoEvents сделать проверку, что-нибудт типа такого:
If blnBreak Then Exit Sub
Может что поизящнее есть, чтобы из кода формы прекратить (не остановить, а прекратить) выполнение текущего макроса.
Рад, что получилось средствами Экселя и не пришлось посылать за тяжелой артиллерией. 🙂
Чтобы остановить — попробуй End
Просто я хотел свой код, относящийся к форме, максимально, как это сказать-то . инкапсулировать. Т.е. есть форма (один файл), включил ее в проект, перенес на другой комп, переслал другому человеку, и не надо потом долго объяснять за какие переменные там дергать, за чем следить, че проверять и вызывать.
А делать с этой формой особенного ничего и не надо, показал/скрыл ее, значения на ProgressBar обновил (ну и на подписях).
Для последнего я включил в модуль формы такую функцию:
Public Sub ShowFormWait(progValue As Double, textProc As String, TextFile As String)
Прерывание процедур и функций VBA
Иногда встречаются обстоятельства, при которых нет смысла продолжать выполнение процедуры или функции. VBA имеет операторы Exit и End, которые дают возможность либо завершать процедуру или функцию, либо останавливать всю программу.
Оператор Exit
Для того, чтобы процедура или функция прекратила выполнение, используется одна из двух доступных форм VBA-оператора Exit, в зависимости от того, необходимо ли завершить функцию или процедуру:
Перепишем немного листинг учебной программы, который использовался на позапрошлом уроке:
Здесь содержится код проверки того, была ли выбрана пользователем в окне ввода кнопка «Отмена». Если это так — программа выдает сообщение о том, что не был введен возраст, и прекращает выполнение кода оператором Exit Sub.
Оператор Exit Sub приводит к тому, что VBA немедленно прекращает выполнение кода процедуры. После выполнения этого оператора VBA прекращает выполнение текущей процедуры и возвращается к выполнению той процедуры или функции, которая вызвала процедуру, содержащую оператор Exit Sub.
Оператор End
Для полного завершения выполнения программы используется ключевое слово End в отдельной строке:
При выполнении этого оператора VBA прекращает все выполнение операторов процедуры и функции. Любые имеющиеся переменные перестают существовать и их значения теряются.
Т.к. программа полностью прерывается, необходимо перед оператором End выводить пользователю сообщение о том, что будет происходить и почему. В противном случае пользователи вашей процедуры могут не понять, почему процедура или программа, которую они используют, внезапно прекратила работу. Если программа перестанет выполняться вследствие какого-либо действия пользователя, такого как отмена окна ввода, без объяснения, пользователь процедуры может никогда не узнать, почему процедура заканчивается.
Также не следует забывать закрывать рабочие книги или выполнять другие сервисные работы перед выполнением оператора End, чтобы пользователю программы не приходилось доделывать незаконченные операции.
В начало страницы
В начало страницы
Создание, выполнение, изменение и удаление макроса в Office для Mac
Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).
Чтобы сэкономить время на выполнении часто повторяющихся задач, можно записать соответствующую последовательность действий в виде макроса. Затем, когда вам потребуется выполнить такую задачу, вы сможете вызвать макрос, и он сделает все за вас.
В Word 2016 для Mac можно создать макрос с сочетанием клавиш, запустить макрос и удалить макрос, который больше не нужен.
В меню Вид последовательно выберите пункты Макросы и Записать макрос.
Введите имя макроса или примите имя по умолчанию, предлагаемое Word.
Чтобы использовать этот макрос во всех новых документах, убедитесь в том, что в списке Сохранить макрос в выбран пункт Все документы (Обычный).
Нажмите кнопку Клавиатура, чтобы назначить макросу сочетание клавиш.
В Word откроется диалоговое окно Настройка клавиатуры.
Введите сочетание клавиш в поле Нажмите новое сочетание клавиш.
При нажатии сочетания клавиш в Word отображается команда или действие, назначенные в данный момент этому сочетанию, если таковые имеются.
Если выбранное сочетание клавиш уже назначено, удалите его в поле Нажмите новое сочетание клавиш и выберите другое сочетание.
Найдя свободное сочетание клавиш, переходите к следующему шагу.
Чтобы использовать это сочетание клавиш во всех новых документах, убедитесь в том, что в поле Сохранить изменения в выбран глобальный шаблон Normal.dotm.
Нажмите кнопку Назначить.
Когда вы будете готовы к записи макроса, нажмите кнопку ОК.
Последовательно выберите нужные команды или нажмите нужные клавиши.
Word записывает щелчки мышью и нажатия клавиш, но не выделение текста мышью. Чтобы выделить текст при записи макроса, используйте клавиатуру.
Чтобы остановить запись, в меню Вид последовательно выберите пункты Макросы и Остановить запись.
Запустить макрос можно с помощью назначенного ему сочетания клавиш или из списка Макросы.
В меню Вид последовательно выберите пункты Макросы и Просмотр макросов.
В списке Имя макроса выберите макрос, который хотите запустить.
Нажмите кнопку Запустить.
В меню Вид последовательно выберите пункты Макросы и Просмотр макросов.
Убедитесь в том, что в списке Макросы в указано расположение макроса, который вы хотите удалить.
В списке содержится имя документа, открытого в текущем окне, а также глобальный шаблон и команды Word.
В поле Имя макроса выберите макрос, который нужно удалить, а затем щелкните значок минуса под списком.
Когда в Word появится подтверждение на удаление макроса, нажмите кнопку Да.
В Excel 2016 для Mac можно создать макрос с сочетанием клавиш, запустить макрос и удалить макрос, который больше не нужен.
При записи макроса все необходимые действия записываются средством записи макроса. Такими действиями может быть ввод текста или чисел, выбор ячеек или команд на ленте или в меню, форматирование, выделение ячеек, строк или столбцов, а также выделение ячеек путем перетаскивания указателя мыши.
Примечание: Команды для записи, создания и удаления макросов, а также другие дополнительные функции также доступны на вкладке » разработчик » на ленте. Дополнительные сведения об использовании вкладки «Разработчик» можно найти в разделе Использование вкладки «Разработчик» для создания и удаления макроса в Excel 2016 для Mac.
Выберите Сервис _гт_ макрос _гт_ запись New.
В поле Имя макроса укажите имя макроса.
Чтобы создать сочетание клавиш для макроса, введите букву в поле Option + cmd .
Выберите расположение макроса в раскрывающемся списке.
Экономисты в повседневной работе сталкиваются с рутинной работой: с определенной периодичностью им приходится выполнять одну и ту же последовательность действий для получения определенного отчета, например. Частично автоматизировать такую работу можно с помощью макросов. Причем для написания несложных команд достаточно знать только азы программирования.
Как записать самый простой макрос?
Для начала запишем самый легкий макрос — зададим в ячейке А1 формат вида 12 345:
- Открываем новую книгу, в ячейке А1 набираем шестизначное число 123456. Сейчас оно выдается без разделителей разрядов. Запишем макрос, который ставит эти разделители.
- Заходим на панели инструментов в закладку Вид*, находим кнопку Макросы, жмем Запись макроса. В появившемся окне задаем имя макроса и книгу, в которой хотим этот макрос сохранить.
Важно
Запустить макросы можно только из открытых книг, поэтому если вы планируете использовать записанные вами макросы довольно часто, стоит использовать специальную книгу макросов, которая автоматически открывается вместе с запуском сеанса Excel.
Если вы все-таки хотите хранить макросы в отдельном файле, эту книгу нужно сохранить, выбрав тип файла Книга Excel с поддержкой макросов. В противном случае после закрытия книги макросы будут стерты.
- Выбираем Сохранить в… — Личная книга макросов и нажимаем Ок (рис. 1).
Рис. 1. Запись макроса в личную книгу макросов
- Записываем в макрос действия, которые хотим выполнить: вызываем контекстное меню Формат ячеек (можно воспользоваться комбинацией клавиш Сtrl+1) и задаем нужный нам формат числа: на закладке Число идем в блок (все форматы) и выбираем там формат вида # ##0.
К сведению
Этот формат можно задать и в блоке Числовой, но чуть позже вам станет ясно, почему мы воспользовались блоком Все форматы.
- На закладке Вид — Макросы выбираем пункт Остановить запись.
Второй, более быстрый способ остановить запись макроса — нажать на появившийся в левом нижнем углу синий квадратик (рис. 2.).
Мы рекомендуем
Всегда обращайте внимание на этот квадратик: если он появился на панели, значит, сейчас идет запись всех ваших действий в макрос. Не забывайте вовремя останавливать запись макроса, чтобы потом его не пришлось переделывать.
Проверяем, что макрос записан и работоспособен:
- в ячейку А2 вбиваем любое шестизначное число;
- запускаем макрос одним из двух способов: на закладке Вид — Макросы выбираем пункт Макросы или нажимаем комбинацию клавиш Alt+F8, находим в списке наш макрос и нажимаем кнопку Выполнить.
Рис. 2. Форматирование числа и остановка записи макроса
Итак, вы записали свой первый макрос! Примите поздравления. Теперь давайте познакомимся с личной книгой макросов и синтаксисом написания команд для макроса.
Личная книга макросов
По умолчанию Excel не отображает личную книгу макросов. Чтобы убедиться, что она открыта, выбираем на вкладке Вид кнопку Отобразить — в появившемся окне должна быть книга под именем PERSONAL.
Мы убедились, что книга открыта, но отображать ее не будем, чтобы потом по ошибке не закрыть ее. По сути, в этой книге нас интересует так называемый Исходный текст — блок, в котором записываются макросы. Чтобы увидеть это окно, нажмите клавиши Alt+F11 или кликните правой кнопкой мыши на ярлыке любого листа Excel и выберите в контекстном меню Исходный текст. Откроется окно VBA-кодирования в Excel (рис. 3). Оно состоит из двух блоков:
1. В левой части экрана окно Project – VBAProject — это проводник, в котором отображаются все открытые в данный момент книги Excel (даже если вы их не видите, как, например, книгу Personal). Работа с этим блоком аналогична работе в обычном проводнике — двойной клик по наименованию книги раскрывает ее содержимое. Нас интересует блок Modules — Module1. Кликаем левой кнопкой мыши дважды по этому объекту.
2. В правой части экрана откроется блок записи и редактирования макросов. Здесь уже автоматически записался Макрос1. Рассмотрим на его примере основную канву макроса.
Рис. 3. Окно VBA-кодирования в Excel
Синтаксис макроса
Макросы — это команды, написанные на языке VBA (Visual Basic for Applications). И синтаксис кода макроса не отличается от записи кода в Visual Basic.
Любой макрос имеет следующий вид:
Sub Имя_Макроса_Без_Пробелов()
‘ комментарии к макросу — они нужны для вас, VBA не воспринимает такие строки как команды
команды, написанные на языке VBA
End Sub
3 обязательных блока макроса:
1. Начало макроса. Всегда начинается с команды Sub. Далее идет имя макроса — оно может быть на русском языке, но не должно содержать пробелы и специальные символы.
В конце имени макроса всегда ставятся скобки () — они нужны, когда вы создаете свою функцию, в них указываются аргументы функции, но об этом сейчас речь не пойдет.
2. Блок команд. В нашем примере он состоит из одной строки: Selection.NumberFormat = «#,##0»
Каждая команда должна начинаться с новой строки. Если текст команды очень длинный и не помещается на экране, его можно разбить на несколько строк, заканчивая строку символом нижнего подчеркивания _ (далее в примере мы это увидим).
3. Конец макроса. Всегда обозначается как End Sub.
Есть и один необязательный блок — это комментарии, которые вы можете оставлять в любом месте внутри кода макроса, поставив перед началом комментариев знак апострофа ‘. Например, вы можете описать, что именно делает тот или иной макрос.
Обратите внимание!
Если вы хотите разместить комментарии в несколько строк, каждую новую строку надо начинать с апострофа.
Теперь запишем более сложный макрос и научимся понимать текст его кода.
Например, информационная система выдает отчет «Бюджет на месяц» без выделения групповых значений цветом или шрифтом.
Нам необходимо:
- выделить групповые строки полужирным шрифтом;
- отформатировать на печать — расположить отчет по центру листа, задать масштаб 75 %, вывести в колонтитулы название отчета (рис. 4).
Рис. 4. Изменения после написания макроса
Запишем алгоритм форматирования отчета в макрос.
Нажимаем кнопку записи макроса и выполняем следующие действия:
- Даем макросу имя Форматирование_БДР, в блоке описания записываем, что будет делать этот макрос (например, Выделяет жирным курсивом итоги, форматирует на печать). Жмем Ок.
- Выделяем столбцы А:С, ставим автофильтр — на закладке Данные находим кнопку Фильтр.
- По столбцу КОД задаем условие не содержит точку: Текстовые фильтры — Не содержит и в поле текста ставим символ точки без пробелов (рис. 5).
Рис. 5. Использование автофильтра по столбцу «КОД»
- Выделяем отфильтрованный диапазон и задаем ему полужирный шрифт.
- Снимаем автофильтр (повторное нажатие на закладке Данные кнопки Фильтр).
- Заходим в меню форматирования на печать (Кнопка Файл/Office — Печать — Предварительный просмотр — Параметры страницы) и задаем там три параметра:
1) на вкладке Страница задаем масштаб 75 %;
2) на вкладке Поля отмечаем пункт Горизонтально в блоке Центрировать на странице;
3) на вкладке Колонтитулы создаем верхний колонтитул с текстом Бюджет на январь.
- Выходим из параметров страницы.
- Заканчиваем запись макроса.
- Нажимаем Alt+F11 и смотрим, что получилось (см. рис. 4).
Код этого макроса уже гораздо длиннее и непонятнее, но легко читаем для знающих английский язык и азы программирования в VBA.
Правила написания команд в VBA
Любая команда макроса состоит из двух блоков, разделенных точкой:
Объект.Действие с объектом или свойство объекта
Объектами в Excel являются, например:
- книга: WorkBook, ActiveWorkbook;
- лист, листы: WorkSheet, ActiveSheet, Sheets;
- ячейка: Cells(1,1) — в скобках указываются номера строки (Row) и столбца (Column) ячейки на листе;
- диапазон ячеек (может быть и одна ячейка): Range(«А1:С5»), Range(«А1»);
- строки (Rows);
- столбцы (Columns);
- выделение (Selection) — выделенный в данный момент диапазон (это может быть как несколько смежных ячеек, так и смежные строки или столбцы).
Примеры действий с объектами:
- ActiveWorkbook.Save — сохранить рабочую книгу (та, которая была активна в момент вызова пользователем макроса);
- Sheets(«Лист3»).Name = «Отчет» — переименовать «Лист3» в «Отчет»;
- Sheets(«Отчет»).Activate — перейти на лист с названием «Отчет»;
- Range(«А1»).Copy — скопировать в буфер обмена данные из ячейки А1;
- Rows(«13:13»).Delete Shift:=xlUp — удалить строку 13 со сдвигом вверх.
Примеры свойств объектов:
- ActiveCell.FormulaR1C1 = «БДР» — в выделенной (активной) ячейке записан текст «БДР»;
- ActiveCell.Row < 65 — номер ряда активной ячейки меньше 65.
Помнить все названия объектов, команд и свойств для написания несложных макросов не обязательно. Вы всегда можете сначала записать ваши стандартные действия с отчетами в Excel, а потом отформатировать код макроса, убрав из него лишние действия или заменив некоторые заданные параметры (например, длину диапазона) на переменные (которые в дальнейшем макрос будет запрашивать у пользователя или рассчитывать самостоятельно).
Но об этом мы расскажем далее, а сейчас обратимся к коду нашего первого макроса, состоящего из одной строки:
Selection.NumberFormat = «#,##0»
Суть его в следующем: к объекту Выделенный диапазон (у нас одна ячейка, но это может быть и весь столбец/строка или диапазон смежных ячеек) применяется свойство Числовой формат вида # ##0 (если помните, именно этот формат мы выбрали в списке).
Код макроса Форматирование_БДР и расшифровка строк кода представлены в таблице.
Строка кода |
Расшифровка |
Sub Форматирование_БДР() |
Начало макроса, имя макроса |
‘ |
Пустая строка комментариев (ставится автоматически при записи макроса) |
‘ Форматирование_БДР Макрос |
Автоматически добавленный комментарий при записи макроса — может быть удален без потери работоспособности макроса |
‘ Выделяем жирным курсивом итоги, форматируем на печать |
Автоматически добавленный комментарий при записи макроса из поля Описание |
Пустая строка — не влияет на суть исполнения макроса, но их полезно добавлять для разделения блоков команд внутри кода |
|
Columns(«A:C»).Select |
Выделить (Select) объект Столбцы (Columns) А:С |
Selection.AutoFilter |
Применить автофильтр (AutoFilter) для выделенного диапазона (Selection) |
ActiveSheet.Range(«$A$1:$C$34″).AutoFilter Field:=1, Criteria1:=»<>*.*», _ |
Задать критерий отбора «не содержит точку» |
Operator:=xlAnd |
Продолжение команды из предыдущей строки. Обратите внимание: предыдущая строка закончилась символом нижнего подчеркивания _, значит, текст команды не уместился на одну строку и окончание команды перенесено на следующую |
Range(«A1:C34»).Select |
Выделить (Select) объект Диапазон (Range) А1:С34. Обратите внимание: какой бы длины ни был ваш следующий отчет, для которого вы будете применять этот макрос, выделится всегда только диапазон до 34 строки! Как сделать этот диапазон любой длины — обсудим немного позже |
Selection.Font.Bold = True |
Для выделенного диапазона (Объект Selection) установить свойство «полужирный шрифт» (Font.Bold = True). Если нужно отменить какое-то свойство, пишем False |
Selection.AutoFilter |
Снять автофильтр (при записи макроса это было повторное нажатие кнопки Фильтр на закладке Данные) |
With ActiveSheet.PageSetup |
Начало процедуры With (используется, если далее перечисляются свойства или действия с одним и тем же объектом для компактности записи кода). Для объекта ActiveSheet (Текущий лист) применить следующие параметры свойства PageSetup (Параметры печати): |
.PrintTitleRows = «» |
Печатать на каждой странице сквозные строки — пусто (то есть данное свойство не задано пользователем) |
.PrintTitleColumns = «» |
Печатать на каждой странице сквозные столбцы — пусто |
End With |
Окончание процедуры With |
ActiveSheet.PageSetup.PrintArea = «» |
Заданная область печати — пусто (то есть пользователь не ограничил область печати, следовательно, на экран будет выведено все, что есть на листе) |
With ActiveSheet.PageSetup |
Начало процедуры With Для объекта Текущий лист применить следующие параметры печати (цветом выделены те, которые мы изменили по сравнению со стандартными): |
.LeftHeader = «» |
Левый верхний колонтитул — пусто |
.CenterHeader = «Бюджет на январь» |
Центральный верхний колонтитул — задан текст пользователем |
.RightHeader = «» |
Правый верхний колонтитул — пусто |
.LeftFooter = «» |
Левый нижний колонтитул — пусто |
.CenterFooter = «» |
Центральный нижний колонтитул — пусто |
.RightFooter = «» |
Правый нижний колонтитул — пусто |
.LeftMargin = Application.InchesToPoints(0.708661417322835) |
Размеры левого поля |
.RightMargin = Application.InchesToPoints(0.708661417322835) |
Размеры правого поля |
.TopMargin = Application.InchesToPoints(0.748031496062992) |
Размеры верхнего поля |
.BottomMargin = Application.InchesToPoints(0.748031496062992) |
Размеры нижнего поля |
.HeaderMargin = Application.InchesToPoints(0.31496062992126) |
Размеры верхнего колонтитула |
.FooterMargin = Application.InchesToPoints(0.31496062992126) |
Размеры нижнего колонтитула |
.PrintHeadings = False |
Не печатать заголовки строк и столбцов (False — пользователь не отметил этот пункт) |
.PrintGridlines = False |
Не печатать сетку |
.PrintComments = xlPrintNoComments |
Не печатать примечания |
.PrintQuality = 600 |
Качество печати — 600 точек на дюйм |
.CenterHorizontally = True |
Центрировать на странице горизонтально (True — пользователь отметил этот пункт) |
.CenterVertically = False |
Не центрировать по вертикали |
.Orientation = xlPortrait |
Ориентация страницы — книжная |
.Draft = False |
Пользователь не отметил пункт Черновая в блоке Печать |
.PaperSize = xlPaperA4 |
Размер бумаги А4 |
.FirstPageNumber = xlAutomatic |
Номер первой страницы — автоматически |
.Order = xlDownThenOver |
Последовательность вывода страниц: вниз, потом вправо (пункт в блоке Печать) |
.BlackAndWhite = False |
Пользователь не отметил пункт Черно-белая в блоке Печать |
.Zoom = 75 |
Масштаб 75 % |
.PrintErrors = xlPrintErrorsDisplayed |
Пункт в блоке Печать – Ошибки ячеек — Как на экране |
.OddAndEvenPagesHeaderFooter = False |
Пользователь не задавал разные колонтитулы для четных и нечетных страниц (флажок в блоке Колонтитулы) |
.DifferentFirstPageHeaderFooter = False |
Пользователь не задавал отдельный колонтитул для первой страницы (флажок в блоке Колонтитулы) |
.ScaleWithDocHeaderFooter = True |
Флажок в блоке Колонтитулы – Изменять вместе с масштабом страницы отмечен пользователем |
.AlignMarginsHeaderFooter = True |
Флажок в блоке Колонтитулы – Выровнять относительно полей страницы отмечен пользователем |
.EvenPage.LeftHeader.Text = «» |
Текст колонтитулов для четных и первой страниц не задан |
.EvenPage.CenterHeader.Text = «» |
|
.EvenPage.RightHeader.Text = «» |
|
.EvenPage.LeftFooter.Text = «» |
|
.EvenPage.CenterFooter.Text = «» |
|
.EvenPage.RightFooter.Text = «» |
|
.FirstPage.LeftHeader.Text = «» |
|
.FirstPage.CenterHeader.Text = «» |
|
.FirstPage.RightHeader.Text = «» |
|
.FirstPage.LeftFooter.Text = «» |
|
.FirstPage.CenterFooter.Text = «» |
|
.FirstPage.RightFooter.Text = «» |
|
End With |
Окончание процедуры With |
End Sub |
Окончание кода макроса |
Редактирование макроса
Как видите, код макроса легко читаем и понятен. Кроме того, нам не надо нагромождать его лишними строками: так как в параметрах печати мы меняли только три пункта, остальные строки можем удалить (они будут установлены по умолчанию). Удалим ненужные строки, поставим комментарии и в итоге получим вот такой элегантный код:
Sub Форматирование_БДР()
‘ Макрос выделяет жирным курсивом итоги, форматирует отчет на печать
‘——————
‘ Выделяем столбцы и ставим фильтр по столбцу КОД
Columns(«A:C»).Select
Selection.AutoFilter
ActiveSheet.Range(«$A$1:$C$34″).AutoFilter Field:=1, Criteria1:=»<>*.*», _
Operator:=xlAnd
‘ Выделяем отфильтрованный диапазон полужирным шрифтом, снимаем фильтр
Range(«A1:C34»).Select
Selection.Font.Bold = True
Selection.AutoFilter
‘ Форматируем на печать: верхний колонтитул, центрирование по горизонтали, масштаб 75 %
With ActiveSheet.PageSetup
.CenterHeader = «Бюджет на январь»
.CenterHorizontally = True
.Zoom = 75
End With
End Sub
Ввод в код макроса функций и процедур
Теперь усложним код макроса, задав ему два параметра:
1. Название месяца отчета запрашиваем у пользователя.
2. Последняя строка отчета БДР (в случае если она плавающая) рассчитывается в коде макроса.
Функция InputBox
Чтобы запросить у пользователя месяц отчета, воспользуемся функцией Inputbox, которая выводит диалоговое окно, в котором пользователь может самостоятельно задать значение переменной, используемой в коде. Синтаксис функции InputBox:
Zapros = InputBox(«Текст запроса», <«Текст в шапке окна»>, <Значение по умолчанию>,…)
где Zapros — введенная вами переменная (имя придумываете вы сами), а в скобках через запятую перечисляются аргументы функции.
Обратите внимание: первый аргумент является обязательным, то есть любое диалоговое окно должно сопровождаться пояснительным текстом, чего вы ждете от пользователя. Следующие аргументы обязательными не являются и их можно не указывать. То есть если вы хотите задать значение по умолчанию, но не хотите писать текст в шапке диалогового окна, разделите первый и третий аргументы двумя запятыми, как это будет сделано в нашем примере (см. далее).
Для удобства присвойте полученное значение функции InputBox какой-нибудь введенной вами переменной, особенно если в коде макроса вы будете несколько раз использовать значение этой функции.
Важно
Имена вводимых переменных не должны совпадать с уже занятыми VBA словами под название объектов, свойств или функций!
В нашем примере присвоим результат вызова функции InputBox переменной Mes.
Например, нельзя завести свою переменную Range, Cells или Month — компилятор VBA предупредит вас, что делать этого нельзя, и не запустит макрос, пока вы не устраните ошибку (рис. 6).
Рис. 6. Пример ошибки при заведении переменной
Не забывайте любой текст в коде брать в кавычки! В противном случае компилятор VBA будет воспринимать этот текст как команды и выдавать ошибку, так как не сможет их обработать.
Итак, приступим к редактированию кода макроса. Добавим в самое начало кода макроса строки:
‘ Запрашиваем у пользователя месяц отчета
Mes = InputBox(«Введите название месяца отчета», , «Январь»)
Теперь при запуске макроса будет выводиться диалоговое окно, в котором пользователь самостоятельно сможет указать, за какой месяц этот отчет (рис. 7).
Рис. 7. Диалоговое окно для указания месяца
С помощью функции InputBox можно запросить у пользователя и длину отчета. Но мы научим Excel высчитывать ее самостоятельно. Для этого нам потребуется процедура While.
Процедура While
Используется в коде, если надо сделать одинаковые действия несколько раз подряд до тех пор, пока выполняется какое-либо условие. Синтаксис процедуры While:
Do While <условие, которое должно быть верным для выполнения процедуры>
<список команд>
Loop
Условие может состоять из одного выражения или содержать несколько, перечисленных через оператор AND (то есть оба условия должны быть выполнены) или OR (достаточно выполнения только одного из перечисленных условий). Также условие обязательно должно содержать переменную-счетчик (это может быть номер строки или столбца ячейки, значения которой вы проверяете).
В список команд обязательно должна входить команда наращивания переменной-счетчика, иначе процедура зациклится (так как она постоянно будет сравнивать одно и то же значение) и макрос придется прерывать принудительно.
Если макрос ушел в цикл, прервите его с помощью комбинации клавиш Ctrl+Break и либо прекратите макрос (кнопка End), либо зайдите в код макроса и исправьте ошибку (кнопка Debug). Чтобы макрос не уходил в цикл, рекомендуется включить в блок условий «защиту от дурака». Например, добавляем в условие проверку, чтобы значение счетчика не превышало определенной, заведомо достаточной для нас величины.
Рассмотрим применение процедуры While для поиска конца отчета БДР.
Как видно на рис. 4, последняя строка отчета имеет код «500». Напишем процедуру, которая будет проверять значения в ячейках столбца «А» и остановит свои действия, когда найдет ячейку с кодом «500».
Обратите внимание!
Excel иногда воспринимает числа как текст, поэтому включим два условия проверки значения ячейки и добавим «защиту от дурака» на случай, если в форме отчета случайно затрется код последней строки.
Помним, что все текстовые значения надо брать в кавычки. Числа записываем без кавычек:
‘ Ищем последнюю строку отчета
Dim Row_End As Integer ‘ Вводим переменную «счетчик номера строки»
Row_End = 1 ‘ Присваиваем ей номер 1
‘ Начинаем процедуру поиска последней строки отчета по коду «500»
Do While Cells(Row_End, 1).Value <> «500» And Cells(Row_End, 1).Value <> 500 And Row_End < 100
‘ До тех пор, пока код не равен 500 и номер строки меньше 100, выполняем наращивание счетчика
Row_End = Row_End +1
Loop
Таким образом, процедура While нам нужна только для наращивания счетчика — никаких дополнительных действий она не производит. Запомните этот прием — он часто нужен в кодировании.
Теперь заменим в изначальном коде макроса номер последней ячейки (34) на переменную Row_End. Число 34 было частью текста А1:С34, а теперь нам надо часть текста заменить на переменную. Делается это с помощью символа амперсанд &:
«текст» & переменная & «текст».
В нашем случае ссылка на диапазон А1:С34 будет записана так: А1:С & Row_End.
Кроме того, вспоминаем, что и название отчета Бюджет на январь у нас тоже теперь содержит параметр и будет записываться так: Бюджет на & Mes.
Не забывайте оставлять пробелы в кавычках перед переменной-словом, иначе текст сольется.
Еще раз взглянем на получившийся код макроса:
Sub Форматирование_БДР()
‘ Макрос выделяет жирным курсивом итоги, форматирует отчет на печать
‘ ——————
‘ Запрашиваем у пользователя месяц отчета
Mes = InputBox(«Введите название месяца отчета», , «Январь»)
‘ Ищем последнюю строку отчета
Dim Row_End As Integer ‘ Вводим переменную «счетчик номера строки»
Row_End = 1 ‘ Присваиваем ей номер 1
‘ Начинаем процедуру поиска последней строки отчета по коду «500»
‘ Критичным значением для «защиты от дурака» принимаем номер строки 100
Do While Cells(Row_End, 1).Value <> «500» And Cells(Row_End, 1).Value <> 500 And Row_End < 100
‘ До тех пор, пока код не равен 500 и номер строки меньше 100, выполняем наращивание счетчика
Row_End = Row_End +1
Loop
‘ Выделяем столбцы и ставим фильтр на КОД
Columns(«A:C»).Select
Selection.AutoFilter
ActiveSheet.Range(«$A$1:$C$» & Row_End).AutoFilter Field:=1, Criteria1:=»<>*.*», _
Operator:=xlAnd
‘ Выделяем отфильтрованный диапазон полужирным шрифтом, снимаем фильтр
Range(«A1:C» & Row_End).Select
Selection.Font.Bold = True
Selection.AutoFilter
‘ Форматируем на печать: верхний колонтитул, центрирование по горизонтали, масштаб 75 %
With ActiveSheet.PageSetup
.CenterHeader = «Бюджет на » & Mes
.CenterHorizontally = True
.Zoom = 75
End With
End Sub
Теперь макрос стал более универсальным. Добавим в него еще одну «защиту от дурака».
Если нам принципиально, правильно ли макрос нашел последнюю строку отчета, после окончания процедуры While (строка Loop) можно добавить блок проверки значения Row_End и запроса у пользователя подтверждения на продолжение макроса.
Для этого изучим функцию MsgBox, процедуру IF и команду Exit Sub.
Функция MsgBox
MsgBox — еще один способ общения с пользователем: сообщения ему какой-то информации по ходу выполнения макроса или запрос у него подтверждения по дальнейшим действиям макроса путем нажатия на кнопки вида Yes, No, Ок, Cancel.
Она имеет два вида записи:
1. Мы просто сообщаем пользователю какую-то информацию. В этом случае аргументы функции перечисляются сразу же за функцией, без использования скобок:
MsgBox «Текст сообщения», <Вид кнопок>, <«Текст в шапке окна»>,…
На экране отобразится диалоговое окно, и после нажатия пользователем кнопки Ок продолжится выполнение макроса (рис. 8).
Рис. 8. Первый вид записи функции MsgBox
Как и в случае с функцией InputBox, обязательным здесь является только первый аргумент — Текст сообщения. Остальные можно даже не указывать, сократив вид записи функции до вида:
2. Нам важно, что ответил пользователь, мы записываем его ответ в значение какой-то переменной (рис. 9). В этом случае аргументы функции заключаются в скобки, а перед функцией обязательно должна стоять переменная, в которую мы записываем, на какую кнопку нажал пользователь:
YesNo = MsgBox(«Текст сообщения», <Вид кнопок>, <«Текст в шапке окна»>,…)
Рис. 9. Второй вид записи функции MsgBox
Варианты вида кнопок:
- vbOKOnly — только кнопка ОК;
- vbOKCanсel — кнопки ОК и Cancel;
- vbYesNo — кнопки Yes и No;
- vbYesNoCancel — кнопки Yes, No и Cancel.
Соответственно в зависимости от нажатой кнопки значения функции MsgBox могут быть vbOK, vbCancel, vbYes или vbNo.
Процедура If
С помощью данной процедуры можно разбить команды кода на две ветки в зависимости от выполнения заданного условия. Синтаксис процедуры If:
If <условие, которое должно быть верным> Then
<список команд при выполнении указанного условия>
else
<список команд при невыполнении указанного условия>
End If
Обязательным к заполнению является только условие. Список команд в обоих блоках заполнять не обязательно. В зависимости от ваших задач вы можете заполнить оба блока или только один из них. Условие может состоять из одного выражения или содержать несколько выражений, перечисленных через оператор AND (то есть оба условия должны быть выполнены) или оператор OR (достаточно выполнения только одного из перечисленных условий).
Команда Exit Sub
Прекращает выполнение макроса. Обычно ее используют в ветках процедуры If при проверке допустимости дальнейшего исполнения макроса. Обратите внимание: ни одно действие после команды Exit Sub выполнено не будет. Поэтому если вы хотите сообщить пользователю о принудительном прекращении процедуры, команду MsgBox нужно расположить выше команды Exit Sub.
Итак, объединим новые знания в код «защиты от дурака» и запишем его после строки Loop:
‘ Проверяем, дошла ли процедура While до «критичной» строки 100
‘ и спрашиваем подтверждение о продолжении выполнения макроса
If Row_End = 100 Then
YesNo = MsgBox(«Поиск последней строки отчета дошел до 100, продолжаем?», vbYesNo)
If YesNo = vbNo Then ‘ Если нажата кнопка «No», то…
MsgBox «Процедура прервана пользователем» ‘ 1. выдаем сообщение для пользователя,
Exit Sub ‘ 2. останавливаем макрос
End If
End If
В нашем коде прошло вложение одной процедуры If в другую:
- сначала мы проверили, дошел ли счетчик Row_End до значения 100;
- если дошел, мы спрашиваем у пользователя, продолжать ли нам выполнение макроса;
- если пользователь ответил «нет», останавливаем макрос.
В обеих процедурах If мы опустили второй блок (else): если Row_End не достиг значения 100 или пользователь ответил «да», макрос просто покинет процедуру If и продолжит выполнять команды, написанные ниже.
Каждая процедура If должна заканчиваться командой End If. Если количество строк с командой If не будет соответствовать количеству строк с командой End If, компилятор VBA сообщит об ошибке и вам придется искать, где вы потеряли конец процедуры If.
Поэтому рекомендуется сразу писать обе строки, а потом уже наполнять процедуру командами.
Также для удобства визуального восприятия кода макроса рекомендуется каждую вложенную процедуру начинать с отступа, чтобы визуально было понятно, где заканчивается вложенная процедура и продолжается список команд процедуры верхнего уровня.
Подведем итоги
Мы с вами научились:
- записывать макросы через команду Вид Макросы Запись макроса;
- редактировать автоматически записанный макрос, удалять из него лишние команды;
- унифицировать код макроса, вводя в него переменные, которые макрос запрашивает у пользователя или рассчитывает самостоятельно,
а также изучили функции InputBox и MsgBox, процедуры While и If, команду Exit Sub.
В следующем номере рассмотрим процедуру FOR, запишем макрос суммирования результирующих статей БДР, научимся тестировать макросы и выносить кнопки вызова макроса на панель быстрого доступа.
Статья опубликована в журнале «Справочник экономиста» № 4, 2016.
Здравствуйте. Есть макрос, он делает вычисления и записывает их на лист в таблицу, есть необходимость периодически останавливать макрос, смотреть результаты работы и снова запускать его с той же точки , где он остановился . Можно ли это сделать? Кнопка Esc останавливает макрос, но запустить снова макрос в работу можно только с самого начала , а не с той точки где он остановился. |
|
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
1. Расставьте в нужных местах строчки с текстом «Stop» |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
|
Команда stop не подходит, так как просто останавливает макрос в отладчике до нажатия F5 или F8. А если в цикле десятки тысяч вычислений, а циклов не 2 а много больше, тогда нажимать каждый раз будет тяжело. Поэтому надо по нажатию кнопки (наверно существуют процедуры типа Application.EnableCancelKey = xlInterrupt) приостановить выполнение процесса, а другой кнопкой или такой же, продолжить. Нежелательно появление окошка с вопросами о продолжении и пр., так как надо смотреть на нескольких листах как идет процесс, в ту ли сторону, а это невозможно сделать пока окошки с вопросами не закрыты. |
|
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Может какую паузу тогда задать — приостановить действие макроса? Но нужно знать тайм-аут. |
Время тайм-аута нельзя установить. принятие решение о продолжении или прекращении процесса, не всегда можно формализовать, тем более в замкнутых временных рамках. |
|
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Может в сторону DoEvents глянуть? |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
{quote}{login=Vik63}{date=25.04.2011 12:43}{thema=Как остановить макрос,посмотреть результат и запустить его с того же места?}{post}Нежелательно появление окошка с вопросами о продолжении и пр., так как надо смотреть на нескольких листах как идет процесс, в ту ли сторону, а это невозможно сделать пока окошки с вопросами не закрыты.{/post}{/quote} |
{quote}{login=Vik63}{date=25.04.2011 12:43}{thema=Как остановить макрос,посмотреть результат и запустить его с того же места?}{post}Команда stop не подходит, так как просто останавливает макрос в отладчике до нажатия F5 или F8. А если в цикле десятки тысяч вычислений, а циклов не 2 а много больше, тогда нажимать каждый раз будет тяжело. Поэтому надо по нажатию кнопки (наверно существуют процедуры типа Application.EnableCancelKey = xlInterrupt) приостановить выполнение процесса, а другой кнопкой или такой же, продолжить. Нежелательно появление окошка с вопросами о продолжении и пр., так как надо смотреть на нескольких листах как идет процесс, в ту ли сторону, а это невозможно сделать пока окошки с вопросами не закрыты. |
|
k61 Пользователь Сообщений: 2441 |
В порядке недоумения: по F9 можно спокойно смотреть все листы и значения всех переменных (наводя на них указатель мыши). Кроме этого установив точку остановки на вымышленной переменной (например a100=100) внутрь структуры управления можно уверенно ожидать паузы при равенстве переменной интересующему нас значению: |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
У меня по Esc происходит останов, с возможностью продолжения. Я сам — дурнее всякого примера! … |
{quote}{login=k61}{date=25.04.2011 02:48}{thema=Re: Как остановить макрос,посмотреть результат и запустить его с того же места?}{post}В порядке недоумения: по F9 можно спокойно смотреть все листы и значения всех переменных (наводя на них указатель мыши). Кроме этого установив точку остановки на вымышленной переменной (например a100=100) внутрь структуры управления можно уверенно ожидать паузы при равенстве переменной интересующему нас значению: |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
А зачем рядовому пользователю EXCEL лазить по тексту модуля? Нужны шаловливые ручки? Мало проблем? Я сам — дурнее всякого примера! … |
{quote}{login=KukLP}{date=25.04.2011 06:45}{thema=}{post}У меня по Esc происходит останов, с возможностью продолжения.{/post}{/quote}А в таком случае какая кнопка продолжает вычисления ? И с того ли же места? |
|
{quote}{login=NullUzer}{date=25.04.2011 09:08}{thema=Re: Как остановить макрос,посмотреть результат и запустить его с того же места?}{post}F8{/post}{/quote}У меня на F8 не реагирует.Эксель 2007 года. |
|
k61 Пользователь Сообщений: 2441 |
пошагово F8 |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Vik63, а моя идея с Application.InputBox не подходит? Можно посмотреть листы, а потом нажать кнопочку. Расставили по нужным местам вызов — вот Вам и остановы. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=Vik63}{date=25.04.2011 10:57}{thema=Re: }{post}{quote}{login=KukLP}{date=25.04.2011 06:45}{thema=}{post}У меня по Esc происходит останов, с возможностью продолжения.{/post}{/quote}А в таком случае какая кнопка продолжает вычисления ? И с того ли же места?{/post}{/quote}См. картинку. С того же. Я сам — дурнее всякого примера! … |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Не, Серж, автор не хочет пускать пользователя в редактор — всё только на листе. Если я правильно понимаю |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Юр, я по этому поводу писал от 25.04.2011, 09:24. И до сих пор не пойму, зачем это надо. Отработал макрос — смотри результат. Мож, на самом деле, ему подбор параметра нужен, а не эта галиматья с остановами? Я сам — дурнее всякого примера! … |
слэн Пользователь Сообщений: 5192 |
значит вывешивать немодальную форму.. и цикл с doevents |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
doevents предлагалось — не глянулось что-то |
слэн Пользователь Сообщений: 5192 |
мне вот тоже не глянулось реклама должна быть БОЛЬШОЙ, глаза мозолить |
Hugo Пользователь Сообщений: 23253 |
doevents и проверять переключатель/чекбокс на листе? |
Задай внутри цикла функцию отслеживания нажатий на клавишу. (В справочниках по VBA есть описание) ps: не совсем понятно когда ты останавливаешь макрос у тебя вычисления останавливаются или останавливается запись этих вычислений в таблицу. |
|
слэн Пользователь Сообщений: 5192 |
форму в виде одной большой клавиши… с надписью «ПРОДОЛЖИТЬ» по нажатию меняется глобальная переменная — выход из цикла |
{quote}{login=Юрий М}{date=25.04.2011 11:16}{thema=}{post}Не, Серж, автор не хочет пускать пользователя в редактор — всё только на листе. Если я правильно понимаю :-){/post}{/quote} |
|
{quote}{login=k61}{date=25.04.2011 11:00}{thema=продолжает вычисления :}{post}пошагово F8 |
|
Vik63 Гость |
#30 25.04.2011 16:01:53 {quote}{login=Юрий М}{date=25.04.2011 11:32}{thema=}{post}doevents предлагалось — не глянулось что-то :-){/post}{/quote} |