Знакомство с понятиями модуль, процедура, форма в VBA Excel. Модули разных типов. Создание пользовательской формы. Встроенные диалоговые окна.
Самый простой способ перейти в редактор VBA — при активном окне программы Excel нажать сочетание клавиш Alt+F11 (здесь используется левая клавиша Alt). Это сочетание работает во всех версиях программы. Если в открывшемся окне нет слева окна проводника «Project-VBAProject», вызовите его через главное меню, выбрав «View» — «Project Explorer». Внутренние окна в редакторе VBA можно перетаскивать и размещать в других местах главного окна.
Модули рабочей книги Excel представляют из себя файлы, предназначенные для создания и хранения программного кода в виде процедур (подпрограмм, функций и пользовательских свойств). Модули бывают нескольких типов: стандартные модули и модули классов (рабочих книг, рабочих листов, диаграмм, пользовательских форм).
Стандартный модуль
Стандартный модуль представляет из себя отдельный файл, встроенный в рабочую книгу Excel и принадлежащий всему проекту VBA (VBAProject) со всеми его объектами (ThisWorkbook, Worksheets, Charts, UserForms). Стандартный модуль можно экспортировать, импортировать или удалить. Его публичные процедуры с уникальными именами доступны во всех остальных модулях рабочей книги без дополнительной адресации. Для публичных процедур с неуникальными именами требуется указание имени модуля, из которого они вызываются.
Создание стандартного модуля:
- Откройте рабочую книгу Excel, в которую планируете добавить новый стандартный модуль, или создайте новую книгу в учебных целях.
- Откройте редактор VBA сочетанием клавиш Alt+F11.
- В окне редактора VBA нажмите на пункт меню «Insert» и в открывшемся списке выберите «Module».
Таким образом, вы создали новый стандартный модуль. В проводнике справа появилась папка «Modules» и в ней файл «Module1» (или «Module» с другим номером, если в вашей книге модули уже были). Такие же модули создаются при записи макросов встроенным рекордером.
Открыть или перейти в окно открытого стандартного модуля можно, дважды кликнув по его имени в проводнике, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, все уже открытые модули доступны во вкладке «Window» главного меню.
Важное примечание: в Excel 2007-2016 книги с программными модулями сохраняются как «Книга Excel с поддержкой макросов (.xlsm)». Если вы добавили модуль в книгу «Книга Excel (.xlsx)», то, при ее сохранении или закрытии, программа Excel предложит сохранить ее как «Книга Excel с поддержкой макросов (.xlsm)», иначе изменения (созданные или импортированные модули) не сохранятся.
Модули классов
К модулям классов относятся модули книг, рабочих листов, диаграмм и пользовательских форм.
Модуль книги
Модуль книги принадлежит только объекту Workbook (Рабочая книга). Открыть или перейти в окно открытого модуля книги можно, дважды кликнув в проводнике на пункте «ЭтаКнига», или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Модуль листа
Модуль листа принадлежит только объекту Worksheet (Рабочий лист). Открыть модуль листа можно, дважды кликнув в проводнике по его имени, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, перейти в модуль листа можно из рабочей книги, кликнув правой кнопкой мыши по ярлыку этого листа и выбрав в контекстном меню «Просмотреть код». Открытый модуль доступен во вкладке «Window» главного меню.
Модуль диаграммы
Модуль диаграммы принадлежит только объекту Chart (Диаграмма, вынесенная на отдельный лист рабочей книги). Открыть его можно так же, как и модуль рабочего листа.
Модуль формы
Модуль формы принадлежит только объекту UserForm (Пользовательская форма). Откройте редактор VBA сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert». В открывшемся списке выберите «UserForm». Таким образом вы создадите новую пользовательскую форму «UserForm1». В проводнике справа появилась папка «Forms» и в ней файл «UserForm1». Перейти в модуль формы можно, дважды кликнув по самой форме, или кликнув по имени формы в проводнике правой кнопкой мыши и выбрав в контекстном меню «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Стандартных модулей в одной книге можно создать любое количество, модуль книги только один, модулей листов или форм только по одному для каждого экземпляра листа или формы.
Между открытыми окнами форм и модулей можно переходить, нажав в главном меню вкладку «Window», где перечислены все открытые модули и формы (активный объект отмечен галочкой).
Процедура
Процедуры VBA Excel, размещаемые в любом модуле, подразделяются на 3 типа:
- Sub (подпрограмма),
- Function (функция),
- Property (пользовательские свойства).
Главное отличие функции от подпрограммы заключается в том, что функция возвращает результат вычислений, а подпрограмма — нет. Процедура Property предназначена для создания пользовательских свойств и управления ими (используется не часто).
В редакторе VBA Excel перейдите в стандартный модуль и нажмите на пункт меню «Insert». В открывшемся списке выберите «Procedure…». Появится окно с предложением ввести название процедуры, выбрать тип и зону видимости. Создайте пару процедур с разной зоной видимости, пусть одна будет Sub, а другая — Function. В промежутке между началом и концом процедуры пишется программный код.
Private Sub Test() ‘Здесь пишется программный код End Sub |
Зона видимости Private означает, что эту процедуру можно вызвать только из того же модуля, в котором она записана.
Зона видимости Public означает, что эту процедуру можно вызвать не только из того же модуля, в котором она записана, но и из любого другого модуля этой книги и даже из модулей других книг.
Публичная процедура (Public) может быть записана и без явного указания видимости — зона видимости Public предполагается по умолчанию.
Первая запись:
и вторая запись:
равнозначны.
Форма
Формы в VBA Excel используются для создания диалоговых окон. Процедура создания новой формы описана в параграфе «Модуль формы». Обычно, вместе с новой формой открывается панель «ToolBox» с элементами управления, которые можно добавлять на форму. Если вы закрыли панель с элементами управлениями, отобразить ее снова можно через главное меню, выбрав «View» — «ToolBox».
Стоит добавить, что в VBA Excel есть два встроенных диалоговых окна — MsgBox и InputBox.
MsgBox — это окно для вывода информации с возвратом числового значения кнопки, нажатой пользователем.
InputBox — это окно с приглашением пользователя ввести какую-либо текстовую информацию. Есть еще расширенная версия этого окна — Application.InputBox, которую можно использовать для записи адреса выделяемого диапазона ячеек и не только для этого.
Хитрости »
1 Май 2011 300346 просмотров
Что такое модуль? Какие бывают модули?
Любой код VBA должен где-то храниться. Для хранения кодов в VBA используются модули, которые хранятся в книге. Книга может содержать сколько угодно модулей. Каждый модуль в свою очередь может содержать множество процедур(макросов).
Все имеющиеся в книге модули можно посмотреть через редактор VBA (Alt+F11). Имеющиеся модули отображены в левой части редактора в проводнeике объектов(Project Explorer).
рис.1
Сам проводник объектов может быть не отображен по умолчанию и тогда его необходимо отобразить: нажать Ctrl+R либо в меню редактора VBA-View—Project Explorer
Модули делятся на пять основных типов:
- Стандартный модуль
- Модуль листа
- Модуль книги
- Модуль пользовательской формы
- Модуль класса
- Перенос, импорт и экспорт модуля
Вообще, если точнее, то всего-то два типа модуля — обычный и модуль класса, т.к. Модуль листа, Модуль книги, Модуль пользовательской формы и Модуль класса по своей сути являются модулями классов. Но я специально разделил их на несколько типов, т.к. именно такие типы часто употребляются при пояснениях в различных учебниках и на всевозможных форумах и в самих книгах Excel они по виду и некоторому функционалу различны.
Для того, чтобы создать новый стандартный модуль(Module), модуль класса(ClassModule) или пользовательскую форму(UserForm) надо просто в окне Проводника объектов(Project Explorer) щелкнуть правой кнопкой мыши, выбрать пункт Insert и затем тип добавляемого объекта(Module, ClassModule, UserForm). Так же добавить модуль можно и через меню: Insert -тип модуля.
Удалить тоже просто: щелкнуть правой кнопкой мыши на нужном модуле в окне проекта и выбрать Remove. Подробнее про удаление описано в конце этой статьи: Удаление модулей
СТАНДАРТНЫЙ МОДУЛЬ
на рис.1 Module1.
Самый распространенный тип модулей, который используется в большинстве случаев. Именно в них макрорекордер создает записываемые макросы. Все коды и процедуры в таких модулях пишутся вручную, либо копируются из других источников(другого модуля, с этого сайта и т.п.). В основном именно в стандартных модулях содержится большая часть кодов. Они предназначены для хранения основных процедур и Public переменных, которые могут быть доступны впоследствии из любого модуля. Как создать стандартный модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Module. При записи макрорекордером модули создаются автоматически и им автоматически присваиваются имена.
Многие коды, опубликованные в статьях на сайте необходимо размещать именно в стандартных модулях. Для этого достаточно создать новый стандартный модуль, скопировать текст кода с сайта и вставить.
МОДУЛЬ ЛИСТА
Лист1 или Sheet1 — на рис.1: Лист1(Лист1),Лист2(Лист2),Лист3(Лист3).
Для каждого листа книги имеется свой отдельный модуль. Попасть в модуль листа проще, чем в остальные модули. Для этого надо просто щелкнуть правой кнопкой мыши по ярлычку листа и выбрать из контекстного меню пункт Исходный текст(View Code)
в зависимости от версии Excel этот пункт на русском может называться так же: Просмотреть код или Исходный код
:
Можно и более трудным путем пойти — через редактор VBA: Alt+F11 и в окне Проводника объектов(Project Explorer) дважды щелкнуть по объекту с именем листа или правая кнопка мыши на модуле листа —View code.
Размещая код в модуле листа следует помнить, что при копировании или переносе данного листа в другую книгу код так же будет скопирован, т.к. является частью листа. Это и плюс и минус одновременно. Плюс в том, что разместив код в модуле листа можно использовать этот лист в качестве шаблона для распространения со своими кнопками вызова этих кодов(в том числе создания книг кодом) и весь функционал будет доступен. Минус же заключается в некоторых нюансах обращения к ячейкам(подробнее можно ознакомиться в этой статье: Как обратиться к диапазону из VBA) и необходимости размещения ВСЕХ используемых процедур в этом листе, иначе при переносе в другие книги коды могут работать с ошибками.
В модуле листа содержатся встроенные событийные процедуры, каждая из которых отвечает за обработку определенного события на этом листе. Посмотреть их можно так: выбираете объект(на рисунке ниже список в левой части) Worksheet, а в правом списке выбираете событие(в этом списке все процедуры, доступные для выбранного листа):
Процедуры, события для которых уже используются, выделяются жирным шрифтом.
Названия событийных процедур носят достаточно информативные имена и большая их часть не нуждается в тщательной расшифровке. Но самые наиболее части применяемые в любом случае считаю нужным описать:
- Activate — возникает при активации самого листа(но не возникает, если произошел переход из одной книги в другую и этот лист является там активным)
- BeforeDoubleClick — возникает при двойном клике мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену режима редактирования
- BeforeRightClick — возникает при клике правой кнопкой мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену показа всплывающего меню
- Calculate — возникает при пересчете функций и формул на листе
- Change — возникает при изменении значений ячеек на листе. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на ячейку, которая была изменена. Может отличаться от активной в момент обработки ячейки
- Deactivate — возникает при переходе с этого листа на другой лист этой же книги
- FollowHyperlink — возникает при переходе по гиперссылке, созданной в этом листе
- SelectionChange — возникает при изменении адреса выделенной ячейки/области. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на диапазон ячеек, которые были выделены. Совпадает с выделенными на текущий момент ячейками
Достаточно важный момент: если захотите познакомиться поближе с событийными процедурами, всегда обращайте внимание на переменные, которые передаются в качестве аргументов в процедуру. В большинстве случаев рекомендую использовать именно эти переменные, а не выдумывать всякие возможности для вычисления объекта, который послужил причиной возникновения события. Для события листа Worksheet_Change это переменная Target. Для примера вставьте приведенный ниже код в модуль любого листа:
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Адрес измененной ячейки: " & Target.Address & _ "; Адрес активной ячейки: " & Selection.Address, vbInformation, "www.excel-vba.ru" End Sub
После этого запишите в ячейку A1 значение 5 и нажмите Enter. Событие Change сработает в момент завершения редактирования — т.е. в момент нажатия Enter. При этом будет произведен переход на ячейку A2(в большинстве случаев, если настройками не задано иное) и появится сообщение, которое покажет, что изменили ячейку A1, а выделена сейчас A2. Т.е. Target — это всегда ссылка именно на измененную ячейку независимо от того, что сейчас выделено. Данное событие(Worksheet_Change) не будет срабатывать при изменении значений ячеек с формулами. Только ручной ввод.
Примечание: для всех кодов, приведенных на сайте, достаточно просто открыть необходимый модуль(книги или листа) и вставить предложенный код. Корректировка может понадобиться только в случаях, когда в модуле Листа или Книги вашего файла уже имеется код в необходимой событийной процедуре.
МОДУЛЬ КНИГИ
ЭтаКнига или ThisWorkbook:
В модуль книги можно попасть только через проводник объектов(Project Explorer) редактора VBA — двойной щелчок по ЭтаКнига (ThisWorkbook) или правая кнопка мыши на модуле —View code. В модуле книги так же содержатся «встроенные» событийные процедуры. Так же как и для листа выбираем в списке объектов(вверху слева) Workbook. В правом окне выбора процедур, так же как и с модулем листа, будут все процедуры, доступные для объекта ЭтаКнига. Пример использования событийных процедур книги можно посмотреть в статье Как отследить событие(например выделение ячеек) в любой книге?
Но там применяются все те же правила — главное не забывать про аргументы, доступные из этих процедур и передаваемые им самим Excel. Например, для события Workbook_BeforeClose доступен аргумент Cancel. Это можно использовать, если не хотите, чтобы книгу закрыл пользователь, не заполнив ячейку A1. Вот пример подобного кода:
Private Sub Workbook_BeforeClose(Cancel As Boolean) If Me.Sheets("Отчет").Range("A1").Value = "" Then MsgBox "Необходимо заполнить ячейку A1 на листе 'Отчет'", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем закрытие книги End If End Sub
Из кода видно, что на листе «Отчет» должна быть не пустой ячейка A1(лист «Отчет» тоже должен существовать в этой книге). Но есть и еще одна вещь — какое-то Me. Это краткое обращение к объекту модуля класса, в данном случае это равнозначно обращению ThisWorkbook. И еще один пример кода для модуля ЭтаКнига, который запрещает сохранять исходную книгу, разрешая сохранить её только через пункт Сохранить как(SaveAs):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI = False Then 'используется простое сохранить MsgBox "Эта книга является шаблоном. Сохранять её можно только через Сохранить как", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем сохранение книги End If End Sub
Такое может потребоваться, если книга является шаблоном с полями для заполнения и необходимо предотвратить случайное сохранение исходного документа. Хотя это можно так же сделать без макросов — книгу можно сохранить с правами только на чтение.
МОДУЛИ ФОРМ
UserForm — на рис.1 UserForm1.
Содержатся внутри
Пользовательской формы(UserForm)
и её объектов. В Пользовательских формах в основном все завязано именно на событийных процедурах самой формы и на элементах этой формы(Кнопки, ТекстБоксы, КомбоБоксы(выпадающие списки) и т.д.). Очень удобно использовать Пользовательские формы в своих приложениях для общения с пользователем. Т.к. через формы очень удобно отслеживать действия пользователя и можно запретить доступ к листам с данными, путем их скрытия. Создается форма так же как и модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—UserForm. Примеры кодов с использованием форм можно посмотреть в статьях: Каждому пользователю свой лист/диапазон, Как оставить в ячейке только цифры или только текст?
МОДУЛЬ КЛАССА
ClassModule — на рис.1 Class1.
В большинстве случаев создается специально для отслеживания событий различных объектов. Вряд ли понадобиться начинающим изучение VBA, хотя все зависит от поставленной задачи. Но обычно начинающим изучать это кажется слишком сложным. В любом случае, перед работой с модулями классов лучше научиться хоть чуть-чуть работать с обычными модулями и самостоятельно писать процедуры. Как добавить такой модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Class Module. Подробнее про модули классов и работу с ними можно почитать в этой статье: Работа с модулями классов. Там описаны все основные принципы и приложен файл примера.
Действия по удалению любого из модулей одинаковы для всех типов. Для этого необходимо перейти в проект VBA нужной книги, выбрать нужный модуль, щелкнуть по нему правой кнопкой мыши и в появившемся меню выбрать Remove (Имя модуля)…(Remove Module1, Remove UserForm1, Remove Class1 и т.п.). После этого появится окно с запросом «Do you want to export (имя модуля) before removing it?». Это означает, что VBA спрашивает: хотите ли Вы сохранить копию кодов модуля перед удалением? Как правило выбирать следует Нет. Но если Вы хотите сохранить текст кодов из удаляемого модуля в отдельном файле, то соглашаетесь, нажав Да. Будет предложено выбрать папку для сохранения модуля и можно даже задать ему отдельное имя.
Иногда нужно модуль из одной книги переместить в другую. Сделать это можно несколькими способами. Самый простой — открыть обе книги, перейти в проводник проектов -найти нужный модуль -захватить его левой кнопкой мыши и не отпуская кнопку перетащить на проект другой книги:
Следует помнить, что так можно перенести и скопировать только стандартный модуль, модуль класса и модуль
UserForm
. Коды модулей листов и книги придется переносить как обычный текст: переходим в модуль
ЭтаКнига
(откуда хотим копировать) -копируем весь код -переходим в модуль ЭтаКнига второй книги и вставляем скопированное:
Экспорт модуля(сохранение в отдельный файл)
Если же надо сохранить стандартный модуль, модуль класса или модуль формы и не переносить сразу же в другую книгу, то можно экспортировать модуль. Для чего это может быть нужно? Как правило, чтобы перенести коды из дома на работу, переслать кому-то на другой ПК(пересылка файла с макросами может быть запрещена политикой безопасности компании) и т.п. Делается это просто: щелкаем на модуле правой кнопки мыши —Export file.
У экспортируемых модулей есть разные расширения, в зависимости от типа модуля. Для стандартных модулей это
.bas
(Module1.bas), для модулей класса —
.cls
(Class1.cls). А вот для модулей форм будет создано целых два файла:
UserForm1.frm
и
UserForm1.frx
. Их важно хранить вместе — один без другого не может быть импортирован в дальнейшем в файл. В файле
.frx
хранится информация об визуальном отображении формы и её элементах, если можно так сказать. В файле
.frm
хранятся непосредственно тексты кодов для формы и служебная информация(имя и размеры формы, некоторые глобальные директивы и ссылка на файл .frx). Поэтому не рекомендуется без соответствующих навыков переименовывать эти два файла в надежде, что потом все заработает.
Импорт модуля(перенос экспортированного ранее в новую книгу)
Для переноса экспортированного модуля в другую книгу надо просто в проводнике объектов выделить нужный проект правой кнопкой мыши —Import module -выбрать в диалоговом окне нужный модуль.
Экспортировать можно любой модуль, а вот импортировать — нет. Модули листов и книг хоть и экспортируются в отдельные файлы(кстати, с расширением .cls), но импортировать их не получится в том виде, как это предполагается. Они будут импортированы как новые модули класса и только. Поэтому для переноса кодов из модулей листов и книг придется использовать все равно копирование и вставку непосредственно кодов.
И в довершение — можно переносить модули автоматически, кодами VBA: Как добавить код процедуры программно, скопировать модуль
Также см.:
Копирование модулей и форм из одной книги в другую
Что такое макрос и где его искать?
Как удалить макросы в книге?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Введение
Всем нам приходится — кому реже, кому чаще — повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую «рутинную составляющую» — одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос — это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
В принципе, существует великое множество языков программирования (Pascal, Fortran, C++, C#, Java, ASP, PHP…), но для всех программ пакета Microsoft Office стандартом является именно встроенный язык VBA. Команды этого языка понимает любое офисное приложение, будь то Excel, Word, Outlook или Access.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно — редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис — Макрос — Редактор Visual Basic (Toos — Macro — Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer). Выбираем Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer). Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic (Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
- Обычные модули — используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert — Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
- Модуль Эта книга — также виден в левом верхнем углу редактора Visual Basic в окне, которое называется Project Explorer. В этот модуль обычно записываются макросы, которые должны выполнятся при наступлении каких-либо событий в книге (открытие или сохранение книги, печать файла и т.п.):
- Модуль листа — доступен через Project Explorer и через контекстное меню листа, т.е. правой кнопкой мыши по ярлычку листа — команда Исходный текст (View Source). Сюда записывают макросы, которые должны выполняться при наступлении определенных событий на листе (изменение данных в ячейках, пересчет листа, копирование или удаление листа и т.д.)
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
- Любой макрос должен начинаться с оператора Sub, за которым идет имя макроса и список аргументов (входных значений) в скобках. Если аргументов нет, то скобки надо оставить пустыми.
- Любой макрос должен заканчиваться оператором End Sub.
- Все, что находится между Sub и End Sub — тело макроса, т.е. команды, которые будут выполняться при запуске макроса. В данном случае макрос выделяет ячейку заливает выделенных диапазон (Selection) желтым цветом (код = 6) и затем проходит в цикле по всем ячейкам, заменяя формулы на значения. В конце выводится окно сообщения (MsgBox).
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно…
Способ 2. Запись макросов макрорекордером
Макрорекордер — это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу — запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись — ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) — во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше — выбрать в меню Сервис — Макрос — Начать запись (Tools — Macro — Record New Macro)
- в Excel 2007 и новее — нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса — подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш — будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис — Макрос — Макросы — Выполнить (Tools — Macro — Macros — Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в… — здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга — макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга — макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов — это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording).
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или — в старых версиях Excel — через меню Сервис — Макрос — Макросы (Tools — Macro — Macros):
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить (Run).
- Кнопка Параметры (Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить (Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис — Настройка (Tools — Customize) и перейдите на вкладку Команды (Commands). В категории Макросы легко найти веселый желтый «колобок» — Настраиваемую кнопку (Custom button):
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar):
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше — откройте панель инструментов Формы через меню Вид — Панели инструментов — Формы (View — Toolbars — Forms)
- В Excel 2007 и новее — откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button):
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция — только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert — Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка — Функция) в категории Определенные пользователем (User Defined):
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Модуль (или абсолютная величина) – это неотрицательное значение любого числа. То есть, например, для отрицательного числа -32 он равняется 32, в то время, как для любого положительного числа равен этому же числу.
Давайте посмотрим, как найти модуль числа в Эксель.
Использование функции ABS
В программе Excel для нахождения модуля числа предусмотрена специальная функция ABS, формула которой в общем виде может выглядеть так:
- ABS(число)
- ABS(адрес_ячейки_с_числом)
Допустим, нам нужно найти модуль числа -27. Для этого в любой свободной ячейке пишем выражение: =ABS(-27)
.
Нажав клавишу Enter получаем результат в выбранной ячейке.
Некоторые пользователи по привычке пишут в ячейке математическое выражение, а именно, |-27|.
В данном случае после нажатия Enter программа выдаст ошибку.
Вместо того, чтобы вручную прописывать формулы, можно использовать Мастер функций.
- Выбрав ячейку, куда мы планируем добавить функцию и провести расчеты, кликаем по кнопке “Вставить функцию” (fx) слева от строки формул.
- В открывшемся окне вставки функций выбираем категорию “Математические”, в предложенном списке кликаем по оператору “ABS” и жмем OK.
- На экране отобразится окно для заполнения аргумента функции – “Число”. Адрес ячейки с числовыми значением, модуль которого нужно посчитать, можно указать вручную, либо просто кликнуть по ней в самой таблице. Курсор при этом должен находиться в поле для ввода значения аргумента. По готовности жмем кнопку OK.
- В ячейке с функцией появится результат вычислений.
- Если нужно посчитать модули по всему столбцу, можно растянуть формулу на другие строки. Для этого наводим указатель мыши на ячейку с результатом, когда появится небольшой черный плюсик, зажав левую кнопку мыши тянем его вниз до последней ячейки столбца (или до той ячейки, для которой нужно посчитать аналогичный результат).
- Все готово, мы получили модули всех значений в исходном столбце.
Заключение
Таким образом, в Эксель можно легко и быстро посчитать модуль числа с помощью специально предназначенной для этого функции. Причем ввиду того, что формула достаточно проста и содержит всего один аргумент, ее можно сразу писать в ячейке таблицы. Или же можно воспользоваться мастером функций, который позволит безошибочно выполнить расчет.
На чтение 8 мин. Просмотров 5.1k.
Итог: в этой статье мы сравниваем различные места для хранения макросов, функций и кода VBA в Excel. Мы специально смотрим на модули кода, листовой модуль и модуль ThisWorkbook, чтобы узнать различия между тем, как работает каждый из них. Мы также узнаем, как запускать макросы на основе событий или действий пользователя.
Уровень мастерства: Средний
Содержание
- Видео: объяснение кодовых модулей VBA
- Скачать файл
- 5 мест для хранения кода VBA в рабочей книге
- Code vs Sheet vs ThisWorkbook Module
- Какое лучшее место для хранения моего кода?
Видео: объяснение кодовых модулей VBA
Скачать файл
Загрузите файл Excel.
VBA Code Modules.xlsm (25.3 KB)
5 мест для хранения кода VBA в рабочей книге
На самом деле есть 5 различных модулей, в которых мы можем хранить код VBA в рабочей книге. Каждый из них виден в окне Project Explorer (Ctrl + R) в редакторе VB. Вот краткий обзор каждого типа объекта.
- Code Modules — модули кода являются наиболее распространенным местом, где мы храним макросы. Модули находятся в папке «Модули» в рабочей книге.
- Sheet Modules — у каждого листа в книге есть объект листа в папке «Объекты Microsoft Excel». Двойной щелчок объекта листа открывает его модуль кода, в который мы можем добавить процедуры обработки событий (макросы). Эти макросы запускаются, когда пользователь выполняет определенное действие на листе.
- ThisWorkbook Module — каждая книга содержит один объект ThisWorkbook в нижней части папки объектов Microsoft Excel. Мы можем создавать макросы на основе событий, которые выполняются, когда пользователь выполняет действия в / над книгой.
- Userforms — пользовательские формы — это интерактивные формы или окна, в которые мы можем добавлять элементы управления, такие как раскрывающиеся меню, списки, флажки, кнопки и т. Д. Каждая пользовательская форма хранится в папке «Формы» и имеет модуль кода, в который можно помещать макросы, которые будут запускаться. когда форма открыта и / или пользователь взаимодействует с элементами управления в форме.
- Class Modules — классы хранятся в папке «Модули классов» и позволяют нам писать макросы для создания объектов, свойств и методов. Классы могут использоваться, когда мы хотим создать пользовательские объекты или коллекции, которые не существуют в Библиотеке объектов.
Когда мы дважды щелкаем или щелкаем правой кнопкой мыши>
Просмотр кода (сочетание клавиш: F7) на любом из этих объектов в окне Project
Explorer, окно кода открывается справа от редактора VB. Окно кода выглядит
одинаково для каждого из объектов. Это просто большой пустой холст, где мы
можем напечатать код.
Для этого поста мы собираемся сравнить первые 3 модуля, перечисленные выше.
Code vs Sheet vs ThisWorkbook Module
Это, вероятно, 3 наиболее распространенных места, где мы можем хранить макросы (подпроцедуры) и функции (UDF) в наших проектах VBA.
Каждый из этих модулей позволяет нам хранить макросы, которые мы можем запустить нажатием кнопки или из окна макроса. Однако объекты Sheet и ThisWorkbook позволяют нам хранить процедуры событий (макросы), которые будут выполняться, когда пользователь выполняет действие в рабочей книге.
Итак, давайте посмотрим на каждый объект более подробно.
Code Modules
Модули кода позволяют нам хранить обычные макросы (подпроцедуры) и функции (пользовательские функции, пользовательские функции). Это типичное место, где мы начинаем писать и хранить наши макросы. Устройство записи макросов также создает код в модуле кода.
Когда у нас есть макрос в модуле кода, мы можем запустить его из окна макроса (вкладка «Разработчик» или «Просмотр вкладки»> «Макросы»). Мы также можем запустить макрос, назначив его кнопке или фигуре. Когда пользователь нажимает кнопку, макрос запускается. Ознакомьтесь с моей статьей и видео о том, как создать Персональную книгу макросов и добавить кнопки на ленту для получения более подробной информации.
Мы можем добавить несколько модулей кода в папку «Модули», и это помогает сохранить наш код организованным в рамках проекта (рабочей книги).
Таким образом, модуль кода позволяет нам хранить основные макросы, которые будут запускаться пользователем нажатием кнопки. Но что, если мы хотим, чтобы наши макросы запускались автоматически, когда пользователь открывает рабочую книгу, меняет рабочие таблицы или выбирает конкретную ячейку?
Sheet Modules & Event Procedure Macros
Каждый лист в книге имеет объект листа в редакторе VB. Они перечислены в папке «Объекты Microsoft Excel» для каждой открытой книги в окне «Проект».
Объект листа отображает кодовое имя листа и имя вкладки в скобках. Имя вкладки — это имя, отображаемое в книге, которое пользователь может изменить.
Двойной щелчок по объекту листа откроет окно его модуля кода.
Мы можем добавить обычные макросы в объект листа.
Мы также можем добавить процедуры обработки событий, которые будут выполняться, когда пользователь выполняет действие на листе. Вот как добавить процедуру обработки события.
- Выберите «Рабочий лист» в раскрывающемся меню
«Объекты». Событие выбора будет автоматически добавлено в окно кода. Это
событие по умолчанию, но мы НЕ должны использовать это событие. Событие SelectionChange
запускается каждый раз, когда пользователь выбирает ячейку на листе. - Щелкните раскрывающийся список «Процедура»,
чтобы увидеть список других процедур обработки событий. - Выберите одно из событий из списка, и его код
процедуры (макроса) будет добавлен в модуль кода листа. Теперь мы можем
добавить код внутри процедуры, которая будет выполняться, когда пользователь
выполняет действие.
В видео я использую пример кода, который выбирает всю строку и столбец ячейки, выбранной на листе. Он выбирает/выделяет всю строку и столбец для пользователя. Посмотрите видео, чтобы подробно изучить, как это работает.
Модули листа могут содержать несколько процедур обработки событий. Он также может содержать обычные процедуры (макросы) и функции.
На странице справки по объекту MSDN Worksheet есть список всех событий рабочего листа и их справочных статей.
Модуль ThisWorkbook и макросы процедуры события
Каждая рабочая книга содержит один объект с именем
ThisWorkbook. Объект ThisWorkbook хранится в нижней части папки объектов
Microsoft Excel.
Основное назначение модуля ThisWorkbook — запуск процедур
обработки событий (макросов), когда пользователь выполняет действие в книге.
Это может произойти, когда пользователь открывает рабочую книгу, прежде чем
закрыть рабочую книгу, когда он выбирает рабочую таблицу, диапазон или даже
обновляет сводную таблицу.
Модуль ThisWorbook очень похож на модули листа. Основное отличие состоит в том, что процедуры обработки событий в модуле ThisWorkbook могут выполняться, когда действия выполняются во всей книге. События модуля листа выполняются только тогда, когда действия выполняются на конкретном листе, в котором находится код.
Процесс добавления процедур обработки событий в модуль ThisWorkbook аналогичен модулю листа.
- Выберите Workbook из выпадающего меню Object.
- Событие Workbook_Open автоматически добавляется
в модуль. Этот макрос запускается при открытии книги и включении макросов. Вы
можете удалить код этого события, если вы не хотите его использовать. - Выберите другое событие из выпадающего списка
Процедуры. - Код для этой процедуры будет добавлен в модуль.
Добавьте код в процедуру, которая будет выполняться, когда пользователь
выполнит это действие в книге.
События рабочего листа также доступны в списке событий ThisWorkbook. Это означает, что мы можем запускать события листа на любом листе или на отдельных листах вместо копирования / вставки кода между модулями листа.
На странице справки по объекту MSDN Worksheet есть список всех событий рабочего листа и их справочных статей.
Какое лучшее место для хранения моего кода?
Теперь, когда вы знаете, как работают различные модули, вам может быть интересно, где лучше всего хранить весь ваш код. И ответ таков: это вопрос личных предпочтений …
Поместите весь код в листовые модули
Технически вы можете хранить все свои макросы и функции в модуле Sheet или модуле ThisWorkbook. Некоторым разработчикам нравится этот подход, потому что он привязывает все к определенному листу или набору листов. Затем листы можно перемещать или копировать в разные рабочие книги, и код будет перемещаться вместе с ними. Важно отметить, что пользовательские функции должны храниться в модуле кода.
Организовать код в кодовых модулях
Другим разработчикам нравится организовывать все макросы в
модулях кода. Если им нужно использовать события листа или книги, они добавляют
эти события в соответствующий модуль и затем вызывают макросы в модулях кода из
этих событий. Преимущество в том, что весь ваш код легко увидеть в одном месте.
Вы можете добавлять комментарии к макросам, которые вызываются процедурами
обработки событий, чтобы вы знали, как выполняются макросы.
По этой причине я предпочитаю хранить свой код в модулях
кода. Когда я открываю книгу в редакторе VB, легко увидеть, что макрос содержит
код, без необходимости дважды щелкать каждый объект листа, чтобы увидеть,
существует ли код в модуле. Это может занять много времени, если в рабочей
книге много листов, и это может затруднить отладку проекта.
Планируйте свое наследие с умом!
У каждого метода есть свои плюсы и минусы, поэтому я предлагаю выбрать тот, который подходит именно вам. Если вы собираетесь передавать рабочую книгу или проект кому-то другому для поддержки в будущем, постарайтесь облегчить им поиск вашего кода. Планирование вашего наследия заблаговременно будет означать меньше работы для вас в будущем …
Пожалуйста, оставьте комментарий ниже с любыми вопросами. Спасибо!