Введение
Всем нам приходится — кому реже, кому чаще — повторять одни и те же действия и операции в 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):
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
На чтение 31 мин. Просмотров 15.5k.
С помощью VBA вы можете создать пользовательскую функцию, которую можно использовать на листах точно так же, как обычные функции.
Это полезно, когда существующих функций Excel недостаточно. В таких случаях вы можете создать свою собственную пользовательскую функцию (UDF) для удовлетворения ваших конкретных потребностей.
В этом руководстве я расскажу о создании и использовании пользовательских функций в VBA.
Содержание
- Что такое функциональная процедура в VBA?
- Создание простой пользовательской функции в VBA
- Анатомия пользовательской функции в VBA
- Аргументы в пользовательской функции в VBA
- Создание функции, которая возвращает массив
- Понимание объема пользовательской функции в Excel
- Различные способы использования пользовательской функции в Excel
- Создание надстройки
- Сохранение функции в персональной книге макросов
- Ссылка на функцию из другой книги
- Использование оператора выхода из VBA
- Отладка пользовательской функции
- Встроенные функции Excel против Пользовательской функции VBA
- Где разместить код VBA для пользовательской функции
Что такое функциональная процедура в VBA?
Процедура Function — это код VBA, который выполняет вычисления и возвращает значение (или массив значений).
Используя процедуру Function, вы можете создать функцию, которую вы можете использовать на рабочем листе (как и любую обычную функцию Excel, такую как SUM или VLOOKUP).
Когда вы создали процедуру Function с использованием VBA, вы можете использовать ее тремя способами:
- В качестве формулы на рабочем листе, где она может принимать аргументы в качестве входных данных и возвращать значение или массив значений.
- Как часть кода вашей подпрограммы VBA или другого кода функции.
- В условном форматировании
Хотя на рабочем листе уже имеется более 450 встроенных функций Excel, вам может потребоваться настраиваемая функция, если:
- Встроенные функции не могут делать то, что вы хотите сделать. В этом случае вы можете создать пользовательскую функцию на основе ваших требований.
- Встроенные функции могут выполнять работу, но формула длинная и сложная. В этом случае вы можете создать пользовательскую функцию, которую легко читать и использовать
Обратите внимание, что пользовательские функции, созданные с использованием VBA, могут быть значительно медленнее, чем встроенные функции. Следовательно, они лучше всего подходят для ситуаций, когда вы не можете получить результат, используя встроенные функции.
Функция против Подпрограммы в VBA
«Подпрограмма» позволяет вам выполнять набор кода, в то время как «Функция» возвращает значение (или массив значений).
Например, если у вас есть список чисел (как положительных, так и отрицательных), и вы хотите идентифицировать отрицательные числа, вот что вы можете сделать с помощью функции и подпрограммы.
Подпрограмма может проходить через каждую ячейку в диапазоне и может выделять все ячейки, которые имеют отрицательное значение в ней. В этом случае подпрограмма завершает изменение свойств объекта диапазона (путем изменения цвета ячеек).
С пользовательской функцией вы можете использовать ее в отдельном столбце, и она может возвратить TRUE, если значение в ячейке отрицательное, и FALSE, если оно положительное. С помощью функции вы не можете изменять свойства объекта. Это означает, что вы не можете изменить цвет ячейки с помощью самой функции (однако вы можете сделать это, используя условное форматирование с пользовательской функцией).
Когда вы создаете пользовательскую функцию (UDF) с использованием VBA, вы можете использовать эту функцию на листе, как и любую другую функцию. Я расскажу об этом подробнее в разделе «Различные способы использования пользовательских функций в Excel».
Создание простой пользовательской функции в VBA
Позвольте мне создать простую пользовательскую функцию в VBA и показать вам, как она работает.
Приведенный ниже код создает функцию, которая извлекает числовые части из буквенно-цифровой строки.
Function GetNumeric(CellRef As String) as Long Dim StringLength As Integer StringLength = Len(CellRef) For i = 1 To StringLength If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1) Next i GetNumeric = Result End Function
Если у вас есть вышеуказанный код в модуле, вы можете использовать эту функцию в рабочей книге.
Ниже показано, как эту функцию — GetNumeric — можно использовать в Excel.
Теперь, прежде чем я расскажу вам, как эта функция создается в VBA и как она работает, вам нужно знать несколько вещей:
- Когда вы создаете функцию в VBA, она становится доступной во всей книге, как и любая другая обычная функция.
- Когда вы вводите имя функции, за которым следует знак равенства, Excel покажет вам имя функции в списке совпадающих функций. В приведенном выше примере, когда я ввел = Get, Excel показал мне список, в котором была моя пользовательская функция.
Я считаю, что это хороший пример, когда вы можете использовать VBA для создания простой в использовании функции в Excel. Вы можете сделать то же самое с формулой (как показано в этом руководстве), но это становится сложным и трудным для понимания. С этим UDF вам нужно передать только один аргумент, и вы получите результат.
Анатомия пользовательской функции в VBA
В приведенном выше разделе я дал вам код и показал, как функция UDF работает на рабочем листе.
Теперь давайте углубимся и посмотрим, как создается эта функция. Вы должны поместить приведенный ниже код в модуль в VB Editor. Я рассматриваю эту тему в разделе «Где разместить код VBA для пользовательской функции».
Function GetNumeric(CellRef As String) as Long ' Эта функция извлекает числовую часть из строки Dim StringLength As Integer StringLength = Len(CellRef) For i = 1 To StringLength If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1) Next i GetNumeric = Result End Function
Первая строка кода начинается со слова «Функция».
Это слово говорит VBA, что наш код является функцией (а не подпрограммой). За словом Function следует имя функции — GetNumeric. Это имя, которое мы будем использовать на листе, чтобы использовать эту функцию.
- В имени функции не должно быть пробелов. Кроме того, вы не можете назвать функцию, если она конфликтует с именем ссылки на ячейку. Например, вы не можете назвать функцию ABC123, так как она также относится к ячейке на листе Excel.
- Вы не должны давать своей функции то же имя, что и у существующей функции. Если вы сделаете это, Excel будет отдавать предпочтение встроенной функции.
- Вы можете использовать подчеркивание, если хотите разделить слова. Например, Get_Numeric является допустимым именем
За именем функции следуют некоторые аргументы в скобках. Это аргументы, которые нужны нашей функции от пользователя. Это как аргументы, которые мы должны предоставить встроенным функциям Excel. Например, в функции COUNTIF есть два аргумента (диапазон и критерии).
В скобках необходимо указать аргументы.
В нашем примере есть только один аргумент — CellRef.
Также полезно указывать, какой аргумент ожидает функция. В этом примере, так как мы будем передавать функции ссылку на ячейку, мы можем указать аргумент как тип «Range». Если вы не укажете тип данных, VBA будет рассматривать его как вариант (что означает, что вы можете использовать любой тип данных).
Если у вас есть более одного аргумента, вы можете указать те же в круглых скобках — через запятую. Далее в этом руководстве мы увидим, как использовать несколько аргументов в пользовательской функции.
Обратите внимание, что функция указана как тип данных «String». Это сообщит VBA, что результат формулы будет иметь тип данных String.
Здесь я могу использовать числовой тип данных (например, Long или Double), но это ограничит диапазон возвращаемых чисел. Если у меня есть строка длиной 20 номеров, которую мне нужно извлечь из общей строки, объявление функции как Long или Double приведет к ошибке (так как число будет вне диапазона). Поэтому я сохранил тип выходных данных функции как String.
Вторая строка кода — зеленая, которая начинается с апострофа — это комментарий. При чтении кода VBA игнорирует эту строку. Вы можете использовать это, чтобы добавить описание или подробности о коде.
Третья строка кода объявляет переменную StringLength как тип данных Integer. Это переменная, в которой мы храним значение длины строки, которая анализируется по формуле.
В четвертой строке переменная Result объявляется как тип данных String. Это переменная, в которой мы будем извлекать числа из буквенно-цифровой строки.
Пятая строка назначает длину строки во входном аргументе переменной «StringLength». Обратите внимание, что «CellRef» относится к аргументу, который будет предоставлен пользователем при использовании формулы в рабочей таблице (или при использовании ее в VBA — которую мы увидим позже в этом руководстве).
Шестая, седьмая и восьмая строки являются частью цикла For Next. Цикл выполняется столько раз, сколько символов во входном аргументе. Этот номер задается функцией LEN и присваивается переменной «StringLength».
Таким образом, цикл проходит от «1 до Stringlength».
Внутри цикла оператор IF анализирует каждый символ строки и, если он числовой, добавляет этот числовой символ в переменную Result. Для этого он использует функцию MID в VBA.
Вторая последняя строка кода присваивает значение результата функции. Именно эта строка кода гарантирует, что функция вернет значение «Result» обратно в ячейку (откуда она вызывается).
Последняя строка кода — End Function. Это обязательная строка кода, которая сообщает VBA, что код функции заканчивается здесь.
Приведенный выше код объясняет различные части типичной пользовательской функции, созданной в VBA. В следующих разделах мы углубимся в эти элементы, а также увидим различные способы выполнения функции VBA в Excel.
Аргументы в пользовательской функции в VBA
В приведенных выше примерах, где мы создали пользовательскую функцию для получения числовой части из буквенно-цифровой строки (GetNumeric), функция была разработана для получения одного аргумента.
В этом разделе я расскажу, как создавать функции, не имеющие аргументов, для функций, которые принимают несколько аргументов (как обязательных, так и необязательных).
Создание функции в VBA без каких-либо аргументов
В листе Excel у нас есть несколько функций, которые не принимают аргументов (например, RAND, TODAY, NOW).
Эти функции не зависят от входных аргументов. Например, функция TODAY возвращает текущую дату, а функция RAND возвращает случайное число в диапазоне от 0 до 1.
Вы можете создать такую же функцию в VBA.
Ниже приведен код, который даст вам имя файла. Он не принимает никаких аргументов, так как результат, который нужно вернуть, не зависит ни от одного аргумента.
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Приведенный выше код определяет результат функции как тип данных String (в качестве результата мы хотим получить имя файла, которое является строкой).
Эта функция присваивает функции значение «ThisWorkbook.Name», которое возвращается, когда функция используется на рабочем листе.
Если файл был сохранен, он возвращает имя с расширением файла, в противном случае он просто дает имя.
Выше есть одна проблема, хотя.
Если имя файла изменится, оно не будет автоматически обновлено. Обычно функция обновляется при изменении входных аргументов. Но поскольку в этой функции нет аргументов, функция не пересчитывает (даже если вы измените имя книги, закройте ее, а затем снова откройте).
При желании вы можете форсировать пересчет с помощью сочетания клавиш — Control + Alt + F9.
Чтобы формула пересчитывалась всякий раз, когда в рабочем листе есть изменения, вам нужна строка кода к ней.
Приведенный ниже код заставляет функцию пересчитывать всякий раз, когда происходит изменение в рабочем листе (как и в других аналогичных функциях рабочего листа, таких как функция TODAY или RAND).
Function WorkbookName() As String Application.Volatile True WorkbookName = ThisWorkbook.Name End Function
Теперь, если вы измените имя книги, эта функция будет обновляться всякий раз, когда будут какие-либо изменения в таблице, или когда вы снова откроете эту книгу.
Создание функции в VBA с одним аргументом
В одном из разделов выше мы уже видели, как создать функцию, которая принимает только один аргумент (функция GetNumeric, описанная выше).
Давайте создадим еще одну простую функцию, которая принимает только один аргумент.
Функция, созданная с помощью приведенного ниже кода, преобразует ссылочный текст в верхний регистр. Теперь у нас уже есть функция для этого в Excel, и эта функция просто показывает вам, как она работает. Если вам нужно сделать это, лучше использовать встроенную функцию UPPER.
Function ConvertToUpperCase(CellRef As Range) ConvertToUpperCase = UCase(CellRef) End Function
Эта функция использует функцию UCase в VBA для изменения значения переменной CellRef. Затем он присваивает значение функции ConvertToUpperCase.
Поскольку эта функция принимает аргумент, нам не нужно использовать здесь часть Application.Volatile. Как только аргумент изменится, функция автоматически обновится.
Создание функции в VBA с несколькими аргументами
Точно так же, как функции рабочего листа, вы можете создавать функции в VBA, которые принимают несколько аргументов.
Приведенный ниже код создаст функцию, которая будет извлекать текст перед указанным разделителем. Он принимает два аргумента — ссылку на ячейку с текстовой строкой и разделитель.
Function GetDataBeforeDelimiter(CellRef As Range, Delim As String) as String Dim Result As String Dim DelimPosition As Integer DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1 Result = Left(CellRef, DelimPosition) GetDataBeforeDelimiter = Result End Function
Когда вам нужно использовать более одного аргумента в пользовательской функции, вы можете иметь все аргументы в скобках, разделенные запятой.
Обратите внимание, что для каждого аргумента вы можете указать тип данных. В приведенном выше примере «CellRef» был объявлен как тип данных диапазона, а «Delim» был объявлен как тип данных String. Если вы не укажете какой-либо тип данных, VBA считает, что это вариант данных.
Когда вы используете вышеуказанную функцию на листе, вам нужно указать ссылку на ячейку, в которой в качестве первого аргумента указан текст, а в качестве двойного кавычка — символ (ы) в двойных кавычках.
Затем он проверяет положение разделителя с помощью функции INSTR в VBA. Эта позиция затем используется для извлечения всех символов перед разделителем (используя функцию LEFT).
Наконец, он присваивает результат функции.
Эта формула далека от совершенства. Например, если вы введете разделитель, который не найден в тексте, он выдаст ошибку. Теперь вы можете использовать функцию IFERROR на листе, чтобы избавиться от ошибок, или вы можете использовать приведенный ниже код, который возвращает весь текст, когда он не может найти разделитель.
Function GetDataBeforeDelimiter(CellRef As Range, Delim As String) as String Dim Result As String Dim DelimPosition As Integer DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1 If DelimPosition < 0 Then DelimPosition = Len(CellRef) Result = Left(CellRef, DelimPosition) GetDataBeforeDelimiter = Result End Function
Мы можем дополнительно оптимизировать эту функцию.
Если вы введете текст (из которого вы хотите извлечь часть перед разделителем) непосредственно в функции, это приведет к ошибке. Давай .. попробуй!
Это происходит, когда мы указали «CellRef» в качестве типа данных диапазона.
Или, если вы хотите, чтобы разделитель находился в ячейке и использовал ссылку на ячейку вместо жесткого кодирования в формуле, вы не можете сделать это с помощью приведенного выше кода. Это потому, что Delim был объявлен как строковый тип данных.
Если вы хотите, чтобы функция имела гибкость, позволяющую принимать прямой ввод текста или ссылки на ячейки от пользователя, вам необходимо удалить объявление типа данных. Это приведет к созданию аргумента в качестве альтернативного типа данных, который может принимать аргументы любого типа и обрабатывать их.
Код ниже сделает это:
Function GetDataBeforeDelimiter(CellRef, Delim) As String Dim Result As String Dim DelimPosition As Integer DelimPosition = InStr(1, CellRef, Delim, vbBinaryCompare) - 1 If DelimPosition < 0 Then DelimPosition = Len(CellRef) Result = Left(CellRef, DelimPosition) GetDataBeforeDelimiter = Result End Function
Создание функции в VBA с необязательными аргументами
В Excel есть много функций, некоторые из которых не являются обязательными.
Например, легендарная функция VLOOKUP имеет 3 обязательных аргумента и один необязательный аргумент.
Необязательный аргумент, как следует из названия, указывать необязательно. Если вы не укажете один из обязательных аргументов, ваша функция выдаст вам ошибку, но если вы не укажете необязательный аргумент, ваша функция будет работать.
Но необязательные аргументы не бесполезны. Они позволяют вам выбирать из целого ряда вариантов.
Например, в функции VLOOKUP, если вы не указали четвертый аргумент, VLOOKUP выполняет приблизительный поиск, а если вы указываете последний аргумент как FALSE (или 0), то он выполняет точное совпадение.
Помните, что необязательные аргументы всегда должны идти после всех обязательных аргументов. Вы не можете иметь дополнительные аргументы в начале.
Теперь давайте посмотрим, как создать функцию в VBA с необязательными аргументами.
Функция только с необязательным аргументом
Насколько я знаю, нет встроенной функции, которая принимает только необязательные аргументы (я могу ошибаться, но я не могу думать ни о какой такой функции).
Но мы можем создать один с VBA.
Ниже приведен код функции, которая выдаст вам текущую дату в формате dd-mm-yyyy, если вы не вводите никаких аргументов (т.е. оставьте это поле пустым), и в формате «dd mmmm, yyyy», если вы введете что-либо в качестве аргумента (т. е. что угодно, чтобы аргумент не был пустым).
Function CurrDate(Optional fmt As Variant) Dim Result If IsMissing(fmt) Then CurrDate = Format(Date, "dd-mm-yyyy") Else CurrDate = Format(Date, "dd mmmm, yyyy") End If End Function
Обратите внимание, что вышеупомянутая функция использует IsMissing, чтобы проверить, отсутствует аргумент или нет. Чтобы использовать функцию IsMissing, необязательный аргумент должен иметь вариантный тип данных.
Вышеуказанная функция работает независимо от того, что вы вводите в качестве аргумента. В коде мы только проверяем, указан ли необязательный аргумент или нет.
Вы можете сделать это более надежным, взяв только определенные значения в качестве аргументов и показывая ошибку в остальных случаях (как показано в приведенном ниже коде).
Function CurrDate(Optional fmt As Variant) Dim Result If IsMissing(fmt) Then CurrDate = Format(Date, "dd-mm-yyyy") ElseIf fmt = 1 Then CurrDate = Format(Date, "dd mmmm, yyyy") Else CurrDate = CVErr(xlErrValue) End If End Function
Приведенный выше код создает функцию, которая показывает дату в формате «дд-мм-гггг», если аргумент не указан, и в формате «дд мммм, гггг», если аргумент равен 1. Во всех других случаях выдается ошибка.
Функция с необходимыми и необязательными аргументами
Мы уже видели код, который извлекает числовую часть из строки.
Теперь давайте рассмотрим похожий пример, который принимает как обязательные, так и необязательные аргументы.
Приведенный ниже код создает функцию, которая извлекает текстовую часть из строки. Если необязательный аргумент равен TRUE, он дает результат в верхнем регистре, а если необязательный аргумент имеет значение FALSE или опущен, он дает результат как есть.
Function GetText(CellRef As Range, Optional TextCase = False) As String Dim StringLength As Integer Dim Result As String StringLength = Len(CellRef) For i = 1 To StringLength If Not (IsNumeric(Mid(CellRef, i, 1))) Then Result = Result & Mid(CellRef, i, 1) Next i If TextCase = True Then Result = UCase(Result) GetText = Result End Function
Обратите внимание, что в приведенном выше коде мы инициализировали значение «TextCase» как False (смотрите в скобках в первой строке).
Сделав это, мы убедились, что необязательный аргумент начинается со значения по умолчанию, то есть FALSE. Если пользователь указывает значение как ИСТИНА, функция возвращает текст в верхнем регистре, а если пользователь указывает необязательный аргумент как ЛОЖЬ или пропускает его, то возвращаемый текст остается как есть.
Создание функции в VBA с массивом в качестве аргумента
До сих пор мы видели примеры создания функции с необязательными / обязательными аргументами, где эти аргументы были одним значением.
Вы также можете создать функцию, которая может принимать массив в качестве аргумента. В функциях листа Excel есть много функций, которые принимают аргументы массива, такие как SUM, VLOOKUP, SUMIF, COUNTIF и т.д.
Ниже приведен код, который создает функцию, которая дает сумму всех четных чисел в указанном диапазоне ячеек.
Function AddEven(CellRef as Range) Dim Cell As Range For Each Cell In CellRef If IsNumeric(Cell.Value) Then If Cell.Value Mod 2 = 0 Then Result = Result + Cell.Value End If End If Next Cell AddEven = Result End Function
Вы можете использовать эту функцию на листе и указать диапазон ячеек, в которых в качестве аргумента используются числа. Функция будет возвращать одно значение — сумму всех четных чисел (как показано ниже).
В приведенной выше функции вместо одного значения мы предоставили массив (A1: A10). Чтобы это работало, вам нужно убедиться, что ваш тип данных аргумента может принимать массив.
В приведенном выше коде я указал аргумент CellRef как Range (который может принимать массив в качестве входных данных). Вы также можете использовать вариантный тип данных здесь.
В коде есть цикл For Each, который проходит через каждую ячейку и проверяет, является ли это число не. Если это не так, ничего не происходит, и он перемещается в следующую ячейку. Если это число, оно проверяет, является ли оно четным или нет (с помощью функции MOD).
В конце все четные числа добавляются, и сумма возвращается обратно в функцию.
Создание функции с неопределенным числом аргументов
При создании некоторых функций в VBA вы можете не знать точное количество аргументов, которые пользователь хочет предоставить. Поэтому необходимо создать функцию, которая может принимать столько аргументов, сколько необходимо, и использовать их для возврата результата.
Примером такой функции рабочего листа является функция SUM. Вы можете предоставить несколько аргументов (например, это):
= SUM (A1, A2: A4, B1: B20)
Вышеупомянутая функция добавит значения во все эти аргументы. Также обратите внимание, что это может быть одна ячейка или массив ячеек.
Вы можете создать такую функцию в VBA, указав последний аргумент (или единственный аргумент) в качестве необязательного. Кроме того, этому необязательному аргументу должно предшествовать ключевое слово «ParamArray».
ParamArray — это модификатор, который позволяет вам принимать столько аргументов, сколько вы хотите. Обратите внимание, что использование слова ParamArray перед аргументом делает аргумент необязательным. Однако вам не нужно использовать здесь слово «Необязательно».
Теперь давайте создадим функцию, которая может принимать произвольное количество аргументов и добавит все числа в указанные аргументы:
Function AddArguments(ParamArray arglist() As Variant) For Each arg In arglist AddArguments = AddArguments + arg Next arg End Function
Вышеприведенная функция может принимать любое количество аргументов и добавлять эти аргументы для получения результата.
Обратите внимание, что в качестве аргумента вы можете использовать только одно значение, ссылку на ячейку, логическое значение или выражение. Вы не можете предоставить массив в качестве аргумента. Например, если один из ваших аргументов — D8: D10, эта формула выдаст вам ошибку.
Если вы хотите использовать оба аргумента из нескольких ячеек, вам нужно использовать следующий код:
Function AddArguments(ParamArray arglist() As Variant) For Each arg In arglist For Each Cell In arg AddArguments = AddArguments + Cell Next Cell Next arg End Function
Обратите внимание, что эта формула работает с несколькими ячейками и ссылками на массивы, однако она не может обрабатывать жестко закодированные значения или выражения. Вы можете создать более надежную функцию, проверяя и обрабатывая эти условия, но это не является целью.
Цель здесь — показать вам, как работает ParamArray, чтобы вы могли разрешить неопределенное количество аргументов в функции. Если вам нужна функция лучше, чем та, которая была создана в приведенном выше коде, используйте функцию SUM на листе.
Создание функции, которая возвращает массив
До сих пор мы видели функции, которые возвращают одно значение.
С помощью VBA вы можете создать функцию, которая возвращает вариант, содержащий целый массив значений.
Формулы массивов также доступны в виде встроенных функций на листах Excel. Если вы знакомы с формулами массива в Excel, вы знаете, что они вводятся клавишами Control + Shift + Enter (а не только Enter). Вы можете прочитать больше о формулах массива здесь. Если вы не знаете формул массива, не беспокойтесь, продолжайте читать.
Давайте создадим формулу, которая возвращает массив из трех чисел (1,2,3).
Код ниже сделает это.
Function ThreeNumbers() As Variant Dim NumberValue(1 To 3) NumberValue(1) = 1 NumberValue(2) = 2 NumberValue(3) = 3 ThreeNumbers = NumberValue End Function
В приведенном выше коде мы указали функцию ThreeNumbers в качестве варианта. Это позволяет ему содержать массив значений.
Переменная NumberValue объявлена как массив из 3 элементов. Он содержит три значения и присваивает его функции «Три числа».
Вы можете использовать эту функцию на рабочем листе. Введите эту функцию и нажмите клавиши Control + Shift + Enter (удерживайте клавиши Control и Shift и затем нажмите Enter).
Когда вы сделаете это, он вернет 1 в ячейке, но в действительности он содержит все три значения. Чтобы проверить это, используйте следующую формулу:
= MAX (ThreeNumbers ())
Используйте вышеуказанную функцию с Control + Shift + Enter. Вы заметите, что теперь результат равен 3, так как это самые большие значения в массиве, возвращаемом функцией Max, которая получает три числа в результате нашей пользовательской функции — ThreeNumbers.
Вы можете использовать ту же технику для создания функции, которая возвращает массив названий месяцев, как показано в приведенном ниже коде:
Function Months() As Variant Dim MonthName(1 To 12) MonthName(1) = "Январь" MonthName(2) = "Февраль" MonthName(3) = "Март" MonthName(4) = "Апрель" MonthName(5) = "Май" MonthName(6) = "Июнь" MonthName(7) = "Июль" MonthName(8) = "Август" MonthName(9) = "Сентябрь" MonthName(10) = "Октябрь" MonthName(11) = "Ноябрь" MonthName(12) = "Декабрь" Months = MonthName End Function
Теперь, когда вы введете функцию = Months () на листе Excel и используете Control + Shift + Enter, она вернет весь массив названий месяцев. Обратите внимание, что вы видите только январь в ячейке, поскольку это первое значение в массиве. Это не означает, что массив возвращает только одно значение.
Чтобы показать вам тот факт, что он возвращает все значения, сделайте это — выберите ячейку с формулой, перейдите на панель формул, выберите всю формулу и нажмите F9. Это покажет вам все значения, которые возвращает функция.
Вы можете использовать это, используя приведенную ниже формулу INDEX, чтобы получить список всех названий месяцев за один раз.
=INDEX(Months(),ROW())
Теперь, если у вас много значений, не рекомендуется назначать эти значения одно за другим (как мы делали выше). Вместо этого вы можете использовать функцию Array в VBA.
Поэтому тот же код, в котором мы создаем функцию «Месяцы», станет короче, как показано ниже:
Function Months() As Variant Months = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", _ "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь") End Function
Вышеупомянутая функция использует функцию Array для назначения значений непосредственно этой функции.
Обратите внимание, что все функции, созданные выше, возвращают горизонтальный массив значений. Это означает, что если вы выберете 12 горизонтальных ячеек (скажем, A1: L1) и введете формулу = Months () в ячейку A1, вы получите все названия месяцев.
Но что, если вы хотите эти значения в вертикальном диапазоне ячеек.
Вы можете сделать это, используя формулу TRANSPOSE на листе.
Просто выберите 12 вертикальных ячеек (смежные) и введите приведенную ниже формулу.
Функция может иметь две области действия — Public или Private.
- Общая область означает, что функция доступна для всех листов в рабочей книге, а также для всех процедур (вспомогательных и функциональных) во всех модулях в рабочей книге. Это полезно, когда вы хотите вызвать функцию из подпрограммы (мы увидим, как это делается в следующем разделе).
- Частная область означает, что функция доступна только в том модуле, в котором она существует. Вы не можете использовать его в других модулях. Вы также не увидите его в списке функций на рабочем листе. Например, если имя вашей функции — «Месяцы ()», и вы вводите функцию в Excel (после знака =), она не будет отображать вам имя функции. Однако вы все равно можете использовать его, если вводите название формулы
Если вы ничего не указали, функция по умолчанию является публичной.
Ниже приведена функция, которая является частной функцией:
Private Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Вы можете использовать эту функцию в подпрограммах и процедурах в тех же модулях, но не можете использовать ее в других модулях. Эта функция также не будет отображаться на листе.
Приведенный ниже код сделает эту функцию публичной. Это также будет отображаться на листе.
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Различные способы использования пользовательской функции в Excel
Создав пользовательскую функцию в VBA, вы можете использовать ее по-разному.
Давайте сначала рассмотрим, как использовать функции на листе.
Использование пользовательских функций в рабочих листах
Мы уже видели примеры использования функции, созданной в VBA, на листе.
Все, что вам нужно сделать, это ввести имя функции, и оно отобразится в intellisense.
Обратите внимание, что для того, чтобы функция отображалась на рабочем листе, она должна быть функцией Public (как описано в разделе выше).
Вы также можете использовать диалоговое окно «Вставить функцию» для вставки пользовательской функции (используя шаги ниже). Это будет работать только для публичных функций.
- Перейдите на вкладку «Данные».
- Нажмите «Вставить функцию».
- В диалоговом окне «Вставка функции» выберите «Определено пользователем» в качестве категории. Эта опция отображается только тогда, когда у вас есть функция в редакторе VB (и функция Public).
- Выберите функцию из списка всех общедоступных пользовательских функций.
- Нажмите кнопку ОК
Вышеуказанные шаги вставят функцию в лист. Он также отображает диалоговое окно «Аргументы функции», которое предоставит вам подробную информацию об аргументах и результате.
Вы можете использовать пользовательскую функцию, как и любую другую функцию в Excel. Это также означает, что вы можете использовать его с другими встроенными функциями Excel. Например. приведенная ниже формула даст название рабочей книги в верхнем регистре:
=UPPER(WorkbookName())
Использование пользовательских функций в процедурах и функциях VBA
Когда вы создали функцию, вы можете использовать ее и в других подпроцедурах.
Если функция Public, она может использоваться в любой процедуре в том же или другом модуле. Если это Private, его можно использовать только в том же модуле.
Ниже приведена функция, которая возвращает имя рабочей книги.
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Приведенная ниже процедура вызывает функцию, а затем отображает имя в окне сообщения.
Sub ShowWorkbookName() MsgBox WorkbookName End Sub
Вы также можете вызвать функцию из другой функции.
В приведенных ниже кодах первый код возвращает имя рабочей книги, а второй возвращает имя в верхнем регистре, вызывая первую функцию.
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Function WorkbookNameinUpper() WorkbookNameinUpper = UCase(WorkbookName) End Function
Вызов пользовательской функции из других книг
Если у вас есть функция в рабочей книге, вы можете вызвать эту функцию и в других рабочих книгах.
Есть несколько способов сделать это:
- Создание надстройки
- Функция сохранения в персональной макрокоманде
- Ссылка на функцию из другой рабочей книги.
Создание надстройки
Создав и установив надстройку, вы получите настраиваемую функцию, доступную во всех книгах.
Предположим, вы создали пользовательскую функцию — «GetNumeric» и хотите, чтобы она была во всех книгах. Для этого создайте новую рабочую книгу и поместите код функции в модуль этой новой рабочей книги.
Теперь следуйте инструкциям ниже, чтобы сохранить его как надстройку, а затем установить его в Excel.
- Перейдите на вкладку «Файл» и нажмите «Сохранить как».
- В диалоговом окне «Сохранить как» измените тип «Сохранить как» на .xlam. Имя, которое вы назначаете файлу, будет именем вашей надстройки. В этом примере файл сохраняется с именем GetNumeric.
- Вы заметите, что путь к файлу, в котором он сохраняется, автоматически изменяется. Вы можете использовать по умолчанию или изменить его, если хотите.
- Откройте новую книгу Excel и перейдите на вкладку Разработчик.
- Выберите параметр «Надстройки Excel».
- В диалоговом окне «Надстройки» найдите и найдите сохраненный файл и нажмите «ОК».
Теперь надстройка была активирована.
Теперь вы можете использовать пользовательские функции во всех книгах.
Сохранение функции в персональной книге макросов
Персональная книга макросов — это скрытая рабочая книга в вашей системе, которая открывается при каждом запуске приложения Excel.
Это место, где вы можете хранить макросы и получать к ним доступ из любой книги. Это отличное место для хранения тех макросов, которые вы хотите часто использовать.
По умолчанию в вашем Excel нет личной книги макросов. Вам необходимо создать его, записав макрос и сохранив его в личной книге макросов.
Ссылка на функцию из другой книги
Хотя первые два метода (создание надстройки и использование личной рабочей книги макроса) будут работать во всех ситуациях, если вы хотите сослаться на функцию из другой рабочей книги, эта рабочая книга должна быть открыта.
Предположим, у вас есть рабочая книга с именем «Рабочая тетрадь с формулой», и она имеет функцию с именем «GetNumeric».
Чтобы использовать эту функцию в другой рабочей книге (когда рабочая книга с формулой открыта), вы можете использовать следующую формулу:
=’Workbook with Formula’!GetNumeric(A1)
Приведенная выше формула будет использовать пользовательскую функцию в файле Workbook with Formula и даст вам результат.
Обратите внимание: поскольку в имени книги есть пробелы, его необходимо заключить в одинарные кавычки.
Использование оператора выхода из VBA
Если вы хотите выйти из функции во время выполнения кода, вы можете сделать это с помощью оператора «Выход из функции».
Приведенный ниже код извлекает первые три числовых символа из буквенно-цифровой текстовой строки. Как только он получает три символа, функция завершается и возвращает результат.
Function GetNumericFirstThree(CellRef As Range) As Long Dim StringLength As Integer StringLength = Len(CellRef) For i = 1 To StringLength If J = 3 Then Exit Function If IsNumeric(Mid(CellRef, i, 1)) Then J = J + 1 Result = Result & Mid(CellRef, i, 1) GetNumericFirstThree = Result End If Next i End Function
Вышеприведенная функция проверяет количество числовых символов, и когда она получает 3 числовых символа, она выходит из функции в следующем цикле.
Отладка пользовательской функции
Есть несколько методов, которые вы можете использовать при отладке пользовательской функции в VBA:
Отладка пользовательской функции с помощью окна сообщения
Используйте функцию MsgBox, чтобы показать окно сообщения с определенным значением.
Отображаемое значение может быть основано на том, что вы хотите проверить. Например, если вы хотите проверить, выполняется ли код или нет, будет работать любое сообщение, и если вы хотите проверить, работают ли циклы или нет, вы можете отобразить определенное значение или счетчик цикла.
Отладка пользовательской функции путем установки точки останова
Установите точку останова, чтобы иметь возможность проходить шаг за шагом по каждой строке. Чтобы установить точку останова, выберите нужную строку и нажмите F9 или нажмите на серую вертикальную область, которая слева от строк кода. Любой из этих методов вставил бы точку останова (вы увидите красную точку в серой области).
Как только вы установили точку останова и выполнили функцию, она идет до линии точки останова и затем останавливается. Теперь вы можете просмотреть код с помощью клавиши F8. Нажмите F8 один раз, чтобы перейти к следующей строке в коде.
Отладка пользовательской функции с помощью Debug.Print в коде
Вы можете использовать оператор Debug.Print в своем коде, чтобы получить значения указанных переменных / аргументов в непосредственном окне.
Например, в приведенном ниже коде я использовал Debug.Print, чтобы получить значение двух переменных — «j» и «Result».
Function GetNumericFirstThree(CellRef As Range) As Long Dim StringLength As Integer StringLength = Len(CellRef) For i = 1 To StringLength If J = 3 Then Exit Function If IsNumeric(Mid(CellRef, i, 1)) Then J = J + 1 Result = Result & Mid(CellRef, i, 1) Debug.Print J, Result GetNumericFirstThree = Result End If Next i End Function
Когда этот код выполняется, он показывает следующее в immediate window.
Встроенные функции Excel против Пользовательской функции VBA
Есть несколько сильных преимуществ использования встроенных функций Excel по сравнению с пользовательскими функциями, созданными в VBA.
- Встроенные функции работают намного быстрее, чем функции VBA.
- Когда вы создаете отчет / панель мониторинга с использованием функций VBA и отправляете его клиенту / коллеге, им не нужно беспокоиться о том, включены макросы или нет. В некоторых случаях клиенты / клиенты пугаются, увидев предупреждение в желтой полосе (которое просто просит их включить макросы).
- Благодаря встроенным функциям Excel вам не нужно беспокоиться о расширениях файлов. Если у вас есть макросы или пользовательские функции в рабочей книге, вам нужно сохранить их в формате .xlsm
Хотя существует множество веских причин для использования встроенных функций Excel, в некоторых случаях лучше использовать пользовательскую функцию.
- Лучше использовать пользовательскую функцию, если ваша встроенная формула огромна и сложна. Это становится еще более актуальным, когда вам нужен кто-то еще, чтобы обновить формулы. Например, если у вас есть огромная формула, состоящая из множества различных функций, даже изменение ссылки на ячейку может быть утомительным и подверженным ошибкам. Вместо этого вы можете создать пользовательскую функцию, которая принимает только один или два аргумента и выполняет всю тяжелую работу с бэкэндом.
- Когда вам нужно что-то сделать, что не может быть сделано встроенными функциями Excel. Примером этого может быть случай, когда вы хотите извлечь все числовые символы из строки. В таких случаях польза от использования пользовательской функции gar перевешивает ее недостатки.
Где разместить код VBA для пользовательской функции
При создании пользовательской функции необходимо поместить код в окно кода для книги, в которой вы хотите использовать функцию.
Ниже приведены инструкции по размещению кода для функции «GetNumeric» в книге.
- Перейдите на вкладку Разработчик.
- Нажмите на Visual Basic. Это откроет редактор VB в бэкэнде.
- На панели Project Explorer в редакторе VB щелкните правой кнопкой мыши любой объект для книги, в которую вы хотите вставить код. Если вы не видите Project Explorer, перейдите на вкладку View и щелкните Project Explorer.
- Перейти к Вставить и нажмите на модуль. Это вставит объект модуля для вашей книги.
- Скопируйте и вставьте код в окно модуля.
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Еще…Меньше
Хотя в Excel предлагается большое число встроенных функций, в нем может не быть той функции, которая нужна для ваших вычислений. К сожалению, разработчики Excel не могли предугадать все потребности пользователей. Однако в Excel можно создавать собственные функции, и ниже вы найдете все нужные для этого инструкции.
Пользовательские функции (как и макросы) записываются на языке программирования Visual Basic для приложений (VBA). Они отличаются от макросов двумя вещами. Во-первых, в них используются процедуры Function, а не Sub. Это значит, что они начинаются с оператора Function, а не Sub, и заканчиваются оператором End Function, а не End Sub. Во-вторых, они выполняют различные вычисления, а не действия. Некоторые операторы (например, предназначенные для выбора и форматирования диапазонов) исключаются из пользовательских функций. Из этой статьи вы узнаете, как создавать и применять пользовательские функции. Для создания функций и макросов используется редактор Visual Basic (VBE), который открывается в отдельном окне.
Предположим, что ваша компания предоставляет скидку в размере 10 % клиентам, заказавшим более 100 единиц товара. Ниже мы объясним, как создать функцию для расчета такой скидки.
В примере ниже показана форма заказа, в которой перечислены товары, их количество и цена, скидка (если она предоставляется) и итоговая стоимость.
Чтобы создать пользовательскую функцию DISCOUNT в этой книге, сделайте следующее:
-
Нажмите клавиши ALT+F11 (или FN+ALT+F11 на Mac), чтобы открыть редактор Visual Basic, а затем щелкните Insert (Вставка) > Module (Модуль). В правой части редактора Visual Basic появится окно нового модуля.
-
Скопируйте указанный ниже код и вставьте его в новый модуль.
Function DISCOUNT(quantity, price) If quantity >=100 Then DISCOUNT = quantity * price * 0.1 Else DISCOUNT = 0 End If DISCOUNT = Application.Round(Discount, 2) End Function
Примечание: Чтобы код было более удобно читать, можно добавлять отступы строк с помощью клавиши TAB. Отступы необязательны и не влияют на выполнение кода. Если добавить отступ, редактор Visual Basic автоматически вставит его и для следующей строки. Чтобы сдвинуть строку на один знак табуляции влево, нажмите SHIFT+TAB.
Теперь вы готовы использовать новую функцию DISCOUNT. Закройте редактор Visual Basic, выделите ячейку G7 и введите следующий код:
=DISCOUNT(D7;E7)
Excel вычислит 10%-ю скидку для 200 единиц по цене 47,50 ₽ и вернет 950,00 ₽.
В первой строке кода VBA функция DISCOUNT(quantity, price) указывает, что функции DISCOUNT требуется два аргумента: quantity (количество) и price (цена). При вызове функции в ячейке листа необходимо указать эти два аргумента. В формуле =DISCOUNT(D7;E7) аргумент quantity имеет значение D7, а аргумент price — значение E7. Если скопировать формулу в ячейки G8:G13, вы получите указанные ниже результаты.
Рассмотрим, как Excel обрабатывает эту функцию. При нажатии клавиши ВВОД Excel ищет имя DISCOUNT в текущей книге и определяет, что это пользовательская функция в модуле VBA. Имена аргументов, заключенные в скобки (quantity и price), представляют собой заполнители для значений, на основе которых вычисляется скидка.
Оператор If в следующем блоке кода проверяет аргумент quantity и сравнивает количество проданных товаров со значением 100:
If quantity >= 100 Then DISCOUNT = quantity * price * 0.1 Else DISCOUNT = 0 End If
Если количество проданных товаров не меньше 100, VBA выполняет следующую инструкцию, которая перемножает значения quantity и price, а затем умножает результат на 0,1:
Discount = quantity * price * 0.1
Результат хранится в виде переменной Discount. Оператор VBA, который хранит значение в переменной, называется оператором назначения, так как он вычисляет выражение справа от знака равенства и назначает результат имени переменной слева от него. Так как переменная Discount называется так же, как и процедура функции, значение, хранящееся в переменной, возвращается в формулу листа, из которой была вызвана функция DISCOUNT.
Если значение quantity меньше 100, VBA выполняет следующий оператор:
Discount = 0
Наконец, следующий оператор округляет значение, назначенное переменной Discount, до двух дробных разрядов:
Discount = Application.Round(Discount, 2)
В VBA нет функции округления, но она есть в Excel. Чтобы использовать округление в этом операторе, необходимо указать VBA, что метод (функцию) Round следует искать в объекте Application (Excel). Для этого добавьте слово Application перед словом Round. Используйте этот синтаксис каждый раз, когда нужно получить доступ к функции Excel из модуля VBA.
Пользовательские функции должны начинаться с оператора Function и заканчиваться оператором End Function. Помимо названия функции, оператор Function обычно включает один или несколько аргументов. Однако вы можете создать функцию без аргументов. В Excel доступно несколько встроенных функций (например, СЛЧИС и ТДАТА), в которых нет аргументов.
После оператора Function указывается один или несколько операторов VBA, которые проверят соответствия условиям и выполняют вычисления с использованием аргументов, переданных функции. Наконец, в процедуру функции следует включить оператор, назначающий значение переменной с тем же именем, что у функции. Это значение возвращается в формулу, которая вызывает функцию.
Количество ключевых слов VBA, которые можно использовать в пользовательских функциях, меньше числа, используемого в макросах. Настраиваемые функции не могут выполнять другие задачи, кроме возврата значения в формулу на этом или в выражение, используемом в другом макросе или функции VBA. Например, пользовательские функции не могут изменять размер окна, редактировать формулу в ячейке, а также изменять шрифт, цвет или узор текста в ячейке. Если в процедуру функции включить такой код действия, функция возвращает #VALUE! ошибку «#ВЫЧИС!».
Единственное действие, которое может выполнять процедура функции (кроме вычислений), — это отображение диалогового окна. Чтобы получить значение от пользователя, выполняющего функцию, можно использовать в ней оператор InputBox. Кроме того, с помощью оператора MsgBox можно выводить сведения для пользователей. Вы также можете использовать настраиваемые диалоговые окна (UserForms), но эта тема выходит за рамки данной статьи.
Даже простые макросы и пользовательские функции может быть сложно понять. Чтобы сделать эту задачу проще, добавьте комментарии с пояснениями. Для этого нужно ввести перед текстом апостроф. Например, ниже показана функция DISCOUNT с комментариями. Благодаря подобным комментариями и вам, и другим будет впоследствии проще работать с кодом VBA. Так, код будет легче понять, если потребуется внести в него изменения.
Апостроф указывает приложению Excel на то, что следует игнорировать всю строку справа от него, поэтому вы можете добавлять комментарии в отдельных строках или в правой части строк, содержащих код VBA. Советуем начинать длинный блок кода с комментария, в котором объясняется его назначение, а затем использовать встроенные комментарии для документирования отдельных операторов.
Кроме того, рекомендуется присваивать макросам и пользовательским функциям описательные имена. Например, присвойте макросу название MonthLabels вместо Labels, чтобы более точно указать его назначение. Описательные имена макросов и пользовательских функций особенно полезны, если существует множество процедур с похожим назначением.
То, как документировать макрос и пользовательские функции, имеет личный выбор. Важно принятия определенного способа документации и его согласованного использования.
Для использования настраиваемой функции должна быть открыта книга, содержащая модуль, в котором она была создана. Если книга не открыта, вы получите #NAME? при попытке использования функции. Если вы ссылались на функцию в другой книге, ее имя должно предшествовать названию книги, в которой она находится. Например, при создании функции DISCOUNT в книге Personal.xlsb и вызове ее из другой книги необходимо ввести =personal.xlsb!discount(),а не просто =discount().
Чтобы вставить пользовательскую функцию быстрее (и избежать ошибок), ее можно выбрать в диалоговом окне «Вставка функции». Пользовательские функции доступны в категории «Определенные пользователем»:
Чтобы пользовательские функции всегда были доступны, можно хранить их в отдельной книге, а затем сохранять в качестве надстройки. Затем надстройку можно сделать доступной при запуске Excel. Вот как это сделать:
-
Создав нужные функции, выберите Файл > Сохранить как.
В Excel 2007 нажмите кнопку Microsoft Office, а затем щелкните Сохранить как.
-
В диалоговом окне Сохранить как откройте раскрывающийся список Тип файла и выберите значение Надстройка Excel. Сохраните книгу с запоминающимся именем, таким как MyFunctions, в папке AddIns. Она будет автоматически предложена в диалоговом окне Сохранить как, поэтому вам потребуется только принять расположение, используемое по умолчанию.
-
Сохранив книгу, выберите Файл > Параметры Excel.
В Excel 2007 нажмите кнопку Microsoft Office и щелкните Параметры Excel.
-
В диалоговом окне Параметры Excel выберите категорию Надстройки.
-
В раскрывающемся списке Управление выберите Надстройки Excel. Затем нажмите кнопку Перейти.
-
В диалоговом окне Надстройки установите флажок рядом с именем книги, как показано ниже.
-
Создав нужные функции, выберите Файл > Сохранить как.
-
В диалоговом окне Сохранить как откройте раскрывающийся список Тип файла и выберите значение Надстройка Excel. Сохраните книгу с запоминающимся именем, таким как MyFunctions.
-
Сохранив книгу, выберите Сервис > Надстройки Excel.
-
В диалоговом окне Надстройки нажмите кнопку «Обзор», найдите свою надстройку, нажмите кнопку Открыть, а затем установите флажок рядом с надстройкой в поле Доступные надстройки.
После этого пользовательские функции будут доступны при каждом запуске Excel. Если вы хотите добавить его в библиотеку функций, вернимся в Visual Basic редактора. Если вы заглянуть в Visual Basic редактора Project проводника под заголовком VBAProject, вы увидите модуль с именем файла надстройки. У надстройки будет расширение XLAM.
Дважды щелкните модуль в Project Explorer, чтобы вывести код функций. Чтобы добавить новую функцию, установите точку вставки после оператора End Function, который завершает последнюю функцию в окне кода, и начните ввод. Вы можете создать любое количество функций, и они будут всегда доступны в категории «Определенные пользователем» диалогового окна Вставка функции.
Эта статья основана на главе книги Microsoft Office Excel 2007 Inside Out, написанной Марком Доджем (Mark Dodge) и Крейгом Стинсоном (Craig Stinson). В нее были добавлены сведения, относящиеся к более поздним версиям Excel.
Дополнительные сведения
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Нужна дополнительная помощь?
Процедуры «Function» и «Sub» в VBA
Встроенные функции VBA
Смотрите такжеПараметры и запустил выполнение на языке VBA)Функции работы с объектамиФункции обработки строк * 100, аIf x>0 Then Cells(1,Do While x1 <
иконку рядом сДля многомерных массивовTrue
- равноПеревел: Антон Андронов, доступную из рабочего при помощи простогоByRefПеред тем, как приступить(Options) тех же действий
- хранятся в программныхGetObjectUCase в сумме — 1).Value = 1
- x2 (цикл будет иконкой Excel; в качестве необязательного, если заданное значениеTrueАвтор: Антон Андронов листа: присваивания этой процедурыв объявлении процедуры к созданию собственных
позволяет посмотреть и еще раз. Естественно модулях. В любойФункции работы с объектамиФункции обработки строк (F – P).
Пользовательские процедуры «Function» и «Sub» в VBA
If x=0 Then Cells(1, выполняться пока верновыбирают команду Mudule; аргумента может быть является датой, или.При написании кода VBAНажмите переменной. В следующем можно задать, каким функций VBA, полезно отредактировать сочетание клавиш у такого способа книге Excel мыIsObjectValРезультаты этих вычислений можно 1).Value = 0
выражение x1 <сохраняют, нажав на иконку указано, индекс какогоFalseВ приведённой выше таблице в Excel наборAlt+F8 примере показано обращение именно способом аргумент знать, что Excel для быстрого запуска есть свои плюсы можем создать любоеФункции работы с объектамиФункции обработки строк
Аргументы
лучше всего сразуIf x x2) с изображением floppy именно измерения нужо– если датой перечислены не все встроенных операторов используют(нажмите клавишу к процедуре передаётся процедуре. Ниже VBA располагает обширной макроса. и минусы: количество программных модулей
DDBCBool внести в соответствующие
End Sub.y=x1 + x1^2 + disk; возвратить. Если не не является. логические операторы, доступные на каждом шагу.AltSumMinus это показано на
Необязательные аргументы
коллекцией готовых встроенныхКнопкаМакрорекордер записывает только те и разместить тамФинансовые функцииФункции преобразования типа данных ячейки таблицы «Эксель».Остается запустить макрос и 3*x1^3 – Cos(x1)
пишут, скажем так, набросок указано, то поПример: в VBA. Полный Эти операторы делятся
и, удерживая её, которая была определена примерах:
функций, которые можноИзменить действия, которые выполняются наши макросы. ОдинFV
CByteДля итогов по факту получить в «Эксель»Cells(i, 1).Value = x1 кода.
Передача аргументов по значению и по ссылке
умолчанию равно 1.IsDate(«01/01/2015») список логических операторов
- на математические, строковые, нажатой, нажмите клавишу выше.Sub AddToCells(ByVal i As использовать при написании(Edit) в пределах окна модуль может содержатьФинансовые функцииФункции преобразования типа данных и прогнозу получают нужное значение для
- (значение x1 записываетсяОн выглядит следующим образом:Yearвозвращает можно найти на операторы сравнения иF8Sub main() Dim Integer) … End кода.открывает редактор Visual
Microsoft Excel. Как любое количество макросов.IPmtCCur по формулам ItogP=ItogP аргумента. в ячейку сSub program ()Возвращает целое число, соответствующееTrue
сайте Visual Basic логические. Далее мы). | total as Double SubСписок этих функций можно Basic (см. выше) только вы закрываете Доступ ко всемФинансовые функцииФункции преобразования типа данных + P иКак вы уже могли |
координатами (i,1))’Наш код году в заданной | ; Developer Center. подробно рассмотрим каждуюВ появившемся списке макросов total = SumMinus(5,В этом случае целочисленный посмотреть в редакторе и позволяет просмотреть Excel или переключаетесь модулям осуществляется сIRRCDate ItogF=ItogF+ F. заметить, программировать в |
Cells(i, 2).Value = yEnd Sub дате.Пример:IsDate(100)В VBA доступно множество группу операторов. выберите тот, который 4, 3) End аргумент VBA: и отредактировать текст
в другую программу помощью окна ProjectФинансовые функцииФункции преобразования типа данныхДля отклонений используют = самом известном табличном (значение y записываетсяОбратите внимание, что строкаYear(«29/01/2015»)возвращает встроенных функций, которыеОсновные математические операторы VBA хотите запустить. SubiОткройте рабочую книгу Excel макроса на VBA.
VBA процедура «Function»
— запись останавливается. Explorer в левомMIRRCDbl (ItogF – ItogP) процессоре Microsoft не
в ячейку с «’Наш код» будет
возвращает значение 2015.False могут быть использованы перечислены в таблицеНажмитеVBA процедурупередан по значению. и запустите редактор
- Чтобы не запоминать сочетаниеМакрорекордер может записать только верхнем углу редактораФинансовые функцииФункции преобразования типа данных
- / ItogP * так уж сложно. координатами (i,2)) выделена другим цветомДанный список включает в. при написании кода. ниже.ВыполнитьFunction После выхода из VBA (нажмите для
клавиш для запуска те действия, для
Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
(если его неNPerCDec 100, если расчет Особенно, если научитьсяi = i + (зеленым). Причина в себя только избранныеIsError Ниже перечислены некоторыеВ правом столбце таблицы(Run)можно вызвать из процедуры этого
макроса, лучше создать которых есть команды видно, нажмите CTRL+R).Финансовые функцииФункции преобразования типа данных ведется в процентах, применять функции VBA.
1 (действует счетчик); апострофе, поставленном в наиболее часто употребляемыеВозвращает из наиболее часто указан приоритет операторов,Чтобы выполнять процедуру рабочего листа ExcelSubAlt+F11 кнопку и назначить меню или кнопки Программные модули бываютNPVCInt а в случае Всего в этомx1 = x1 + начале строки, который встроенные функции ExcelTrue
Вызов VBA процедуры «Function»
используемых: принятый по умолчаниюSub таким же образом,все сделанные с), и затем нажмите ей нужный макрос. в Excel. Программист нескольких типов дляФинансовые функцииФункции преобразования типа данных
Вызов VBA процедуры «Function» из другой процедуры
суммарной величины — языке программирования, созданном shag (аргумент изменяется обозначает, что далее Visual Basic. Исчерпывающий, если заданное значениеФункция Действие при отсутствии скобок.быстро и легко, как любую другуюiF2
Кнопка может быть же может написать разных ситуаций:PmtCLgn
Вызов VBA процедуры «Function» из рабочего листа
(ItogF – ItogP). специально для написания на величину шага); следует комментарий. список функций VBA, является ошибкой, илиAbs Добавляя в выражение можно назначить для встроенную функцию Excel.изменения будут утрачены.. нескольких типов: макрос, который делаетОбычные модулиФинансовые функции
Функции преобразования типа данных
VBA процедура «Sub»
Результаты опять же сразу приложений в «Эксель»LoopТеперь вы можете написать доступных для использованияFalseВозвращает абсолютную величину заданного
скобки, можно изменять неё комбинацию клавиш.
VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
Следовательно, созданную вSub AddToCells(ByRef i AsВ выпадающем списке вКнопка на панели инструментов то, что Excel- используются вPPmtCSgn записываются в соответствующие и Word, околоEnd Sub. любой код и
в макросах Excel,– если ошибкой числа. порядок выполнения операторов Для этого: предыдущем примере процедуру
Integer) … End верхней левой части в Excel 2003 никогда не умел
большинстве случаев, когдаФинансовые функцииФункции преобразования типа данных ячейки, поэтому нет 160 функций. ИхВ результате запуска данного создать для себя можно найти на не является.Пример: VBA по своемуНажмитеFunction Sub экрана выберите библиотеку и старше (сортировку по цвету, речь идет оPV
VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
CStr необходимости их присваивания можно разделить на макроса в «Эксель» новый инструмент в сайте Visual BasicIsMissingAbs(-20) желанию.Alt+F8–
В этом случае целочисленныйVBAОткройте меню например или что-то макросах. Для создания
Вызов процедуры «Sub» в Excel VBA
Вызов VBA процедуры «Sub» из другой процедуры
Финансовые функцииФункции преобразования типа данных переменным. несколько больших групп. получаем два столбца, VBA Excel (примеры Developer Center.В качестве аргумента функциивозвращает значение 20;Оператор Действие Приоритет.SumMinus
аргумент.
Сервис — Настройка подобное). такого модуля выберитеRateCVarПеред запуском созданной программы,
Это: в первом из программ см. далее).
Вызов VBA процедуры «Sub» из рабочего листа
Урок подготовлен для Вас передаётся имя необязательногоAbs(20)(1 — высший;В появившемся списке макросовможно вызвать, введяiПоявится список встроенных классов(Tools — Customize)Если во время записи в менюФинансовые функцииФункции преобразования типа данных требуется сохранить рабочуюМатематические функции. Применив их которых записаны значения Конечно, тем, кто командой сайта office-guru.ru аргумента процедуры.возвращает значение 20. 5 — низший) выберите тот, которому в ячейку рабочегопередан по ссылке. и функций VBA.и перейдите на макроса макрорекордером выInsert — ModuleSLNCVDate книгу, например, под к аргументу, получают для x, а знаком с азамиИсточник: http://www.excelfunctions.net/VBA-Operators-And-Functions.htmlIsMissing
Chr^ хотите назначить сочетание листа вот такое После выхода из
- Кликните мышью по вкладку ошиблись — ошибка. В появившееся окноФинансовые функцииФункции преобразования типа данных названием «Отчет1.xls». значение косинуса, натурального
- во втором — Visual Basic, будетПеревел: Антон Андронов
- возвращаетВозвращает символ ANSI, соответствующийОператор возведения в степень
клавиш. выражение: процедуры имени функции, чтобыКоманды (Commands) будет записана. Однако
- нового пустого модуляSYDChoose
- Клавишу «Создать отчетную таблицу» логарифма, целой части для y. намного проще. Однако
- Автор: Антон АндроновTrue числовому значению параметра.1Нажмите
- =SumMinus(10, 5, 2)Sub внизу окна отобразилось. В категории смело можете давить можно вводить команды
Финансовые функцииФункции загрузки данных требуется нажать всего и пр.Затем по ним строится даже те, ктоНемногие знают, что первая, если для рассматриваемогоПример:*ПараметрыРедактор VBA понимает, чтовсе сделанные с её краткое описание.
Область действия процедуры VBA
Макросы на кнопку отмены на VBA, набираяFormatIIf 1 раз послеФинансовые функции. Благодаря их график способом, стандартным их не имеет, версия популярного продукта аргумента процедуры неChr(10)
Оператор умножения(Options) и в перед ним процедура | i Нажатиелегко найти веселый последнего действия (Undo) их с клавиатурыФункции форматированияФункции загрузки данных |
ввода заголовочной информации. наличию и используя для «Эксель». | при желании смогут Microsoft Excel появилась передано значение.возвращает перенос строки;2 появившемся диалоговом окнеSubизменения будут сохраненыF1 желтый «колобок» - — во время |
или копируя ихFormatCurrencyInputBox Следует знать и программирование в Excel,Для реализации циклов в освоиться достаточно быстро. в 1985 году.IsNumericChr(97)/ введите сочетание клавиш., когда встречает группу в переменной, котораяоткроет страницу онлайн-справкиНастраиваемую кнопку записи макроса макрорекордером из другого модуля,Функции форматированияФункции загрузки данных
Ранний выход из VBA процедур «Function» и «Sub»
другие правила. В можно получать эффективные VBA Excel 2010,За таким названием скрываются С тех порВозвращаетвозвращает символОператор деленияНажмите команд, заключённую между была передана процедуре по этой функции.(Custom button) она не просто с этого сайтаFormatDateTimeLoadPicture частности, кнопка «Добавить инструменты для ведения как и в программы, написанные на он пережил несколькоTruea2ОК вот такими открывающимSubКроме того, полный список
: возрвращает Вас в или еще откудаФункции форматирования
Функции загрузки данных строку» должна нажиматься бухгалтерского учета и других версиях, наряду языке Visual Basic модификаций и востребован, если заданное значение.и закройте диалоговое и закрывающим операторами:.
встроенных функций VBAПеретащите ее к себе
предыдущее состояние, но
нибудь:
FormatNumber
office-guru.ru
Операторы и встроенные функции VBA
Операторы Excel VBA
LoadResData каждый раз после осуществления финансовых расчетов. с уже приведенной for Application. Таким у миллионов пользователей может быть рассмотреноDateОператор деления без остатка окно
Математические операторы
Sub … EndПомните, что аргументы в с примерами можно
на панель инструментов и стирает последнююМодуль Эта книгаФункции форматированияФункции загрузки данных ввода в таблицуФункции обработки массивов. К конструкцией Do While образом, программирование в
по всему миру.
как число, вВозвращает текущую системную дату.
– возвращает результат | Макрос | Sub |
VBA по умолчанию | найти на сайте | и затем щелкните |
записанную команду на | - также виден | FormatPercent |
LoadResPicture | значений по каждому ним относятся Array, используется For. Excel — это При этом многие противном случае возвращаетDateAdd | деления двух чисел |
(Macro). | Рассмотрим пример простой VBA передаются по ссылке. Visual Basic Developer по ней правой VBA. в левом верхнемФункции форматированияФункции загрузки данных | виду деятельности. После |
IsArray; LBound; UBound. | Рассмотрим программу, которая создаст | создание макросов с |
работают лишь с | False | Добавляет определённый временной интервал |
Строковые операторы
без остатка. Например,Внимание: процедуры Иначе говоря, если Centre.
кнопкой мыши. В
Чтобы включить запись необходимо: | углу редактора VisualObjPtrLoadResString занесения всех данныхФункции VBA Excel для столбец. В каждой |
Операторы сравнения
нужным кодом. Благодаря малой толикой возможностей. к заданной дате.74Назначая сочетание клавишSub не использованы ключевыеВ Excel Visual Basic контекстом меню можно
в Excel 2003 и
Basic в окне, | Функции работы с указателями |
Функции загрузки данных | требуется нажать кнопку |
строки. Это достаточно | |
его ячейке будут | этой возможности табличный |
этого табличного процессора | |
Left | Синтаксис функции: |
Логические операторы
возвратит результат для макроса, убедитесь,, задача которой – слова набор команд, выполняющий назначить кнопке макрос, старше — выбрать которое называется Project
StrPtr
MsgBox | «Закончить» и затем многочисленная группа. В записаны квадраты номера процессор Microsoft саморазвивается, и даже неВозвращает заданное количество символовDateAdd(1 что оно не изменить форматирование выделенногоByVal определённую задачу, помещается выбрать другой значок в меню Explorer. В этотФункции работы с указателями |
Функции загрузки данных | переключиться в окно нее входят, например, соответствующей строки. Использование подстраиваясь под требования догадываются, как им от начала переданнойинтервал3 используется, как стандартное диапазона ячеек. Вили в процедуру и имя:Сервис — Макрос - модуль обычно записываютсяVarPtrCurDir «Эксель». функции Space для конструкции For позволит конкретного пользователя. Разобравшись |
могло бы облегчить | строки. Синтаксис функции,Mod в Excel (например, ячейках устанавливается выравниваниеByRefFunctionКнопка на панели быстрого Начать запись макросы, которые должныФункции работы с указателямиФункции работы с файламиТеперь вы знаете, как создания строки с записать ее очень с тем, как жизнь умение программирования |
вот такой:числоОператор модуля (остатка) –Ctrl+C по центру (и, то аргумент будет(Функция) или доступа в Excel
Встроенные функции
(Tools — Macro - выполнятся при наступленииВсем нам приходится -Dir решать задачи для числом пробелов, равных коротко, без использования
создавать модули для
в Excel. | Left(,
возвращает остаток от
|
|||||||||||||||||||||
2007 и новее | Record New Macro) каких-либо событий в
кому реже, кому
|
|||||||||||||||||||||
строка | дата | |||||||||||||||||||||
деления двух чисел. | существующее сочетание клавиш, по горизонтали) иПеред тем как продолжить
Asc для переводаСначала нужно создать макрос, приступать к рассмотрению посредством языка программирования,) Например, то оно будет размер шрифта изменяется изучение процедур между процедурами по панели быстрого новее — нажать сохранение книги, печать одни и те
Далее записываем сам
|
|||||||||||||||||||||
Запись макроса (Record macro) | Модуль листа операции в Excel.Функции работы с файлами
может понадобиться и
|
|||||||||||||||||||||
Sub | Excel и выберитена вкладке- доступен через
Любая офисная работаFileDateTime для работы в |
|||||||||||||||||||||
и позволяют работать | нас интересуют значения самых элементарных кодов. известный табличный процессор
строка интервала, добавляемого к. |
|||||||||||||||||||||
макроса случайно. | 10) Selection.HorizontalAlignment =более подробно, будетсостоит в том, командуРазработчик (Developer) Project Explorer и предполагает некую «рутиннуюФункции работы с файлами
среде самого популярного
В части 2 данного xlCenter Selection.VerticalAlignment = полезным ещё раз что процедураНастройка панели быстрого доступаЗатем необходимо настроить параметры через контекстное меню составляющую» — одни |
|||||||||||||||||||||
FileLen | на данный момент «Эксель», создавая приложения,
Код выглядит следующим будет копировать значениеК его достоинствам специалисты |
|||||||||||||||||||||
строка, а | дате+ самоучителя обсуждалась тема xlCenter Selection.Font.Size = взглянуть на особенностиFunction (Customise Quick Access
записываемого макроса в
|
|||||||||||||||||||||
длина | в количестве, указанномОператор сложения области действия переменных iFontSize End Sub и отличия этихвозвращает результат, процедура Toolbar) | |||||||||||||||||||||
окне | кнопкой мыши по еженедельные отчеты, одниFreeFile В частности, можно с этими таблицами.For i = 1 и затем записывать освоения. Как показывает– количество возвращаемых | |||||||||||||||||||||
в аргументе | 5 и констант иДанная процедура двух типов процедур.Sub:Запись макроса ярлычку листа - | |||||||||||||||||||||
и те же | Функции работы с файлами путем записи, какФункции преобразования типа данных. to 10 Next
роль ключевых словSub Далее приведены краткие– нет.Затем в открывшемся окне: команда действия по обработке GetAttr
|
|||||||||||||||||||||
могут овладеть даже | начала строки..
Оператор вычитанияPublicвыполняет действия, но |
|||||||||||||||||||||
обсуждения процедур VBA | Поэтому, если требуется выполнить выберите категориюИмя макроса
Исходный текст (View Source) поступивших данных, заполнениеФункции работы с файлами |
|||||||||||||||||||||
начале статьи, или | значение аргумента Expression, язык, как «Повторятьоткрывают вкладку «Вид»;
пользователи, которые неПример:Аргумент5и не возвращает результат.Function действия и получитьМакросы- подойдет любое. Сюда записывают макросы, однообразных таблиц илиInput через написание кода преобразовав его в от 1 допереходят на пиктограмму «Макросы»; имеют навыков профессионального
|
|||||||||||||||||||||
В этом примере также | и какой-то результат (например,и при помощи имя на русском которые должны выполняться | |||||||||||||||||||||
бланков и т.д. | Функции работы с файлами создавать кнопки меню, | |||||||||||||||||||||
тип данных Variant. | 10 с шагомжмут на «Запись макроса»; программирования. К особенностям
возвращает строку «абвг»;может принимать одно Excel VBA –. Эти ключевые слова использован необязательный (Optional) Sub просуммировать несколько чисел), кнопки или английском языке. при наступлении определенных Использование макросов иLoc благодаря которым многиеФункции работы с датами. один».
|
|||||||||||||||||||||
это оператор конкатенации | так же можно аргументи показаны простые
то обычно используетсяДобавить (Add) Имя должно начинаться |
|||||||||||||||||||||
событий на листе | пользовательских функций позволяетФункции работы с файлами операции над текстом
Они значительно расширяют
|
|||||||||||||||||||||
Интервал Значение | & | |||||||||||||||||||||
использовать применительно к | iFontSize примеры.
процедураперенесите выбранный макрос с буквы и (изменение данных в автоматизировать эти операции,LOF можно будет осуществлять стандартные возможности «Эксель». столбец с квадратами, |
|||||||||||||||||||||
«Имя макроса» оставляют | офисных приложений.Lenyyyy(слияние): VBA процедурам: |
. Если аргументРедактор VBA распознаёт процедуруFunction в правую половину не содержать пробелов ячейках, пересчет листа, перекладывая монотонную однообразнуюФункции работы с файлами нажатием дежурных клавиш Так, функция WeekdayName например, всех нечетных
«Макрос1», а вНедостатком программы являются проблемы,
Возвращает количество символов в
год
Оператор Действие
office-guru.ru
VBA Excel: примеры программ. Макросы в Excel
Public Sub AddToCells(i AsiFontSizeFunction, а для того, окна, т.е. на и знаков препинания. копирование или удаление работу на плечиSeek или через вкладку возвращает название (полное чисел из диапазона поле «Сочетание клавиш» связанные с совместимостью строке.q& Integer) … End
Что такое VBA
не передан процедуре, когда встречает группу чтобы просто выполнить панель быстрого доступа:Сочетание клавиш листа и т.д.) Excel. Другим поводом
Функции работы с файлами «Вид» и пиктограмму или частичное) дня от 1 до вставляют, например, hh различных версий. ОниПример:кварталОператор конкатенации. К примеру, SubSub
команд, заключённую между какие-то действия (например,Кнопка на листе- будет потомОбычный макрос, введенный в для использования макросовCallByName «Макросы». недели по его 11, то пишем: (это значит, что обусловлены тем, чтоLen(«абвгдеж»)m выражениеЕсли перед объявлением процедуры, то его значение вот такими открывающим изменить форматирование группыЭтот способ подходит для использоваться для быстрого стандартный модуль выглядит
Объекты, коллекции, свойства и методы
в вашей работеФункции обработки системных параметровАвтор: Наира номеру. Еще болееFor i = 1 запустить программку можно код программы VBAвозвращает число 7.месяц«A» & «B» стоит ключевое слово по умолчанию принимается и закрывающим операторами:
ячеек), нужно выбрать любой версии Excel. запуска макроса. Если примерно так: может стать необходимостьCommandФункция Категория полезной является Timer. to 10 step будет блиц-командой «Ctrl+h»).
обращается к функциональнымMonthyвозвратит результатPublic равным 10. ОднакоFunction … End процедуру
Мы добавим кнопку забудете сочетание илиДавайте разберем приведенный выше добавить в MicrosoftФункции обработки системных параметровAbs
Он выдает число 1 Next. Нажимают Enter. возможностям, которые присутствуютВозвращает целое число, соответствующеедень годаAB, то данная процедура же, если аргумент FunctionSub запуска макроса прямо вообще его не в качестве примера Excel недостающие, но
CVErrМатематические функции секунд, которые прошлиЗдесь step — шаг.
Как начать
Теперь, когда уже запущена в новой версии месяцу в заданнойd. будет доступна для
iFontSizeКак упоминалось ранее, процедура. на рабочий лист, введете, то макрос
- макрос нужные вам функции.Функции обработки системных параметровAtn с полуночи до
- В данном случае
- запись макроса, производят продукта, но отсутствуют дате.
- деньОператоры сравнения используются для
всех модулей в
передается процедуре
Function
При помощи аргументов процедурам
как графический объект. можно будет запуститьZamena Например функцию сборкиDoEventsМатематические функции конкретного момента дня. он равен двум.
копирование содержимого какой-либо в старой. ТакжеПример:w сравнения двух чисел данном проекте VBA.Subв VBA (в VBA могут быть Для этого: через меню: данных с разныхФункции обработки системных параметров
Макросы в Excel
CosФункции для преобразования числового По умолчанию отсутствие ячейки в другую. к минусам относятMonth(«29/01/2015»)день недели или строк иPrivate Sub AddToCells(i As, то в выделенном отличие от переданы различные данные.В Excel 2003 иСервис — Макрос -Любой макрос должен начинаться листов на одинEnvironМатематические функции аргумента в разные этого слова в
Пример 1
Возвращаются на исходную и чрезмерно высокуювозвращает значение 1.ww возвращают логическое значение
Integer) … End
- диапазоне ячеек будет
- Sub
- Список аргументов указывается
- старше — откройте
Макросы — Выполнить с оператора итоговый лист, разнесенияФункции обработки системных параметровExp системы счисления. Например, цикле означает, что пиктограмму. Нажимают на открытость кода для
Midнеделя типа Sub установлен размер шрифта,), возвращает значение. Для при объявлении процедуры. панель инструментов(Tools — Macro -
Sub
- данных обратно, выводErl
- Математические функции Oct выдает в
- шаг единичный. «Запись макроса». Это изменения посторонним лицом.
Возвращает заданное количество символовhBooleanЕсли перед объявлением процедуры
заданный пользователем. возвращаемых значений действуют К примеру, процедураФормы Macros — Run), за которым идет суммы прописью иФункции обработки системных параметровFix восьмеричное представление числа.Полученные результаты нужно сохранять действие означает завершение
Тем не менее из середины переданнойчас(True или False). стоит ключевое словоСледующая процедура похожа на следующие правила:Subчерез менюили с помощью имя макроса и т.д.
ErrorМатематические функцииФункции форматирования. Важнейшей из в ячейки с программки. Microsoft Office, а строки. Синтаксис функции:
Пример 2
n Основные операторы сравненияPrivate
только что рассмотренную,Тип данных возвращаемого значенияв VBA добавляетВид — Панели инструментов кнопки список аргументов (входныхМакросФункции обработки системных параметровInt них является Format.
номером (i,1). ТогдаДалее: также IBM LotusMid(минута Excel VBA перечислены, то данная процедура но на этот должен быть объявлен
заданное целое число — Формы (ViewМакросы (Macros) значений) в скобках.- это запрограммированнаяGetAllSettingsМатематические функции
Она возвращает значение
при каждом запуске
вновь переходят на строку
Symphony позволяют пользователю
строка
s в этой таблице: будет доступна только раз, вместо изменения в заголовке процедуры
(Integer) в каждую — Toolbars -
на вкладке Если аргументов нет, последовательность действий (программа,Функции обработки системных параметров
IsNumeric типа Variant с цикла с увеличением «Макросы»;
применять шифрование начального,
секундаОператор Действие для текущего модуля.
размера, применяется полужирное
Function
ячейку в выделенном Forms)Разработчик (Developer) то скобки надо процедура), записанная наGetSettingМатематические функции выражением, отформатированным согласно
i на величинув списке выбирают «Макрос кода и установку
Пример 3
началоПример:= Её нельзя будет начертание шрифта в. диапазоне. Передать процедуре
В Excel 2007 иили нажав ALT+F8. оставить пустыми. языке программирования VisualФункции обработки системных параметровLog инструкциям, которые заданы шага автоматически будет 1»;
пароля для его,DateAdd(«d», 32, «01/01/2015»)Равно вызвать, находясь в выделенном диапазоне ячеек.Переменная, которая содержит возвращаемое это число можно
новее — откройтеСохранить в…
Любой макрос должен заканчиваться Basic for ApplicationsIMEStatusМатематические функции в описании формата.
расти и номернажимают «Выполнить» (то же просмотра.длинадобавляет 32 дня<>
любом другом модуле Это пример процедуры значение, должна быть
при помощи аргумента, выпадающий список- здесь задается оператором (VBA). Мы можемФункции обработки системных параметровRnd
и пр. у строки. Таким действие запускается начатиемИменно с этими понятиями) к дате 01/01/2015Не равно или из рабочейSub названа так же, вот так:
Вставить (Insert) место, куда будет
End Sub
запускать макрос сколькоIsEmptyМатематические функцииИзучение свойств этих функций образом, произойдет оптимизация сочетания клавиш «Ctrl+hh»).
нужно разобраться тем,где и, таким образом,Меньше книги Excel.
, которой не передаются как и процедураSub AddToCells(i Asна вкладке
сохранен текст макроса,
. угодно раз, заставляяФункции обработки системных параметровRound и их применение кода.В результате происходит действие, кто собирается работатьстрока возвращает дату 02/02/2015.>
Пример 4
Помните о том, что никакие аргументы:Function Integer) … EndРазработчик (Developer) т.е. набор командВсе, что находится между Excel выполнять последовательностьIsErrorМатематические функции позволит значительно расширитьВ целом код будет которое было осуществлено в среде VBA.– это исходнаяDateAdd(«ww», 36, «01/01/2015»)Больше
если перед объявлениемSub Format_Centered_And_Bold() Selection.HorizontalAlignment. Эту переменную не Sub на VBA из
Sub
любых нужных нам
Функции обработки системных параметров
Sgn сферу применения «Эксель». выглядеть, как: в процессе записи Прежде всего необходимо строка,
добавляет 36 недель
Меньше либо равно VBA процедуры = xlCenter Selection.VerticalAlignment нужно объявлять отдельно,Имейте в виду, что
Выберите объект которых и состоит
и действий, которые нам
IsMissing
Математические функции
Попробуем перейти к решениюSub program() макроса. понять, что такое
Функции VBA
начало к дате 01/01/2015>=Function = xlCenter Selection.Font.Bold так как она наличие аргументов дляКнопка (Button): макрос.:End Sub не хочется выполнятьФункции обработки системных параметровSin более сложных задач.For i = 1Имеет смысл увидеть, как
- объект. В Excel– позиция начала и возвращает датуБольше либо равноили
- = True End всегда существует как процедурЗатем нарисуйте кнопку наЭта книга- тело макроса, вручную.
- IsNullМатематические функции Например:
- To 10 Step выглядит код. Для в этом качестве извлекаемой строки, 09/09/2015.Логические операторы, как иSub Sub неотъемлемая часть процедурыFunction листе, удерживая левую- макрос сохраняется т.е. команды, которыеВ принципе, существует великоеФункции обработки системных параметровSqrДан бумажный документ отчета
- 1 (можно записать этого вновь переходят выступают лист, книга,длинаDateDiff
- операторы сравнения, возвращаютключевое слово неЧтобы вызвать VBA процедуруFunctionи кнопку мыши. Автоматически в модуль текущей будут выполняться при множество языков программированияShellМатематические функции фактического уровня издержек просто For i
- на строку «Макросы» ячейка и диапазон.– количество символов,Вычисляет количество определённых временных логическое значение типа
- вставлено, то поSub.Sub появится окно, где книги и, как запуске макроса. В
- (Pascal, Fortran, C++,
Функции обработки системных параметровTan предприятия. Требуется: = 1 To
Пример 5
и нажимают «Изменить» Данные объекты обладают которые требуется извлечь.
интервалов между двумяBoolean умолчанию для процедуры
- из другой VBAЭто отлично проиллюстрировано вв VBA не
- нужно выбрать макрос, следствие, будет выполнятся данном случае макрос C#, Java, ASP,SwitchМатематические функцииразработать его шаблонную часть
10) или «Войти». В
Создание шаблона
специальной иерархией, т.е.Пример: заданными датами.(True или False). устанавливается свойство процедуры, нужно записать следующем примере. является обязательным. Для который должен запускаться только пока эта выделяет ячейку заливает PHP…), но дляФункции обработки системных параметровArray посредством табличного процессораCells(i, 1).Value = i результате оказываются в подчиняются друг другу.
Переменные
Mid(«абвгдежзиклмн», 4, 5)Пример: Основные логические операторыPublic ключевое слово
- Ниже приведён пример кода некоторых процедур аргументы
- при щелчке по книга открыта в выделенных диапазон (Selection)
- всех программ пакетаQBColorФункции обработки массивов
- «Эксель»; ^ 2 (т.е. среде VBA. Собственно,
Главным из них являетсявозвращает строку «гдежз»;DateDiff(«d», «01/01/2015», «02/02/2015») Excel VBA перечислены(то есть онаCall VBA процедуры не нужны.
Решение задачи с использованием программирования на VBA
нарисованной кнопке. Excel желтым цветом (код Microsoft Office стандартомФункции обработки цветаIsArrayсоставить программу VBA, которая в ячейку (i,1) сам код макроса
Application, соответствующий самойMid(«абвгдежзиклмн», 10, 2)вычисляет количество дней в таблице ниже:
будет доступна везде, имя процедурыFunctionПроцедуры VBA могут иметьСоздание пользовательских функций или,
Новая книга = 6) и является именно встроенныйRGBФункции обработки массивов будет запрашивать исходные записывается значение квадрата находится между строками
программе Excel. Затемвозвращает строку «кл». между датами 01/01/2015Оператор Действие в данном проекте
Sub, которая получает три необязательные аргументы. Это как их иногда
- макрос сохраняется затем проходит в язык VBA. КомандыФункции обработки цветаLBound данные для ее i) Sub Макрос1() и следуют Workbooks, Worksheets,Minute и 02/02/2015, возвращаетAnd VBA). В этоми далее в аргумента типа такие аргументы, которые еще называют, UDF-функций
в шаблон, на цикле по всем этого языка понимаетDateФункции обработки массивов заполнения, осуществлять необходимыеNext (в некотором смысле End Sub. а также Range.Возвращает целое число, соответствующее результат 32.Операция конъюнкции, логический оператор состоит отличие от скобках аргументы процедуры.Double пользователь может указать, (User Defined Functions) основе которого создается ячейкам, заменяя формулы любое офисное приложение,Функции работы с датамиUBound расчеты и заполнять играет роль счетчика
Если копирование было выполнено,
fb.ru
Список всех функций
Например, для обращения
количеству минут в | DateDiff(«ww», «01/01/2015», «03/03/2016») |
И | объявления переменных, которые |
Это показано в | (числа с плавающей |
если захочет, а | принципиально не отличается |
любая новая пустая | на значения. В |
будь то Excel, | DateAdd |
Функции обработки массивов | ими соответствующие ячейки |
и означает еще | например, из ячейки |
к ячейке A1 | заданном времени.Пример: |
вычисляет количество недель | . Например, выражение |
по умолчанию бывают | примере ниже: |
точкой двойной точности). | если они пропущены, |
от создания макроса | книга в Excel, |
конце выводится окно | Word, Outlook или |
Функции работы с датами | Asc |
шаблона. | один запуск цикла) |
А1 в ячейку | на конкретном листе |
Minute(«22:45:15») | между датами 01/01/2015 |
A And B | Private |
Sub main() Call | В результате процедура |
то процедура использует | в обычном программном |
т.е. макрос будет | сообщения (MsgBox). |
Access. | DateDiff |
Функции обработки строк | Рассмотрим один из вариантов |
End Sub. | C1, то одна |
следует указать путь | возвращает значение 45. |
и 03/03/2016, возвращает | возвратит |
. | Format_Centered_And_Sized(20) End Sub |
возвращает ещё одно | для них заданные |
модуле. Разница только | содержаться во всех |
С ходу ясно, что | Для ввода команд и |
Функции работы с датами | Chr |
решения. | Если все сделано правильно, |
из строк кода | с учетом иерархии. |
Now | результат 61. |
True | Если нужно завершить выполнение |
Если процедура | число типа |
по умолчанию значения. | в том, что |
новых книгах, создаваемых | вот так сразу, |
формирования программы, т.е. | DatePart |
Функции обработки строк | Все действия осуществляются на |
в том числе | будет выглядеть, как |
Что касается понятия «коллекция», | Возвращает текущую системную дату |
Day | , если |
VBA процедуры | Format_Centered_And_Sized |
Double | Возвращаясь к предыдущему примеру, |
макрос выполняет последовательность | на данном компьютере |
без предварительной подготовки | создания макроса необходимо |
Функции работы с датами | Filter |
стандартном листе в | запись и запуск |
Range(“C1”).Select. В переводе | то это группа |
и время. | Возвращает целое число, соответствующее |
A | Function |
имеет более одного | , равное сумме первых |
чтобы сделать целочисленный | действий с объектами |
начиная с текущего | и опыта в |
открыть специальное окно | DateSerial |
Функции обработки строк | Excel. Резервируются свободные |
макроса (см. инструкцию | это выглядит, как |
объектов того же | Right |
дню месяца в | и |
или | аргумента, то они |
двух аргументов минус | аргумент функции необязательным, |
книги (ячейками, формулами | момента |
программировании вообще и | — редактор программ |
Функции работы с датами | InStr |
ячейки для внесения | выше), то при |
«Диапазон(“C1”).Выделить», иными словами | класса, которая в |
Возвращает заданное количество символов | заданной дате. |
B | Sub |
должны быть разделены | третий аргумент: |
его нужно объявить | и значениями, листами, |
Личная книга макросов | на VBA в |
на VBA, встроенный | DateValue |
Функции обработки строк | данных по месяцу, |
его вызове каждый | осуществляет переход в |
записи имеет вид | от конца переданной |
Пример: | оба равны |
, не дожидаясь её | запятыми. Вот так: |
Function SumMinus(dNum1 As | вот так: |
диаграммами и т.д.), | - это специальная |
частности, сложновато будет | в Microsoft Excel. |
Функции работы с датами | InStrRev |
году, названию компании-потребителя, | раз будет получаться |
VBA Excel, в | ChartObjects. Ее отдельные |
строки. Синтаксис функции: | Day(«29/01/2015») |
True | естественного финала, то |
Sub main() Call | Double, dNum2 As |
Sub AddToCells(Optional i | а пользовательская функция |
книга Excel с | сообразить какие именно |
В старых версиях (Excel | Day |
Функции обработки строк | сумме издержек, их |
столбец заданного размера | ячейку С1. |
элементы также являются | Right( |
возвращает число 29. | , в противном случае |
для этого существуют | Format_Centered_And_Sized(arg1, arg2, …) |
Double, dNum3 As | As Integer = |
— только с | именем |
команды и как | 2003 и старше) |
Функции работы с датами | Join |
уровня, товарооборота. Так | (в данном случае |
Активную часть кода завершает | объектами. |
строка | Hour |
возвратит | операторы |
End Sub | Double) As Double |
0) | теми значениями, которые |
Personal.xls | надо вводить, чтобы |
для этого идем | Hour |
Функции обработки строк | как количество компаний |
состоящий из 10 | команда ActiveSheet.Paste. Она |
Следующее понятие — свойства. | , |
Возвращает целое число, соответствующее | False |
Exit Function | Процедура |
SumMinus = dNum1 | В таком случае целочисленный |
мы передадим ей | , которая используется как |
макрос автоматически выполнял | в меню |
Функции работы с датами | LCase |
(обществ), относительно которых | ячеек). означает запись содержания |
Они являются необходимой | длина количеству часов в |
. | иSub |
+ dNum2 - | аргумент |
как аргументы (исходные | хранилище макросов. Все |
все действия, которые, | Сервис — Макрос - |
IsDate | Функции обработки строк |
составляется отчет, не | В повседневной жизни сплошь |
выделенной ячейки (в | характеристикой любого объекта. |
) | заданном времени. |
Or | Exit Sub |
не может быть | dNum3 End Function |
i | данные для расчета). |
макросы из | например, Вы делаете |
Редактор Visual Basic | Функции работы с датами |
Left | зафиксировано, ячейки для |
и рядом возникает | данном случае А1) |
Например, для Range | Где |
Пример: | Операция дизъюнкции, логический оператор |
. Применение этих операторов | введена непосредственно в |
Эта очень простая VBA | по умолчанию будет |
Чтобы создать пользовательскую функцию | Personal.xls |
для создания еженедельного | (Toos — Macro - |
Minute | Функции обработки строк |
внесения значений по | необходимость принять то |
в выделенную ячейку | — это Value |
строка | Hour(«22:45:00») |
ИЛИ | показано ниже на |
excelworld.ru
Создание макросов и пользовательских функций на VBA
Введение
ячейку листа Excel, процедура равен 0. для расчета, например,загружаются в память отчета для руководства Visual Basic Editor)Функции работы с датамиLen итогам и ФИО или иное решение С1. или Formula.– это исходнаявозвращает число 22.. Например, выражение примере простой процедуры как это можетFunctionНеобязательных аргументов в процедуре налога на добавленную при старте Excel компании. Поэтому мы.MonthФункции обработки строк специалиста заранее не в зависимости отЦиклы VBA помогают создаватьМетоды — это команды, строка, аInStrA Or BFunction быть сделано с
иллюстрирует, как данные может быть несколько, стоимость (НДС) откроем и могут быть переходим ко второмуВ новых версиях (ExcelФункции работы с датамиLTrim резервируют. Рабочему листу какого-то условия. Не различные макросы в показывающие, что требуетсядлинаПринимает в качестве аргументов
возвратит, в которой ожидается процедурой передаются процедуре через все они перечисляются редактор VBA, добавим запущены в любой способу создания макросов, 2007 и новее)MonthNameФункции обработки строк присваивается новое название. обойтись без них Excel.
Способ 1. Создание макросов в редакторе Visual Basic
сделать. При написании– это количество целое число иTrue получение положительного аргументаFunction аргументы. Можно увидеть,
- в конце списка новый модуль через момент и в а именно… для этого нужноФункции работы с датами Mid Например, «Օтчет». и в VBA
- Циклы VBA помогают создавать кода в VBA символов, которые надо две строки. Возвращает, если для выполнения дальнейших, потому что процедура что тип данных, аргументов. меню любой книге.Макрорекордер сначала отобразить вкладкуNowФункции обработки строкДля написания программы автоматического Excel. Примеры программ, различные макросы. Предположим, их необходимо отделять извлечь, считая от позицию вхождения второйA операций. Если процедуре
Sub
возвращаемых процедурой, определёнАргументы в VBA могутInsert — ModuleПосле включения записи и- это небольшаяРазработчик (Developer)Функции работы с датамиPartition
заполнения шаблона, необходимо где дальнейший ход что имеется функция от объекта точкой. конца заданной строки. строки внутри первой,или передано не положительноене возвращает значение. как быть переданы процедуреи введем туда выполнения действий, которые программа, встроенная в. ВыбираемSecondФункции обработки строк выбрать обозначения. Они выполнения алгоритма выбирается, y=x + x2 Например, как будет
- Пример: начиная поиск сB значение, то дальнейшие Однако, процедурыDouble двумя способами: текст нашей функции: необходимо записать, запись Excel, которая переводитФайл — Параметры -Функции работы с датамиReplace будут использоваться для а не предопределен + 3×3 – показано в дальнейшем,Right(«абвгдежзиклмн», 4)
- позиции, заданной целымравны операции не могутSub(об этом говорятByValОбратите внимание, что в можно остановить командой любое действие пользователя Настройка ленты (FileTimeФункции обработки строк переменных: изначально, чаще всего
- cos(x). Требуется создать очень часто привозвращает строку «клмн»; числом.True быть выполнены, поэтому, не имеющие аргументов слова– передача аргумента отличие от макросовОстановить запись на язык программирования — Options -Функции работы с датамиRightNN– номер текущей строки используют конструкцию If
макрос для получения программировании в «Эксель»Right(«абвгдежзиклмн», 1)
Пример:, и возвратит пользователю должно быть и объявленные какAs Double
- по значению. Это функции имеют заголовок(Stop Recording) VBA и записывает Customize Ribbon)TimerФункции обработки строк таблицы; …Then (для сложных ее графика. Сделать
- используют команду Cells(1,1).Select.возвращает строку «н».InStr(1, «Вот искомое слово»,False
- показано сообщение обPublicпосле списка аргументов). значит, что процедуреFunction. получившуюся команду ви включаем вФункции работы с датамиRTrimTP и TF – случаев) If …Then это можно только, Она означает, чтоSecond «слово»), если ошибке и процедура(как будет показано
Также данный пример передаётся только значениевместоУправление всеми доступными макросами программный модуль. Если правой части окнаTimeSerialФункции обработки строк планируемый и фактический …END If. используя циклы VBA. необходимо выбрать ячейкуВозвращает целое число, соответствующеевозвращает число 13.A должна быть тут далее), будут доступны показывает, как результат (то есть, копия
Способ 2. Запись макросов макрорекордером
Sub производится в окне, мы включим макрорекордер флажокФункции работы с датамиSpace товарооборот;Рассмотрим конкретный случай. Предположим,За начальное и конечное с координатами (1,1) количеству секунд вInStr(14, «Вот искомое слово,и же завершена: для пользователей рабочего процедуры аргумента), и, следовательно,и непустой список которое можно открыть на запись, аРазработчик (Developer)TimeValueФункции обработки строкSF и SP – необходимо создать макрос значение аргумента функции т.е. A1. заданном времени. а вот ещеBFunction VAT_Amount(sVAT_Rate As листа. Таким образом,Function любые изменения, сделанные аргументов (в нашем с помощью кнопки
- затем начнем создавать. Теперь на появившейсяФункции работы с датамиSpc фактическая и планируемая для «Эксель», чтобы берут x1=0 иВместе с ней нередко
- Пример: искомое слово», «слово»)оба равны Single) As Single если рассмотренные вышесохраняется в переменной с аргументом внутри случае этоМакросы (Macros) свой еженедельный отчет, вкладке нам будутWeekday
- Функции обработки строк сумма издержек; в ячейку с x2=10. Кроме того, используется Selection.ClearContents. ЕеSecond(«22:45:15»)возвращает число 38.False VAT_Amount = 0 простые процедуры с именем, совпадающим процедуры, будут потеряныSummaна вкладке то макрорекордер начнет
доступны основные инструменты
- Функции работы с датамиSplitIP и IF – координатами (1,1) было необходимо ввести константу выполнение означает очисткувозвращает значение 15.
- Примечание:. If sVAT_RateSub с именем процедуры. при выходе из
). После ввода кодаРазработчик (Developer) записывать команды вслед для работы сWeekdayName
- Функции обработки строк планируемый и фактически записано: — значение для содержимого выбранной ячейки.SqrАргумент-число может бытьNot
- Обратите внимание, что передвставлены в модульЕсли рассмотренная выше простая неё. наша функция становитсяили — в за каждым нашим макросами, в томФункции работы с датамиStr уровень издержек. 1, если аргумент положительный; шага изменения аргументаПрежде всего требуется создатьВозвращает квадратный корень числовой не задан, вОперация отрицания, логический оператор тем, как завершить в редакторе Visual
- процедураByRef доступна в обычном старых версиях Excel действием и, в числе и нужнаяYearФункции обработки строк
-
- Обозначим теми же буквами,0, если аргумент нулевой; и начальное значение файл и сохранить величины, переданной в таком случае поискНЕ выполнение процедуры
- Basic, то процедураFunction– передача аргумента окне Мастера функций — через меню итоге, мы получим нам кнопкаФункции работы с датамиStrComp но с «приставкой»-1, если аргумент отрицательный. для счетчика.
- его, присвоив имя аргументе. начинается с первого. Например, выражениеFunctionFormat_Centered_And_Boldвставлена в модуль по ссылке. То (Сервис — Макрос - макрос создающий отчетРедактор Visual BasicHexФункции обработки строк Itog накопление итога
Создание такого макроса дляВсе примеры макросов VBA и выбрав типПример: символа строки, заданной Not A–
Запуск и редактирование макросов
будет доступна для в редакторе Visual есть процедуре передаётсяВставка — Функция Макросы как если бы(Visual Basic Editor)Функции преобразования чисел вStrConv по данному столбцу. «Эксель» начинается стандартным Excel создаются по «Книга Excel сSqr(4) во втором аргументе
- возвратитVAT_Amount использования на рабочем Basic, то она фактический адрес размещения) в категории
- (Tools — Macro - он был написан : разные системы счисленияФункции обработки строк Например, ItogTP – способом, через использование
- той же процедуре, поддержкой макросов». возвращает значение 2; функции.True, в код вставлена листе книги Excel, может быть вызвана
Создание кнопки для запуска макросов
аргумента в памяти.Определенные пользователем (User Defined) Macros) программистом. Такой способК сожалению, интерфейс редактораOctString
касается столбца таблицы, «горячих» клавиш Alt которая представлена выше.
Затем необходимо перейти вSqr(16) Int, если встроенная VBA функция а процедура из других процедур Любые изменения, сделанные:: создания макросов не VBA и файлыФункции преобразования чисел в
Функции обработки строк озаглавленного, как «планируемый и F11. Далее В данном конкретном приложение VB, длявозвращает значение 4.Возвращает целую часть заданногоAMsgBox
Format_Centered_And_Sized VBA или использована с аргументом внутри
После выбора функции выделяемЛюбой выделенный в списке требует знаний пользователя справки не переводятся разные системы счисленияStrReverse товарооборот». записывается следующий код: случае код выглядит, чего достаточно воспользоваться
Time числа.равно, которая показывает пользователю– не будет на рабочем листе процедуры, будут сохранены ячейки с аргументами макрос можно запустить о программировании и
компанией Microsoft на
VarTypeФункции обработки строкИспользуя введенные обозначения, получаемSub program() как: комбинацией клавиш «Alt»Возвращает текущее системное время.
- Пример:False всплывающее окно с доступна, так как в книге Excel. при выходе из (с суммой, для кнопкой VBA и позволяет
- русский язык, поэтомуФункции преобразования чисел вTab формулы для отклонений.x= Cells(1, 1).Value (этаSub programm() и «F11». Далее:
UboundInt(5.79)
, или возвратит предупреждением. она имеет аргументы.Процедуру процедуры. которой надо посчитатьВыполнить пользоваться макросами как
Создание пользовательских функций на VBA
с английскими командами разные системы счисленияФункции обработки строк Если требуется осуществить команда присваивает xx1 = 1в строке меню, расположенномВозвращает верхний индекс измерениявозвращает результат 5.FalseУрок подготовлен для ВасВот простой способ запуститьFunctionПри помощи ключевых слов НДС) как в(Run) неким аналогом видеозаписи: в меню иCreateObjectTrim
расчет в % значение содержимого ячейкиx2 = 10 в верхней части заданного массива.Isdate, если командой сайта office-guru.ru (или выполнить) процедуруможно вызвать из
ByVal случае с обычной. включил запись, выполнил окнах придется смириться:Функции работы с объектамиФункции обработки строк имеем (F – с координатами (1,shag = 0.1 окна, нажимают наПримечание:ВозвращаетAИсточник: http://www.excelfunctions.net/VBA-Functions-And-Subroutines.htmlSub другой VBA процедурыили функцией:
Кнопка операци, перемотал пленкуМакросы (т.е. наборы командGetAutoServerSettingsTypeName P) / P 1))
planetaexcel.ru
i = 1
Практически все офисные работники встречаются с задачами, которые связаны с обработкой больших массивов данных или рутинными вещами, когда руками приходится копировать и вставлять большой поток информации. В такие минуты кажется, что тратишь часы впустую, и «машина» наверняка справилась бы с рутиной за секунду. Делаем решительный шаг в сторону автоматизации рутины.
Кстати, мы ранее писали о том, сколько времени можно сэкономить, приложив усилия и записав макрос.
Как создать макрос в VBA/Excel?
Самый простой и быстрый способ — через запись макроса. Заходим в «Разработчик» и открываем окно для формирования запросов в VBA.
Не нашли «Разработчик»?
Файл → Параметры → Настроить ленту
На панели «Основные вкладки» отметьте галочкой «Разработчик» и нажмите «ОК».
Приступим к записи макроса. Для удобства можно дать макросу название.
Вводим команду. В нашем случае в ячейке С6 введем формулу
=C2+C3+C4+C5
Останавливаем запись макроса и проверяем его работу.
Меняем номера в ячейках C2 – C5. Переходим в «Макросы» и нажимаем «Выполнить».
Результат посчитан верно.
Что записал макрос? Как это выглядит в коде?
Переходим в «Разрабочик» → «Макросы» → выбираем наш макрос → нажимаем «Изменить»
Видим код.
Перейти в это поле можно проще: достаточно воспользоваться комбинацией Alt + F11, которая переводит нас в редактор кода VBA.
В это поле вы можете вставлять совершенно любой макрос. Если вы не специалист в VBA — достаточно будет подсмотреть готовые макросы на просторах интернета и скопировать их в свой документ.
Примеры
1. С помощью макросов можно копировать данные из одного файла в другой.
Sub CopyFiletoAnotherWorkbook()
‘Copy the data
Sheets(“Example 1”).Range(“A1:C5”).Copy
‘Create a new workbook
Workbooks.Add
‘Paste the data
ActiveSheet.Paste
‘Turn off application alerts
Application.DisplayAlerts = False
‘Save the newly file. Change the name of the directory.
ActiveWorkbook.SaveAs Filename:=“C:EXAMPLE 2.xlsx”
‘Turn application alerts back on
Application.DisplayAlerts = True
End Sub
2. С помощью макросов можно удалять дубли. Ранее мы писали о том, как это сделать без помощи VBA.
Sub DelDups_OneList()
Dim iListCount As Integer
Dim iCtr As Integer
‘ Turn off screen updating to speed up macro.
Application.ScreenUpdating = False
‘ Get count of records to search through.
iListCount = Sheets(“Sheet1”).Range(“A1:A100”).Rows.Count
Sheets(“Sheet1”).Range(“A1”).Select
‘ Loop until end of records.
Do Until ActiveCell = “”
‘ Loop through records.
For iCtr = 1 To iListCount
‘ Don’t compare against yourself.
‘ To specify a different column, change 1 to the column number.
If ActiveCell.Row <> Sheets(“Sheet1”).Cells(iCtr, 1).Row Then
‘ Do comparison of next record.
If ActiveCell.Value = Sheets(“Sheet1”).Cells(iCtr, 1).Value Then
‘ If match is true then delete row.
Sheets(“Sheet1”).Cells(iCtr, 1).Delete xlShiftUp
‘ Increment counter to account for deleted row.
iCtr = iCtr + 1
End If
End If
Next iCtr
‘ Go to next record.
ActiveCell.Offset(1, 0).Select
Loop
Application.ScreenUpdating = True
MsgBox “Done!”
End Sub
Макрос находит повторяющиеся элементы в диапазоне А1:A100 и удаляет их. Важная особенность макроса — необходимость отсутствия в массиве пустых ячеек. Если список содержит пустые ячейки, необходимо отсортировать данные в возрастающем порядке, чтобы все пустые ячейки отображались в конце списка.
3. С помощью макросов можно сравнивать два списка и удалять повторяющуюся информацию.
Следующий пример макроса сравнивает один (ключевой) список с другим и удаляет повторяющиеся элементы во втором списке, которые находятся в главном списке. Первый список находится на листе Sheet1 в диапазоне А1:A10. Второй список располагается на Лист2 в диапазоне А1:A100. Для того, чтобы воспользоваться макросом выберите любой лист и затем запустите макрос.
Sub DelDups_TwoLists()
Dim iListCount As Integer
Dim iCtr As Integer
‘ Turn off screen updating to speed up macro.
Application.ScreenUpdating = False
‘ Get count of records to search through (list that will be deleted).
iListCount = Sheets(“Sheet2”).Range(“A1:A100”).Rows.Count
‘ Loop through the “master” list.
For Each x In Sheets(“Sheet1”).Range(“A1:A10”)
‘ Loop through all records in the second list.
For iCtr = 1 To iListCount
‘ Do comparison of next record.
‘ To specify a different column, change 1 to the column number.
If x.Value = Sheets(“Sheet2”).Cells(iCtr, 1).Value Then
‘ If match is true then delete row.
Sheets(“Sheet2”).Cells(iCtr, 1).Delete xlShiftUp
‘ Increment counter to account for deleted row.
iCtr = iCtr + 1
End If
Next iCtr
Next
Application.ScreenUpdating = True
MsgBox “Done!”
End Sub
Возможности VBA достаточно обширны. Мы привели лишь несколько примеров, однако вы можете изучить тему более детально самостоятельно, записавшись на курс «Excel Academy», просматривая обучающие видео и наши статьи.
Об одном хитром макросе для гигантской таблицы рассказывал Александр Вальцев, CEO SF Education, в видео.
Автор: Фомкина Ирина, эксперт SF Education
Блог SF Education
MS Office
О курсе “Excel Academy”
Excel Academy – полный курс по работе в Excel и его расширениями. Изучаются как стандартные темы, необходимые для решения повседневных задач, так и программирования (VBA),…
С чего я начал изучение Excel и VBA, с какими трудностями сталкивался
Давным-давно, будучи в школе, я познакомился с такой программой, как Excel. Нам показывали старую 2007 версию, и я практически не понимал, для чего она нужна…
Создание пользовательской функции в VBA Excel, ее синтаксис и компоненты. Описание пользовательской функции и ее аргументов. Метод Application.MacroOptions.
Пользовательская функция — это процедура VBA, которая производит заданные вычисления и возвращает полученный результат. Используется для вставки в ячейки рабочего листа Excel или для вызова из других процедур.
Объявление пользовательской функции
Синтаксис функции
[Static] Function Имя ([СписокАргументов])[As ТипДанных] [Операторы] [Имя = выражение] [Exit Function] [Операторы] [Имя = выражение] End Function |
Компоненты функции
- Static — необязательное ключевое слово, указывающее на то, что значения переменных, объявленных в функции, сохраняются между ее вызовами.
- Имя — обязательный компонент, имя пользовательской функции.
- СписокАргументов — необязательный компонент, одна или более переменных, представляющих аргументы, которые передаются в функцию. Аргументы заключаются в скобки и разделяются между собой запятыми.
- Операторы — необязательный компонент, блок операторов (инструкций).
- Имя = выражение — необязательный* компонент, присвоение имени функции значения выражения или переменной. Обычно, значение присваивается функции непосредственно перед выходом из нее.
- Exit Function — необязательный компонент, принудительный выход из функции, если ей уже присвоено окончательное значение.
*Один из компонентов Имя = выражение следует считать обязательным, так как если не присвоить функции значения, смысл ее использования теряется.
Видимость функции
Видимость пользовательской функции определяется необязательными ключевыми словами Public и Private, которые могут быть указаны перед оператором Function (или Static, в случае его использования).
Ключевое слово Public указывает на то, что функция будет доступна для вызова из других процедур во всех модулях открытых книг Excel. Функция, объявленная как Public, отображается в диалоговом окне Мастера функций.
Ключевое слово Private указывает на то, что функция будет доступна для вызова из других процедур только в пределах программного модуля, в котором она находится. Функция, объявленная как Private, не отображается в диалоговом окне Мастера функций, но ее можно ввести в ячейку вручную.
Если ключевое слово Public или Private не указано, функция считается по умолчанию объявленной, как Public.
Чтобы пользовательская функция всегда была доступна во всех открытых книгах Excel, сохраните ее в Личной книге макросов без объявления видимости или как Public. Но если вы планируете передать рабочую книгу с пользовательской функцией на другой компьютер, код функции должен быть в программном модуле передаваемой книги.
Пример пользовательской функции
Для примера мы рассмотрим простейшую пользовательскую функцию, которой в следующем параграфе добавим описание. Называется функция «Деление», объявлена с типом данных Variant, так как ее возвращаемое значение может быть и числом, и текстом. Аргументы функции — Делимое и Делитель — тоже объявлены как Variant, так как в ячейках Excel могут быть числовые значения разных типов, и функция IsNumeric тоже проверяет разные типы данных и требует, чтобы ее аргументы были объявлены как Variant.
Function Деление(Делимое As Variant, Делитель As Variant) As Variant If IsNumeric(Делимое) = False Or IsNumeric(Делитель) = False Then Деление = «Ошибка: Делимое и Делитель должны быть числами!» Exit Function ElseIf Делитель = 0 Then Деление = «Ошибка: деление на ноль!» Exit Function Else Деление = Делимое / Делитель End If End Function |
Эта функция выполняет деление значений двух ячеек рабочего листа Excel. Перед делением проверяются два блока условий:
- Если делимое или делитель не являются числом, функция возвращает значение: «Ошибка: Делимое и Делитель должны быть числами!», и производится принудительный выход из функции оператором Exit Function.
- Если делитель равен нулю, функция возвращает значение: «Ошибка: деление на ноль!», и производится принудительный выход из функции оператором Exit Function.
Если проверяемые условия не выполняются (возвращают значение False) производится деление чисел и функция возвращает частное (результат деления).
Вы можете скопировать к себе в стандартный модуль эту функцию и она станет доступна в разделе «Определенные пользователем» Мастера функций. Попробуйте вставить функцию «Деление» в ячейку рабочего листа с помощью Мастера и поэкспериментируйте с ней.
Практического смысла функция «Деление» не имеет, но она хорошо демонстрирует как объявляются, создаются и работают пользовательские функции в VBA Excel. А еще она поможет продемонстрировать, как добавлять к функциям и аргументам описания. С полноценной пользовательской функцией вы можете ознакомиться здесь.
Добавление описания функции
В списке функций, выводимом Мастером, невозможно добавить или отредактировать их описание. Список макросов позволяет добавлять процедурам описание, но в нем нет функций. Проблема решается следующим образом:
- Запустите Мастер функций, посмотрите, как отображается имя нужной функции и закройте его.
- Откройте список макросов и в поле «Имя макроса» впишите имя пользовательской функции.
- Нажмите кнопку «Параметры» и в открывшемся окне добавьте или отредактируйте описание.
- Нажмите кнопку «OK», затем в окне списка макросов — «Отмена». Описание готово!
Добавление описания на примере функции «Деление»:
Добавление описания пользовательской функции
Описание функции «Деление» в диалоговом окне Мастера функций «Аргументы функции»:
Описание пользовательской функции в окне «Аргументы функции»
С помощью окна «Список макросов» можно добавить описание самой функции, а ее аргументам нельзя. Но это можно сделать, используя метод Application.MacroOptions.
Метод Application.MacroOptions
Метод Application.MacroOptions позволяет добавить пользовательской функции описание, назначить сочетание клавиш, указать категорию, добавить описания аргументов и добавить или изменить другие параметры. Давайте рассмотрим возможности этого метода, используемые чаще всего.
Пример кода с методом Application.MacroOptions:
Sub ИмяПодпрограммы() Application.MacroOptions _ Macro:=«ИмяФункции», _ Description:=«Описание функции», _ Category:=«Название категории», _ ArgumentDescriptions:=Array(«Описание 1», «Описание 2», «Описание 3», ...) End Sub |
- ИмяПодпрограммы — любое уникальное имя, подходящее для наименования процедур.
- ИмяФункции — имя функции, параметры которой добавляются или изменяются.
- Описание функции — описание функции, которое добавляется или изменяется.
- Название категории — название категории в которую будет помещена функция. Если параметр Category отсутствует, пользовательская функция будет записана в раздел по умолчанию — «Определенные пользователем». Если указанное Название категории соответствует одному из названий стандартного списка, функция будет записана в него. Если такого Названия категории нет в списке, будет создан новый раздел с этим названием и функция будет помещена в него.
- «Описание 1», «Описание 2», «Описание 3», … — описания аргументов в том порядке, как они расположены в объявлении пользовательской функции.
Эта подпрограмма запускается один раз, после чего ее можно удалить или использовать как шаблон для корректировки параметров других пользовательских функций.
Сейчас с помощью метода Application.MacroOptions попробуем изменить описание пользовательской функции «Деление» и добавить описания аргументов.
Sub ИзменениеОписания() Application.MacroOptions _ Macro:=«Деление», _ Description:=«Описание функции Деление изменено методом Application.MacroOptions», _ ArgumentDescriptions:=Array(«- любое числовое значение», «- числовое значение, кроме нуля») End Sub |
После однократного запуска этой подпрограммы получаем следующий результат:
Новое описание пользовательской функции и ее второго аргумента
Метод Application.MacroOptions не работает в Личной книге макросов, но и здесь можно найти решение. Добавьте описания к пользовательским функциям и их аргументам в обычной книге Excel, затем экспортируйте модуль с функциями в любой каталог на жестком диске и оттуда импортируйте в Личную книгу макросов. Все описания сохранятся.
Время на прочтение
7 мин
Количество просмотров 312K
Приветствую всех.
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Появилась вкладка.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Sub FormatPrice()End Sub
Напишем Hello World:
Sub FormatPrice()
MsgBox "Hello World!"
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
' Exit Sub ' Это значит "выйти из процедуры"
MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As Integer) As Integer
' Exit Function
LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
Dim s1 As String, s2 As String
s1 = "str1"
s2 = "str2"
If s1 <> s2 Then
foo "123", "456" ' Скобки при вызове процедур запрещены
End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
' Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ' Конвертация чего угодно в String
If i = 5 Then Exit For
Next iDim x As Double
x = Val("1.234") ' Парсинг чисел
x = x + 10
MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
x = 5 / 0
MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
x = 5 / 0
MsgBox "OK!"
GoTo ne
Err:
MsgBox
"Err!"
ne:
On Error GoTo 0 ' Отключаем обработку ошибок
' Циклы бывает, какие захотите
Do While True
Exit DoLoop 'While True
Do 'Until False
Exit Do
Loop Until False
' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
' Val также умеет возвращать Integer
Select Case LengthSqr(Len("abc"), Val("4"))
Case 24
MsgBox "0"
Case 25
MsgBox "1"
Case 26
MsgBox "2"
End Select' Двухмерный массив.
' Можно также менять размеры командой ReDim (Preserve) - см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8Dim coll As New Collection
Dim coll2 As Collection
coll.Add "item", "key"
Set coll2 = coll ' Все присваивания объектов должны производится командой Set
MsgBox coll2("key")
Set coll2 = New Collection
MsgBox coll2.Count
End Sub
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets("result").Cells.Clear
Sheets("data").Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
- Считали группы из очередной строки.
- Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
- Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
- После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer) As String
GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As Integer) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As Integer) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ' строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Sheets(
"data").Activate
I = 2
Do While True
If GetCell(0, I).Value = "" Then Exit Do
' ...
I = I + 1
Loop
End Sub
Теперь надо заполнить массив Groups:
На месте многоточия
Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Sub AddHeader(Ty As Integer, Name As String)
GetCellS("result", 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub
Теперь надо перенести всякую информацию в result
For I2 = 0 To DataCount - 1
GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets("Result").Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Sub AddHeader(Ty As Integer, Name As String)
Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
' Чтобы не заводить переменную и не писать каждый раз длинный вызов
' можно воспользоваться блоком With
With GetCellS("result", 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
Select Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ' Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub
Уже лучше:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Sub AddHeader(Ty As Integer, Name As String)
With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
.HorizontalAlignment = xlCenterSelect Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ' Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ' строка в data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.