Создание пользовательской функции в 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, затем экспортируйте модуль с функциями в любой каталог на жестком диске и оттуда импортируйте в Личную книгу макросов. Все описания сохранятся.
Всё о работе с ячейками в Excel-VBA: обращение, перебор, удаление, вставка, скрытие, смена имени.
Содержание:
Table of Contents:
- Что такое ячейка Excel?
- Способы обращения к ячейкам
- Выбор и активация
- Получение и изменение значений ячеек
- Ячейки открытой книги
- Ячейки закрытой книги
- Перебор ячеек
- Перебор в произвольном диапазоне
- Свойства и методы ячеек
- Имя ячейки
- Адрес ячейки
- Размеры ячейки
- Запуск макроса активацией ячейки
2 нюанса:
- Я почти везде стараюсь использовать ThisWorkbook (а не, например, ActiveWorkbook) для обращения к текущей книге, в которой написан этот код (считаю это наиболее безопасным для новичков способом обращения к книгам, чтобы случайно не внести изменения в другие книги). Для экспериментов можете вставлять этот код в модули, коды книги, либо листа, и он будет работать только в пределах этой книги.
- Я использую английский эксель и у меня по стандарту листы называются Sheet1, Sheet2 и т.д. Если вы работаете в русском экселе, то замените Thisworkbook.Sheets(«Sheet1») на Thisworkbook.Sheets(«Лист1»). Если этого не сделать, то вы получите ошибку в связи с тем, что пытаетесь обратиться к несуществующему объекту. Можно также заменить на Thisworkbook.Sheets(1), но это менее безопасно.
Что такое ячейка Excel?
В большинстве мест пишут: «элемент, образованный пересечением столбца и строки». Это определение полезно для людей, которые не знакомы с понятием «таблица». Для того, чтобы понять чем на самом деле является ячейка Excel, необходимо заглянуть в объектную модель Excel. При этом определения объектов «ряд», «столбец» и «ячейка» будут отличаться в зависимости от того, как мы работаем с файлом.
Объекты в Excel-VBA. Пока мы работаем в Excel без углубления в VBA определение ячейки как «пересечения» строк и столбцов нам вполне хватает, но если мы решаем как-то автоматизировать процесс в VBA, то о нём лучше забыть и просто воспринимать лист как «мешок» ячеек, с каждой из которых VBA позволяет работать как минимум тремя способами:
- по цифровым координатам (ряд, столбец),
- по адресам формата А1, B2 и т.д. (сценарий целесообразности данного способа обращения в VBA мне сложно представить)
- по уникальному имени (во втором и третьем вариантах мы будем иметь дело не совсем с ячейкой, а с объектом VBA range, который может состоять из одной или нескольких ячеек). Функции и методы объектов Cells и Range отличаются. Новичкам я бы порекомендовал работать с ячейками VBA только с помощью Cells и по их цифровым координатам и использовать Range только по необходимости.
Все три способа обращения описаны далее
Как это хранится на диске и как с этим работать вне Excel? С точки зрения хранения и обработки вне Excel и VBA. Сделать это можно, например, сменив расширение файла с .xls(x) на .zip и открыв этот архив.
Пример содержимого файла Excel:
Далее xl -> worksheets и мы видим файл листа
Содержимое файла:
То же, но более наглядно:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{00000000-0001-0000-0000-000000000000}">
<dimension ref="B2:F6"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="D12" sqref="D12"/>
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/>
<sheetData>
<row r="2" spans="2:6" x14ac:dyDescent="0.3">
<c r="B2" t="s">
<v>0</v>
</c>
</row>
<row r="3" spans="2:6" x14ac:dyDescent="0.3">
<c r="C3" t="s">
<v>1</v>
</c>
</row>
<row r="4" spans="2:6" x14ac:dyDescent="0.3">
<c r="D4" t="s">
<v>2</v>
</c>
</row>
<row r="5" spans="2:6" x14ac:dyDescent="0.3">
<c r="E5" t="s">
<v>0</v></c>
</row>
<row r="6" spans="2:6" x14ac:dyDescent="0.3">
<c r="F6" t="s"><v>3</v>
</c></row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
Как мы видим, в структуре объектной модели нет никаких «пересечений». Строго говоря рабочая книга — это архив структурированных данных в формате XML. При этом в каждую «строку» входит «столбец», и в нём в свою очередь прописан номер значения данного столбца, по которому оно подтягивается из другого XML файла при открытии книги для экономии места за счёт отсутствия повторяющихся значений. Почему это важно. Если мы захотим написать какой-то обработчик таких файлов, который будет напрямую редактировать данные в этих XML, то ориентироваться надо на такую модель и структуру данных. И правильное определение будет примерно таким: ячейка — это объект внутри столбца, который в свою очередь находится внутри строки в файле xml, в котором хранятся данные о содержимом листа.
Способы обращения к ячейкам
Выбор и активация
Почти во всех случаях можно и стоит избегать использования методов Select и Activate. На это есть две причины:
- Это лишь имитация действий пользователя, которая замедляет выполнение программы. Работать с объектами книги можно напрямую без использования методов Select и Activate.
- Это усложняет код и может приводить к неожиданным последствиям. Каждый раз перед использованием Select необходимо помнить, какие ещё объекты были выбраны до этого и не забывать при необходимости снимать выбор. Либо, например, в случае использования метода Select в самом начале программы может быть выбрано два листа вместо одного потому что пользователь запустил программу, выбрав другой лист.
Можно выбирать и активировать книги, листы, ячейки, фигуры, диаграммы, срезы, таблицы и т.д.
Отменить выбор ячеек можно методом Unselect:
Selection.Unselect
Отличие выбора от активации — активировать можно только один объект из раннее выбранных. Выбрать можно несколько объектов.
Если вы записали и редактируете код макроса, то лучше всего заменить Select и Activate на конструкцию With … End With. Например, предположим, что мы записали вот такой макрос:
Sub Macro1()
' Macro1 Macro
Range("F4:F10,H6:H10").Select 'выбрали два несмежных диапазона зажав ctrl
Range("H6").Activate 'показывает только то, что я начал выбирать второй диапазон с этой ячейки (она осталась белой). Это действие ни на что не влияет
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535 'залили желтым цветом, нажав на кнопку заливки на верхней панели
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Почему макрос записался таким неэффективным образом? Потому что в каждый момент времени (в каждой строке) программа не знает, что вы будете делать дальше. Поэтому в записи выбор ячеек и действия с ними — это два отдельных действия. Этот код лучше всего оптимизировать (особенно если вы хотите скопировать его внутрь какого-нибудь цикла, который должен будет исполняться много раз и перебирать много объектов). Например, так:
Sub Macro11()
'
' Macro1 Macro
Range("F4:F10,H6:H10").Select '1. смотрим, что за объект выбран (что идёт до .Select)
Range("H6").Activate
With Selection.Interior '2. понимаем, что у выбранного объекта есть свойство interior, с которым далее идёт работа
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Sub Optimized_Macro()
With Range("F4:F10,H6:H10").Interior '3. переносим объект напрямую в конструкцию With вместо Selection
' ////// Здесь я для надёжности прописал бы ещё Thisworkbook.Sheet("ИмяЛиста") перед Range,
' ////// чтобы минимизировать риск любых случайных изменений других листов и книг
' ////// With Thisworkbook.Sheet("ИмяЛиста").Range("F4:F10,H6:H10").Interior
.Pattern = xlSolid '4. полностью копируем всё, что было записано рекордером внутрь блока with
.PatternColorIndex = xlAutomatic
.Color = 55555 '5. здесь я поменял цвет на зеленый, чтобы было видно, работает ли код при поочерёдном запуске двух макросов
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Пример сценария, когда использование Select и Activate оправдано:
Допустим, мы хотим, чтобы во время исполнения программы мы одновременно изменяли несколько листов одним действием и пользователь видел какой-то определённый лист. Это можно сделать примерно так:
Sub Select_Activate_is_OK()
Thisworkbook.Worksheets(Array("Sheet1", "Sheet3")).Select 'Выбираем несколько листов по именам
Thisworkbook.Worksheets("Sheet3").Activate 'Показываем пользователю третий лист
'Далее все действия с выбранными ячейками через Select будут одновременно вносить изменения в оба выбранных листа
'Допустим, что тут мы решили покрасить те же два диапазона:
Range("F4:F10,H6:H10").Select
Range("H6").Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Единственной причиной использовать этот код по моему мнению может быть желание зачем-то показать пользователю определённую страницу книги в какой-то момент исполнения программы. С точки зрения обработки объектов, опять же, эти действия лишние.
Получение и изменение значений ячеек
Значение ячеек можно получать/изменять с помощью свойства value.
'Если нужно прочитать / записать значение ячейки, то используется свойство Value
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'записать значение ячейки А1 листа "Sheet1" в переменную "a"
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value = 1 'задать значение ячейки А1 (первый ряд, первый столбец) листа "Sheet1"
'Если нужно прочитать текст как есть (с форматированием), то можно использовать свойство .text:
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text = "1"
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text
'Когда проявится разница:
'Например, если мы считываем дату в формате "31 декабря 2021 г.", хранящуюся как дата
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'эапишет как "31.12.2021"
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text 'запишет как "31 декабря 2021 г."
Ячейки открытой книги
К ячейкам можно обращаться:
'В книге, в которой хранится макрос (на каком-то из листов, либо в отдельном модуле или форме)
ThisWorkbook.Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
ThisWorkbook.Sheets("Sheet1").Cells(1,"A").Value 'По номерам строки и букве столбца
ThisWorkbook.Sheets("Sheet1").Range("A1").Value 'По адресу - вариант 1
ThisWorkbook.Sheets("Sheet1").[A1].Value 'По адресу - вариант 2
ThisWorkbook.Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)
'Те же действия, но с использованием полного названия рабочей книги (книга должна быть открыта)
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,"A").Value 'По номерам строки и букве столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("A1").Value 'По адресу - вариант 1
Workbooks("workbook.xlsm").Sheets("Sheet1").[A1].Value 'По адресу - вариант 2
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)
Ячейки закрытой книги
Если нужно достать или изменить данные в другой закрытой книге, то необходимо прописать открытие и закрытие книги. Непосредственно работать с закрытой книгой не получится, потому что данные в ней хранятся отдельно от структуры и при открытии Excel каждый раз производит расстановку значений по соответствующим «слотам» в структуре. Подробнее о том, как хранятся данные в xlsx см выше.
Workbooks.Open Filename:="С:closed_workbook.xlsx" 'открыть книгу (она становится активной)
a = ActiveWorkbook.Sheets("Sheet1").Cells(1,1).Value 'достать значение ячейки 1,1
ActiveWorkbook.Close False 'закрыть книгу (False => без сохранения)
Скачать пример, в котором можно посмотреть, как доставать и как записывать значения в закрытую книгу.
Код из файла:
Option Explicit
Sub get_value_from_closed_wb() 'достать значение из закрытой книги
Dim a, wb_path, wsh As String
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
Workbooks.Open Filename:=wb_path
a = ActiveWorkbook.Sheets(wsh).Cells(3, 3).Value
ActiveWorkbook.Close False
ThisWorkbook.Sheets("Sheet1").Cells(4, 3).Value = a
End Sub
Sub record_value_to_closed_wb() 'записать значение в закрытую книгу
Dim wb_path, b, wsh As String
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
b = ThisWorkbook.Sheets("Sheet1").Cells(5, 3).Value 'get value to record in the target workbook
Workbooks.Open Filename:=wb_path
ActiveWorkbook.Sheets(wsh).Cells(4, 4).Value = b 'add new value to cell D4 of the target workbook
ActiveWorkbook.Close True
End Sub
Перебор ячеек
Перебор в произвольном диапазоне
Скачать файл со всеми примерами
Пройтись по всем ячейкам в нужном диапазоне можно разными способами. Основные:
- Цикл For Each. Пример:
Sub iterate_over_cells() For Each c In ThisWorkbook.Sheets("Sheet1").Range("B2:D4").Cells MsgBox (c) Next c End Sub
Этот цикл выведет в виде сообщений значения ячеек в диапазоне B2:D4 по порядку по строкам слева направо и по столбцам — сверху вниз. Данный способ можно использовать для действий, в который вам не важны номера ячеек (закрашивание, изменение форматирования, пересчёт чего-то и т.д.).
- Ту же задачу можно решить с помощью двух вложенных циклов — внешний будет перебирать ряды, а вложенный — ячейки в рядах. Этот способ я использую чаще всего, потому что он позволяет получить больше контроля над исполнением: на каждой итерации цикла нам доступны координаты ячеек. Для перебора всех ячеек на листе этим методом потребуется найти последнюю заполненную ячейку. Пример кода:
Sub iterate_over_cells() Dim cl, rw As Integer Dim x As Variant 'перебор области 3x3 For rw = 1 To 3 ' цикл для перебора рядов 1-3 For cl = 1 To 3 'цикл для перебора столбцов 1-3 x = ThisWorkbook.Sheets("Sheet1").Cells(rw + 1, cl + 1).Value MsgBox (x) Next cl Next rw 'перебор всех ячеек на листе. Последняя ячейка определена с помощью UsedRange 'LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 'LastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 'For rw = 1 To LastRow 'цикл перебора всех рядов ' For cl = 1 To LastCol 'цикл для перебора всех столбцов ' Действия ' Next cl 'Next rw End Sub
- Если нужно перебрать все ячейки в выделенном диапазоне на активном листе, то код будет выглядеть так:
Sub iterate_cell_by_cell_over_selection() Dim ActSheet As Worksheet Dim SelRange As Range Dim cell As Range Set ActSheet = ActiveSheet Set SelRange = Selection 'if we want to do it in every cell of the selected range For Each cell In Selection MsgBox (cell.Value) Next cell End Sub
Данный метод подходит для интерактивных макросов, которые выполняют действия над выбранными пользователем областями.
- Перебор ячеек в ряду
Sub iterate_cells_in_row() Dim i, RowNum, StartCell As Long RowNum = 3 'какой ряд StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i) For i = 1 To 10 ' 10 ячеек в выбранном ряду ThisWorkbook.Sheets("Sheet1").Cells(RowNum, i + StartCell).Value = i '(i + StartCell) добавляет 1 к номеру столбца при каждом повторении Next i End Sub
- Перебор ячеек в столбце
Sub iterate_cells_in_column() Dim i, ColNum, StartCell As Long ColNum = 3 'какой столбец StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i) For i = 1 To 10 ' 10 ячеек ThisWorkbook.Sheets("Sheet1").Cells(i + StartCell, ColNum).Value = i ' (i + StartCell) добавляет 1 к номеру ряда при каждом повторении Next i End Sub
Свойства и методы ячеек
Имя ячейки
Присвоить новое имя можно так:
Thisworkbook.Sheets(1).Cells(1,1).name = "Новое_Имя"
Для того, чтобы сменить имя ячейки нужно сначала удалить существующее имя, а затем присвоить новое. Удалить имя можно так:
ActiveWorkbook.Names("Старое_Имя").Delete
Пример кода для переименования ячеек:
Sub rename_cell()
old_name = "Cell_Old_Name"
new_name = "Cell_New_Name"
ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub
Sub rename_cell_reverse()
old_name = "Cell_New_Name"
new_name = "Cell_Old_Name"
ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub
Адрес ячейки
Sub get_cell_address() ' вывести адрес ячейки в формате буква столбца, номер ряда
'$A$1 style
txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address
MsgBox (txt_address)
End Sub
Sub get_cell_address_R1C1()' получить адрес столбца в формате номер ряда, номер столбца
'R1C1 style
txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address(ReferenceStyle:=xlR1C1)
MsgBox (txt_address)
End Sub
'пример функции, которая принимает 2 аргумента: название именованного диапазона и тип желаемого адреса
'(1- тип $A$1 2- R1C1 - номер ряда, столбца)
Function get_cell_address_by_name(str As String, address_type As Integer)
'$A$1 style
Select Case address_type
Case 1
txt_address = Range(str).Address
Case 2
txt_address = Range(str).Address(ReferenceStyle:=xlR1C1)
Case Else
txt_address = "Wrong address type selected. 1,2 available"
End Select
get_cell_address_by_name = txt_address
End Function
'перед запуском нужно убедиться, что в книге есть диапазон с названием,
'адрес которого мы хотим получить, иначе будет ошибка
Sub test_function() 'запустите эту программу, чтобы увидеть, как работает функция
x = get_cell_address_by_name("MyValue", 2)
MsgBox (x)
End Sub
Размеры ячейки
Ширина и длина ячейки в VBA меняется, например, так:
Sub change_size()
Dim x, y As Integer
Dim w, h As Double
'получить координаты целевой ячейки
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
'получить желаемую ширину и высоту ячейки
w = ThisWorkbook.Sheets("Sheet1").Cells(6, 2).Value
h = ThisWorkbook.Sheets("Sheet1").Cells(7, 2).Value
'сменить высоту и ширину ячейки с координатами x,y
ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight = h
ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth = w
End Sub
Прочитать значения ширины и высоты ячеек можно двумя способами (однако результаты будут в разных единицах измерения). Если написать просто Cells(x,y).Width или Cells(x,y).Height, то будет получен результат в pt (привязка к размеру шрифта).
Sub get_size()
Dim x, y As Integer
'получить координаты ячейки, с которой мы будем работать
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
'получить длину и ширину выбранной ячейки в тех же единицах измерения, в которых мы их задавали
ThisWorkbook.Sheets("Sheet1").Cells(2, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth
ThisWorkbook.Sheets("Sheet1").Cells(3, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight
'получить длину и ширину с помощью свойств ячейки (только для чтения) в поинтах (pt)
ThisWorkbook.Sheets("Sheet1").Cells(7, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Width
ThisWorkbook.Sheets("Sheet1").Cells(8, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Height
End Sub
Скачать файл с примерами изменения и чтения размера ячеек
Запуск макроса активацией ячейки
Для запуска кода VBA при активации ячейки необходимо вставить в код листа нечто подобное:
3 важных момента, чтобы это работало:
1. Этот код должен быть вставлен в код листа (здесь контролируется диапазон D4)
2-3. Программа, ответственная за запуск кода при выборе ячейки, должна называться Worksheet_SelectionChange и должна принимать значение переменной Target, относящейся к триггеру SelectionChange. Другие доступные триггеры можно посмотреть в правом верхнем углу (2).
Скачать файл с базовым примером (как на картинке)
Скачать файл с расширенным примером (код ниже)
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' имеем в виду, что триггер SelectionChange будет запускать эту Sub после каждого клика мышью (после каждого клика будет проверяться:
'1. количество выделенных ячеек и
'2. не пересекается ли выбранный диапазон с заданным в этой программе диапазоном.
' поэтому в эту программу не стоит без необходимости писать никаких других тяжелых операций
If Selection.Count = 1 Then 'запускаем программу только если выбрано не более 1 ячейки
'вариант модификации - брать адрес ячейки из другой ячейки:
'Dim CellName as String
'CellName = Activesheet.Cells(1,1).value 'брать текстовое имя контролируемой ячейки из A1 (должно быть в формате Буква столбца + номер строки)
'If Not Intersect(Range(CellName), Target) Is Nothing Then
'для работы этой модификации следующую строку надо закомментировать/удалить
If Not Intersect(Range("D4"), Target) Is Nothing Then
'если заданный (D4) и выбранный диапазон пересекаются
'(пересечение диапазонов НЕ равно Nothing)
'можно прописать диапазон из нескольких ячеек:
'If Not Intersect(Range("D4:E10"), Target) Is Nothing Then
'можно прописать несколько диапазонов:
'If Not Intersect(Range("D4:E10"), Target) Is Nothing or Not Intersect(Range("A4:A10"), Target) Is Nothing Then
Call program 'выполняем программу
End If
End If
End Sub
Sub program()
MsgBox ("Program Is running") 'здесь пишем код того, что произойдёт при выборе нужной ячейки
End Sub
Excel VBA Functions
We have seen that we can use the worksheet functions in VBA, i.e., the Excel worksheet functions in VBA coding using the Application.Worksheet method. But how do we use a function of VBA in Excel well? Such functions are called user-defined functions. When a user creates a function in VBA, we can use it in an Excel worksheet.
Although we have many functions in Excel to manipulate the data, sometimes we need to have some customization in the tools to save time as we do some tasks repeatedly. For example, we have predefined functions in excel like SUM, COUNTIFThe COUNTIF function in Excel counts the number of cells within a range based on pre-defined criteria. It is used to count cells that include dates, numbers, or text. For example, COUNTIF(A1:A10,”Trump”) will count the number of cells within the range A1:A10 that contain the text “Trump”
read more, SUMIFThe SUMIF Excel function calculates the sum of a range of cells based on given criteria. The criteria can include dates, numbers, and text. For example, the formula “=SUMIF(B1:B5, “<=12”)” adds the values in the cell range B1:B5, which are less than or equal to 12.
read more, COUNTIFS,”COUNTIFSread more VLOOKUPThe VLOOKUP excel function searches for a particular value and returns a corresponding match based on a unique identifier. A unique identifier is uniquely associated with all the records of the database. For instance, employee ID, student roll number, customer contact number, seller email address, etc., are unique identifiers.
read more, INDEX, MATCH in excelThe MATCH function looks for a specific value and returns its relative position in a given range of cells. The output is the first position found for the given value. Being a lookup and reference function, it works for both an exact and approximate match. For example, if the range A11:A15 consists of the numbers 2, 9, 8, 14, 32, the formula “MATCH(8,A11:A15,0)” returns 3. This is because the number 8 is at the third position.
read more, etc., but we do some tasks daily for which a single command or function is not available in Excel. Using VBA, we can create the User Defined Functions (UDFUser Defined Function in VBA is a group of customized commands created to give out a certain result. It is a flexibility given to a user to design functions similar to those already provided in Excel.read more) custom function.
Table of contents
- Excel VBA Functions
- What do VBA Functions do?
- How to Create Custom Functions using VBA?
- Example
- Step 1: Find Total Marks
- Step 2: Create ResultOfStudent Function
- Step 3: Apply ResultOfStudents Function to Get Result
- Step 4: Create ‘GradeForStudent’ Function to get Grades
- Example
- Recommended Articles
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Functions (wallstreetmojo.com)
What do VBA Functions do?
- They carry out certain calculations; and
- Return a value
In VBA, while defining the function, we use the following syntax to specify the parameters and their data type.
Data type here is the type of dataData type is the core character of any variable, it represents what is the type of value we can store in the variable and what is the limit or the range of values which can be stored in the variable, data types are built-in VBA and user or developer needs to be aware which type of value can be stored in which data type. Data types assign to variables tells the compiler storage size of the variable.read more the variable will hold. It can hold any value (data type or class object).
We can connect the object with its property or method using the period or dot (.) symbol.
How to Create Custom Functions using VBA?
You can download this VBA Function Excel Template here – VBA Function Excel Template
Example
Suppose we have the following data from a school where we need to find the total marks scored by the student, result, and grade.
To sum up, the marks scored by an individual student in all subjects, we have an inbuilt function, SUM. But, determining the grade and result based on the criteria set out by the school is not available in Excel by default.
It is the reason why we need to create user-defined functions.
Step 1: Find Total Marks
First, we will find the total marks using the SUM function in excelThe SUM function in excel adds the numerical values in a range of cells. Being categorized under the Math and Trigonometry function, it is entered by typing “=SUM” followed by the values to be summed. The values supplied to the function can be numbers, cell references or ranges.read more.
Then, press the “Enter” key to get the result.
Drag the formula to the rest of the cells.
Now, to find out the result (passed, failed, or essential repeat), the criteria set by the school is that.
- Suppose a student has scored more than or equal to 200 as total marks out of 500. In addition, suppose they have also not failed in any subject (scored more than 32 in each subject), a student is passed.
- If the student scored more than or equal to 200 but failed in 1 or 2 subjects, then a student will get “Essential Repeat” in those subjects.
- If the student has scored either less than 200 or fails in 3 or more subjects, then the student failed.
Step 2: Create ResultOfStudent Function
To create a function named ‘ResultOfStudent,’ we need to open “Visual Basic Editor” by using any of the methods below:
- Using the Developer tab excel.Enabling the developer tab in excel can help the user perform various functions for VBA, Macros and Add-ins like importing and exporting XML, designing forms, etc. This tab is disabled by default on excel; thus, the user needs to enable it first from the options menu.read more
If the Developer tab is not available in MS Excel, then we can get that by using the following steps:
- Right-click anywhere on the ribbon. Then, choose to Customize the Ribbon in excelRibbons in Excel 2016 are designed to help you easily locate the command you want to use. Ribbons are organized into logical groups called Tabs, each of which has its own set of functions.read more‘.
When we choose this command, the “Excel Options” dialog box opens.
- We need to check the box for “Developer” to get the tab.
- Using the shortcut key, Alt+F11.
- When we open the VBA editorThe Visual Basic for Applications Editor is a scripting interface. These scripts are primarily responsible for the creation and execution of macros in Microsoft software.read more, we need to insert the module by going to the Insert menu and choosing a module.
- We need to paste the following code into the module.
Function ResultOfStudents(Marks As Range) As String Dim mycell As Range Dim Total As Integer Dim CountOfFailedSubject As Integer For Each mycell In Marks Total = Total + mycell.Value If mycell.Value < 33 Then CountOfFailedSubject = CountOfFailedSubject + 1 End If Next mycell If Total >= 200 And CountOfFailedSubject <= 2 And CountOfFailedSubject > 0 Then ResultOfStudents = "Essential Repeat" ElseIf Total >= 200 And CountOfFailedSubject = 0 Then ResultOfStudents = "Passed" Else ResultOfStudents = "Failed" End If End Function
The above function returns the result for a student.
We need to understand how this code is working.
The first statement, ‘Function ResultOfStudents(Marks As Range) As String,’ declares a function named ‘ResultOfStudents’ that will accept a range as input for marks and return the result as a string.
Dim mycell As Range Dim Total As Integer Dim CountOfFailedSubject As Integer
These three statements declare variables, i.e.,
- ‘myCell’ as a Range,
- ‘Total’ as Integer (to store total marks scored by a student),
- ‘‘CountOfFailedSubject’ is an Integer (to store the number of subjects a student has failed).
For Each mycell In Marks Total = Total + mycell.Value If mycell.Value < 33 Then CountOfFailedSubject = CountOfFailedSubject + 1 End If Next mycell
This code checks for every cell in the ‘Marks’ range. It adds the value of every cell in the ‘Total’ variable. If the cell’s value is less than 33, add 1 to the ‘CountOfFailedSubject’ variable.
If Total >= 200 And CountOfFailedSubject <= 2 And CountOfFailedSubject > 0 Then ResultOfStudents = "Essential Repeat" ElseIf Total >= 200 And CountOfFailedSubject = 0 Then ResultOfStudents = "Passed" Else ResultOfStudents = "Failed" End If
This code checks the value of ‘Total’ and ‘CountOfFailedSubject’ and passes the ‘Essential Report,’ ‘Passed,’ or ‘Failed’ to the ‘ResultOfStudents.’
Step 3: Apply ResultOfStudents Function to Get Result
ResultOfStudents function takes marks, i.e., selecting 5 marks scored by the student.
Now, select the range of cells, B2: F2.
Drag the formula to the rest of the cells.
Step 4: Create ‘GradeForStudent’ Function to get Grades
Now to find out the grade for the student, we will create one more function named ‘GradeForStudent.’
The code would be:
Function GradeForStudent(TotalMarks As Integer, Result As String) As String If TotalMarks > 440 And TotalMarks <= 500 And ((Result = "Passed" Or Result = "Essential Repeat") Or Result = "Essential Repeat") Then GradeForStudent = "A" ElseIf TotalMarks > 380 And TotalMarks <= 440 And (Result = "Passed" Or Result = "Essential Repeat") Then GradeForStudent = "B" ElseIf TotalMarks > 320 And TotalMarks <= 380 And (Result = "Passed" Or Result = "Essential Repeat") Then GradeForStudent = "C" ElseIf TotalMarks > 260 And TotalMarks <= 320 And (Result = "Passed" Or Result = "Essential Repeat") Then GradeForStudent = "D" ElseIf TotalMarks >= 200 And TotalMarks <= 260 And (Result = "Passed" Or Result = "Essential Repeat") Then GradeForStudent = "E" ElseIf TotalMarks < 200 Or Result = "Failed" Then GradeForStudent = "F" End If End Function
This function assigns a ‘Grade’ to the student based on the ‘Total Marks’ and ‘Result.’
We need to write the formula and open the brackets in cell H2. Press Ctrl+Shift+A to find out the arguments.
The GradeForStudent function takes Total marks (sum of marks) and the result of the student as an argument to calculate the grade.
Now, select the individual cells, G2 and H2.
Now, we need to press Ctrl+D after selecting the cells to copy down the formulas.
We can highlight the values of less than 33 with the red background color to find out the subjects in which the student failed.
Recommended Articles
This article is a guide to VBA Functions. Here, we discuss creating custom functions using VBA code, practical examples, and a downloadable Excel template. You may learn more about VBA from the following articles:-
- VBA IIFThe «VBA IIF» condition evaluates the supplied expression or logical test and returns TRUE or FALSE as a result.read more
- SUMIF With VLOOKUPSUMIF is used to sum cells based on some condition, which takes arguments of range, criteria, or condition, and cells to sum. When there is a large amount of data available in multiple columns, we can use VLOOKUP as the criteria.read more
- Excel SUMIF Between Two DatesWhen we wish to work with data that has serial numbers with different dates and the condition to sum the values is based between two dates, we use Sumif between two dates. read more
- Excel VBA Delete RowIn VBA, to delete the command and to delete any rows together, the trick is that we give a single row reference if we need to delete a single row. However, for the multiple columns, we can provide numerous row references.read more
На чтение 31 мин. Просмотров 15.4k.
С помощью 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.
- Перейти к Вставить и нажмите на модуль. Это вставит объект модуля для вашей книги.
- Скопируйте и вставьте код в окно модуля.
Процедуры «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
Skip to content
В решении многих задач обычные функции Excel не всегда могут помочь. Если существующих функций недостаточно, Excel позволяет добавить новые настраиваемые пользовательские функции (UDF). Они делают вашу работу легче.
Мы расскажем, как можно их создать, какие они бывают и как использовать их, чтобы ваша работа стала проще. Узнайте, как записать и использовать пользовательские функции, которые многие называют макросами..
- Что такое пользовательская функция
- Для чего ее используют?
- Как создать пользовательскую функцию в VBA?
- Как использовать пользовательскую функцию в формуле?
- Какие бывают типы пользовательских функций
Что такое пользовательская функция в Excel?
На момент написания этой статьи Excel предлагает вам более 450 различных функций. С их помощью вы можете выполнять множество различных операций. Но разработчики Microsoft Excel не могли предвидеть все задачи, которые нам нужно решать. Думаю, что многие из вас встречались с этими проблемами:
- не все данные могут быть обработаны стандартными функциями (например, даты до 1900 года).
- формулы могут быть весьма длинными и сложными. Их невозможно запомнить, трудно понять и сложно изменить для решения новой задачи.
- Не все задачи могут быть решены при помощи стандартных функций Excel (в частности, нельзя извлечь интернет-адрес из гиперссылки).
- Невозможно автоматизировать часто повторяющиеся стандартные операции (импорт данных из бухгалтерской программы на лист Excel, форматирование дат и чисел, удаление лишних колонок).
Как можно решить эти проблемы?
- Для очень сложных формул многие пользователи создают архив рабочих книг с примерами. Они копируют оттуда нужную формулу и применяют ее в своей таблице.
- Создание макросов VBA.
- Создание пользовательских функций при помощи редактора VBA.
Хотя первые два варианта кажутся вам знакомыми, третий может вызвать некоторую путаницу. Итак, давайте подробнее рассмотрим настраиваемые функции в Excel и решим, стоит ли их использовать.
Пользовательская функция – это настраиваемый код, который принимает исходные данные, производит вычисление и возвращает желаемый результат.
Исходными данными могут быть числа, текст, даты, логические значения, массивы. Результатом вычислений может быть значение любого типа, с которым работает Excel, или массив таких значений.
Другими словами, пользовательская функция – это своего рода модернизация стандартных функций Excel. Вы можете использовать ее, когда возможностей обычных функций недостаточно. Основное ее назначение – дополнить и расширить возможности Excel, выполнить действия, которые невозможны со стандартными возможностями.
Существует несколько способов создания собственных функций:
- при помощи Visual Basic for Applications (VBA). Этот способ описывается в данной статье.
- с использованием замечательной функции LAMBDA, которая появилась в Office365.
- при помощи Office Scripts. На момент написания этой статьи они доступны в Excel Online в подписке на Office365.
Посмотрите на скриншот ниже, чтобы увидеть разницу между двумя способами извлечения чисел — с использованием формулы и пользовательской функции ExtractNumber().
Даже если вы сохранили эту огромную формулу в своем архиве, вам нужно ее найти, скопировать и вставить, а затем аккуратно поправить все ссылки на ячейки. Согласитесь, это потребует затрат времени, да и ошибки не исключены.
А на ввод функции вы потратите всего несколько секунд.
Для чего можно использовать?
Вы можете использовать настраиваемую функцию одним из следующих способов:
- В формуле, где она может брать исходные данные из вашего рабочего листа и возвращать рассчитанное значение или массив значений.
- Как часть кода макроса VBA или другой пользовательской функции.
- В формулах условного форматирования.
- Для хранения констант и списков данных.
Для чего нельзя использовать пользовательские функции:
- Любого изменения другой ячейки, кроме той, в которую она записана,
- Изменения имени рабочего листа,
- Копирования листов рабочей книги,
- Поиска и замены значений,
- Изменения форматирования ячейки, шрифта, фона, границ, включения и отключения линий сетки,
- Вызова и выполнения макроса VBA, если его выполнение нарушит перечисленные выше ограничения. Если вы используете строку кода, который не может быть выполнен, вы можете получить ошибку RUNTIME ERROR либо просто одну из стандартных ошибок (например, #ЗНАЧЕН!).
Как создать пользовательскую функцию в VBA?
Прежде всего, необходимо открыть редактор Visual Basic (сокращенно — VBE). Обратите внимание, что он открывается в новом окне. Окно Excel при этом не закрывается.
Самый простой способ открыть VBE — использовать комбинацию клавиш. Это быстро и всегда доступно. Нет необходимости настраивать ленту или панель инструментов быстрого доступа. Нажмите Alt + F11
на клавиатуре, чтобы открыть VBE. И снова нажмите Alt + F11
, когда редактор открыт, чтобы вернуться назад в окно Excel.
После открытия VBE вам нужно добавить новый модуль. В него вы будете записывать ваш код. Щелкните правой кнопкой мыши на панели проекта VBA слева и выберите «Insert», затем появившемся справа окне — “Module”.
Справа появится пустое окно модуля, в котором вы и будете создавать свою функцию.
Прежде чем начать, напомним правила, по которым создается функция.
- Пользовательская функция всегда начинается с оператора Function и заканчивается инструкцией End Function.
- После оператора Function указывают имя функции. Это название, которое вы создаете и присваиваете, чтобы вы могли идентифицировать и использовать ее позже. Оно не должно содержать пробелов. Если вы хотите разделять слова, используйте подчеркивания. Например, Count_Words.
- Кроме того, это имя также не может совпадать с именами стандартных функций Excel. Если вы сделаете это, то всегда будет выполняться стандартная функция.
- Имя пользовательской функции не может совпадать с адресами ячеек на листе. Например, имя ABC1234 невозможно присвоить.
- Настоятельно рекомендуется давать описательные имена. Тогда вы можете легко выбрать нужное из длинного списка функций. Например, имя CountWords позволяет легко понять, что она делает, и при необходимости применить ее для подсчета слов.
- Далее в скобках обычно перечисляют аргументы. Это те данные, с которыми она будет работать. Может быть один или несколько аргументов. Если у вас несколько аргументов, их нужно перечислить через запятую.
- После этого обычно объявляются переменные, которые использует пользовательская функция. Указывается тип этих переменных – число, дата, текст, массив.
- Если операторы, которые вы используете внутри вашей функции, не используют никакие аргументы (например, NOW (СЕЙЧАС), TODAY (СЕГОДНЯ) или RAND (СЛЧИС)), то вы можете создать функцию без аргументов. Также аргументы не нужны, если вы используете функцию для хранения констант (например, числа Пи).
- Затем записывают несколько операторов VBA, которые выполняют вычисления с использованием переданных аргументов.
- В конце вы должны вставить оператор, который присваивает итоговое значение переменной с тем же именем, что и имя функции. Это значение возвращается в формулу, из которой была вызвана пользовательская функция.
- Записанный вами код может включать комментарии. Они помогут вам не забыть назначение функции и отдельных ее операторов. Если вы в будущем захотите внести какие-то изменения, комментарии будут вам очень полезны. Комментарий всегда начинается с апострофа (‘). Апостроф указывает Excel игнорировать всё, что записано после него, и до конца строки.
Теперь давайте попробуем создать вашу первую собственную формулу. Для начала мы создаем код, который будет подсчитывать количество слов в диапазоне ячеек.
Для этого в окно модуля вставим этот код:
Function CountWords(NumRange As Range) As Long
Dim rCell As Range, lCount As Long
For Each rCell In NumRange
lCount = lCount + _
Len(WorksheetFunction.Trim(rCell)) - Len(Replace(WorksheetFunction.Trim(rCell), " ", "")) + 1
Next rCell
CountWords = lCount
End Function
Я думаю, здесь могут потребоваться некоторые пояснения.
Код функции всегда начинается с пользовательской процедуры Function. В процедуре Function мы делаем описание новой функции.
В начале мы должны записать ее имя: CountWords.
Затем в скобках указываем, какие исходные данные она будет использовать. NumRange As Range означает, что аргументом будет диапазон значений. Сюда нужно передать только один аргумент — диапазон ячеек, в котором будет происходить подсчёт.
As Long указывает, что результат выполнения функции CountWords будет целым числом.
Во второй строке кода мы объявляем переменные.
Оператор Dim объявляет переменные:
rCell — переменная диапазона ячеек, в котором мы будем подсчитывать слова.
lCount — переменная целое число, в которой будет записано число слов.
Цикл For Each… Next предназначен для выполнения вычислений по отношению к каждому элементу из группы элементов (нашего диапазона ячеек). Этот оператор цикла применяется, когда неизвестно количество элементов в группе. Начинаем с первого элемента, затем берем следующий и так повторяем до самого последнего значения. Цикл повторяется столько раз, сколько ячеек имеется во входном диапазоне.
Внутри этого цикла с значением каждой ячейки выполняется операция, которая вычисляет количество слов:
Len(WorksheetFunction.Trim(rCell)) — Len(Replace(WorksheetFunction.Trim(rCell), » «, «»)) + 1
Как видите, это обычная формула Excel, которая использует стандартные средства работы с текстом: LEN, TRIM и REPLACE. Это английские названия знакомых нам русскоязычных ДЛСТР, СЖПРОБЕЛЫ и ЗАМЕНИТЬ. Вместо адреса ячейки рабочего листа используем переменную диапазона rCell. То есть, для каждой ячейки диапазона мы последовательно считаем количество слов в ней.
Подсчитанные числа суммируются и сохраняются в переменной lCount:
lCount = lCount + Len(WorksheetFunction.Trim(rCell)) — Len(Replace(WorksheetFunction.Trim(rCell), » «, «»)) + 1
Когда цикл будет завершен, значение переменной присваивается функции.
CountWords = lCount
Функция возвращает в ячейку рабочего листа значение этой переменной, то есть общее количество слов.
Именно эта строка кода гарантирует, что функция вернет значение lCount обратно в ячейку, из которой она была вызвана.
Закрываем наш код с помощью «End Function».
Как видите, не очень сложно.
Сохраните вашу работу. Для этого просто нажмите кнопку “Save” на ленте VB редактора.
После этого вы можете закрыть окно редактора. Для этого можно использовать комбинацию клавиш Alt+Q
. Или просто вернитесь на лист Excel, нажав Alt+F11
.
Вы можете сравнить работу с пользовательской функцией CountWords и подсчет количества слов в диапазоне при помощи формул.
Как использовать пользовательскую функцию в формуле?
Когда вы создали пользовательскую, она становится доступной так же, как и другие стандартные функции Excel. Сейчас мы узнаем, как создавать с ее помощью собственные формулы.
Чтобы использовать ее, у вас есть две возможности.
Первый способ. Нажмите кнопку fx
в строке формул. Среди появившихся категорий вы увидите новую группу — Определённые пользователем. И внутри этой категории вы можете увидеть нашу новую пользовательскую функцию CountWords.
Второй способ. Вы можете просто записать эту функцию в ячейку так же, как вы это делаете обычно. Когда вы начинаете вводить имя, Excel покажет вам имя пользовательской в списке соответствующих функций. В приведенном ниже примере, когда я ввел = cou , Excel показал мне список подходящих функций, среди которых вы видите и CountWords.
Можно посчитать этой же функцией и количество слов в диапазоне. Запишите в ячейку С3:
=CountWords(A2:A5)
Нажмите Enter
.
Мы только что указали функцию и установили диапазон, и вот результат подсчета: 14 слов.
Для сравнения в C1 я записал формулу массива, при помощи которой мы также можем подсчитать количество слов в диапазоне.
Как видите, результаты одинаковы. Только использовать CountWords() гораздо проще и быстрее.
Различные типы пользовательских функций с использованием VBA.
Теперь мы познакомимся с разными типами пользовательских функций в зависимости от используемых ими аргументов и результатов, которые они возвращают.
Без аргументов.
В Excel есть несколько стандартных функций, которые не требуют аргументов (например, СЛЧИС , СЕГОДНЯ , СЕЧАС). Например, СЛЧИС возвращает случайное число от 0 до 1. СЕГОДНЯ вернет текущую дату. Вам не нужно передавать им какие-либо значения.
Вы можете создать такую функцию и в VBA.
Ниже приведен код, который запишет в ячейку имя вашего рабочего листа.
Function SheetName() as String
Application.Volatile
SheetName = Application.Caller.Worksheet.Name
End Function
Или же можно использовать такой код:
SheetName = ActiveSheet.Name
Обратите внимание, что в скобках после имени нет ни одного аргумента. Здесь не требуется никаких аргументов, так как результат, который нужно вернуть, не зависит от каких-либо значений в вашем рабочем файле.
Приведенный выше код определяет результат функции как тип данных String (поскольку желаемый результат — это имя файла, которое является текстом). Если вы не укажете тип данных, то Excel будет определять его самостоятельно.
С одним аргументом.
Создадим простую функцию, которая работает с одним аргументом, то есть с одной ячейкой. Наша задача – извлечь из текстовой строки последнее слово.
Function ReturnLastWord(The_Text As String)
Dim stLastWord As String
'Extracts the LAST word from a text string
stLastWord = StrReverse(The_Text)
stLastWord = Left(stLastWord, InStr(1, stLastWord, " ", vbTextCompare))
ReturnLastWord = StrReverse(Trim(stLastWord))
End Function
Аргумент The_Text — это значение выбранной ячейки. Указываем, что это должно быть текстовое значение (As String).
Оператор StrReverse возвращает текст с обратным порядком следования знаков. Далее InStr определяет позицию первого пробела. При помощи Left получаем все знаки заканчивая первым пробелом. Затем удаляем пробелы при помощи Trim. Вновь меняем порядок следования символов при помощи StrReverse. Получаем последнее слово из текста.
Поскольку эта функция принимает значение ячейки, нам не нужно использовать здесь Application.Volatile. Как только аргумент изменится, функция автоматически обновится.
Использование массива в качестве аргумента.
Многие функции Excel используют массивы значений как аргументы. Вспомните функции СУММ, СУММЕСЛИ, СУММПРОИЗВ.
Мы уже рассмотрели эту ситуацию выше, когда учились создавать пользовательскую функцию для подсчета количества слов в диапазоне ячеек.
Приведённый ниже код создает функцию, которая суммирует все чётные числа в указанном диапазоне ячеек.
Function SumEven(NumRange as Range)
Dim RngCell As Range
For Each RngCell In NumRange
If IsNumeric(RngCell.Value) Then
If RngCell.Value Mod 2 = 0 Then
Result = Result + RngCell.Value
End If
End If
Next RngCell
SumEven = Result
End Function
Аргумент NumRange указан как Range. Это означает, что функция будет использовать массив исходных данных. Необходимо отметить, что можно использовать также тип переменной Variant. Это выглядит как
Function SumEven(NumRange as Variant)
Тип Variant обеспечивает «безразмерный» контейнер для хранения данных. Такая переменная может хранить данные любого из допустимых в VBA типов, включая числовые значения, текст, даты и массивы. Более того, одна и та же такая переменная в одной и той же программе в разные моменты может хранить данные различных типов. Excel самостоятельно будет определять, какие данные передаются в функцию.
В коде есть цикл For Each … Next, который берет каждую ячейку и проверяет, есть ли в ней число. Если это не так, то ничего не происходит, и он переходит к следующей ячейке. Если найдено число, он проверяет, четное оно или нет (с помощью функции MOD).
Все чётные числа суммируются в переменной Result.
Когда цикл будет закончен, значение Result присваивается переменной SumEven и передаётся функции.
С несколькими аргументами.
Большинство функций Excel имеет несколько аргументов. Не являются исключением и пользовательские функции. Поэтому так важно уметь создавать собственные функции с несколькими аргументами.
В приведенном ниже коде создается функция, которая выбирает максимальное число в заданном интервале.
Она имеет 3 аргумента: диапазон значений, нижняя граница числового интервала, верхняя граница интервала.
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum)
Dim NumRange As Range
Dim vMax
Dim arrNums()
Dim i As Integer
ReDim arrNums(rngCells.Count)
For Each NumRange In rngCells
vMax = NumRange
Select Case vMax
Case MinNum + 0.01 To MaxNum - 0.01
arrNums(i) = vMax
i = i + 1
Case Else
GetMaxBetween = 0
End Select
Next NumRange
GetMaxBetween = WorksheetFunction.Max(arrNums)
End Function
Здесь мы используем три аргумента. Первый из них — rngCells As Range. Это диапазон ячеек, в которых нужно искать максимальное значение. Второй и третий аргумент (MinNum, MaxNum) указаны без объявления типа. Это означает, что по умолчанию к ним будет применён тип данных Variant. В VBA используется 6 различных числовых типов данных. Указывать только один из них — это значит ограничить применение функции. Поэтому более целесообразно, если Excel сам определит тип числовых данных.
Цикл For Each … Next последовательно просматривает все значения в выбранном диапазоне. Числа, которые находятся в интервале от максимального до минимального значения, записываются в специальный массив arrNums. При помощи стандартного оператора MAX в этом массиве находим наибольшее число.
С обязательными и необязательными аргументами.
Чтобы понять, что такое необязательный аргумент, вспомните функцию ВПР (VLOOKUP). Её четвертый аргумент [range_lookup] является необязательным. Если вы не укажете один из обязательных аргументов, получите ошибку. Но если вы пропустите необязательный аргумент, всё будет работать.
Но необязательные аргументы не бесполезны. Они позволяют вам выбирать вариант расчётов.
Например, в функции ВПР, если вы не укажете четвертый аргумент, будет выполнен приблизительный поиск. Если вы укажете его как ЛОЖЬ (или 0), то будет найдено точное совпадение.
Если в вашей пользовательской функции есть хотя бы один обязательный аргумент, то он должен быть записан в начале. Только после него могут идти необязательные.
Чтобы сделать аргумент необязательным, вам просто нужно добавить «Optional» перед ним.
Теперь давайте посмотрим, как создать функцию в VBA с необязательными аргументами.
Function GetText(textCell As Range, Optional CaseText = False) As String
Dim StringLength As Integer
Dim Result As String
StringLength = Len(textCell)
For i = 1 To StringLength
If Not (IsNumeric(Mid(textCell, i, 1))) Then Result = Result & Mid(textCell, i, 1)
Next i
If CaseText = True Then Result = UCase(Result)
GetText = Result
End Function
Этот код извлекает текст из ячейки. Optional CaseText = False означает, что аргумент CaseText необязательный. По умолчанию его значение установлено FALSE.
Если необязательный аргумент CaseText имеет значение TRUE, то возвращается результат в верхнем регистре. Если необязательный аргумент FALSE или опущен, результат остается как есть, без изменения регистра символов.
Думаю, что у вас возник вопрос: «Могут ли в пользовательской функции быть только необязательные аргументы?». Ответ смотрите ниже.
Только с необязательным аргументом.
Насколько мне известно, нет встроенной функции Excel, которая имеет только необязательные аргументы. Здесь я могу ошибаться, но я не могу припомнить ни одной такой.
Но при создании пользовательской такое возможно.
Перед вами функция, которая записывает в ячейку имя пользователя.
Function UserName(Optional Uppercase As Variant)
If IsMissing(Uppercase) Then Uppercase = False
UserName = Application.UserName
If Uppercase Then UserName = UCase(UserName)
End Function
Как видите, здесь есть только один аргумент Uppercase, и он не обязательный.
Если аргумент равен FALSE или опущен, то имя пользователя возвращается без каких-либо изменений. Если же аргумент TRUE, то имя возвращается в символах верхнего регистра (с помощью VBA-оператора Ucase). Обратите внимание на вторую строку кода. Она содержит VBA-функцию IsMissing, которая определяет наличие аргумента. Если аргумент отсутствует, оператор присваивает переменной Uppercase значение FALSE.
Можно предложить и другой вариант этой функции.
Function UserName(Optional Uppercase As Variant)
If IsMissing(Uppercase) Then Uppercase = False
UserName = Application.UserName
If Uppercase Then UserName = UCase(UserName)
End Function
В этом случае необязательный аргумент имеет значение по умолчанию FALSE. Если функция будет введена без аргументов, то значение FALSE будет использовано по умолчанию и имя пользователя будет получено без изменения регистра символов. Если будет введено любое значение кроме нуля, то все символы будут преобразованы в верхний регистр.
Возвращаемое значение — массив.
В VBA имеется весьма полезная функция — Array. Она возвращает значение с типом данных Variant, которое представляет собой массив (т.е. несколько значений).
Пользовательские функции, которые возвращают массив, весьма полезны при хранении массивов значений. Например, Months() вернёт массив названий месяцев:
Function Months() As Variant
Months = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", _
"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")
End Function
Обратите внимание, что функция выводит данные в строке, по горизонтали.
В Office365 и выше можно вводить как обычную формулу, в более ранних версиях – как формулу массива.
А если необходим вертикальный массив значений?
Мы уже говорили ранее, что созданные нами функции можно использовать в формулах Excel вместе со стандартными.
Используем Months() как аргумент функции ТРАНСП:
=ТРАНСП(Months())
Как можно использовать пользовательские функции с массивом данных? Можно применять их для ввода данных в таблицу, как показано на рисунке выше. К примеру, в отчёте о продажах не нужно вручную писать названия месяцев.
Можно получить название месяца по его номеру. Например, в ячейке A1 записан номер месяца. Тогда название месяца можно получить при помощи формулы
=ИНДЕКС(Months();1;A1)
Альтернативный вариант этой формулы:
=ИНДЕКС( {«Январь»; «Февраль»; «Март»; «Апрель»; «Май»; «Июнь»; «Июль»; «Август»; «Сентябрь»; «Октябрь»; «Ноябрь»; «Декабрь»};1;A1)
Согласитесь, написанная нами функция делает формулу Excel значительно проще.
Эта статья откроет серию материалов о пользовательских функциях. Если мне удалось убедить вас, что это стоит использовать или вы хотели бы попробовать что-то новое в Excel, следите за обновлениями;)