Программа для решения некоторой задачи может иметь сложную структуру и состоять из любого количества операторов.
Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые
Преимущества
Процедура может располагаться на любом процедурном листе, в любом модуле или открытом проекте и может вызываться из любой процедуры.
Процедура состоит из некоторого количества операторов, объединенных в группу для решения некоторой задачи, т.е. это последовательность операторов языка, к которым возможно обращение как к связанной группе операторов. Невозможно выполнить часть процедуры - можно выполнить процедуру только целиком.
Важно
Option Explicit ), объявления модульных, глобальных переменных и переменных Обычно в составе проекта присутствуют
В качестве вызываемых процедур применяются подпрограммы и функции: процедуры-функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают.
Замечание
Чтобы отличать процедуры-функции от остальных процедур, для последних будем использовать термин "процедуры общего типа". Для краткости вместо термина "процедура-функция" будем использовать термин "функция".
Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями. Событие, например, - это нажатие
Удобно
Auto_Open - автопоцедура, выполняемая при открытии документа.Далее под термином "процедура" будем подразумевать любую процедуру - вызывающую, вызываемую, процедуру-функцию или событийную процедуру, если специально не оговорено иное.
Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими двумя операторами, составляют
При вставке новой процедуры с использованием команды Insert-Procedure в окне кода автоматически появляются команды начала и окончания процедуры (функции) - достаточно в диалоге задать название новой процедуры и выбрать ее тип.
Выход из процедуры обычно происходит естественным образом - при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции).
Запомните
Оператор объявления процедуры присваивает ей имя и перечисляет
[Private|Public][Static] Sub name ([arglist])
Private или Public (указывается одно из двух) определяют область видимости процедуры:Private определяет, что процедура доступна только в том модуле, в котором она объявлена;Public объявляет процедуру доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.Важно
Option Private, то процедуры, размещенные в этом модуле, не доступны вне проекта.Private и Public опущены, то процедура считается общедоступной - Public.Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры.name - имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля.Оператор
[Private|Public][Static] Function name ([arglist]) [As Type]
Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным наличием типа Type возвращаемого функцией значения, который является необязательным в объявлении функции.
Важно
Variant .Процедуры проекта могут быть связаны между собой сложным образом: одни процедуры могут вызывать другие процедуры, которые в свою очередь могут вызывать дополнительные процедуры. Некоторые процедуры могут автоматически выполняться, если случается некоторое событие и для них не требуются команды вызова, но они могут обращаться к процедурам общего типа или к процедурам-функциям. Вызов процедуры общего типа отличается от вызова процедуры-функции.
proc_A или b=func_b.proc_A arg1, arg2.func_b(arg1, arg2).Call, задавая значения аргументов в скобках Call proc_A(arg1, Arg2).Сервис-Макрос -Макросы , а может быть только вызвана другой процедурой или функцией.Сервис-Макрос -Макросы .Напомним, что после выполнения вызванной процедуры происходит возврат к команде, следующей за вызовом процедуры.
Вызываемая процедура может находиться в том же модуле (проекте), что и вызвавшая ее процедура, или в другом модуле (проекте).
Важно
Это производится стандартным способом - в операторе вызова процедуры указывается
ProjectName.ModuleName.ProcedureName
Например, вызов процедуры Proc_A, расположенной в модуле Module1 проекта Project1 можно записать так: Project1.Module1.Proc_A.
Замечание
Пример
Процедура высвечивает приветствие после ввода пользователем своего имени.
(рис 7.1) Пример основной и вызываемой процедурыВ результате выполнения операторов 1-го и 2-го способов высвечивается приветствие "Hello, Conrad".
Через список параметров осуществляется связь между вызывающей и вызываемой процедурами. Параметр:
Значение, которое будет подставлено вместо параметра при вызове процедуры, называется аргументом. Передаваемые аргументы являются позиционными, т.к. своей позицией в списке каждый аргумент должен показать, какой параметр он заменяет.
В качестве аргументов процедуре можно передать значения переменных, выражения, константы или массивы, но обязательно тип передаваемого аргумента должен соответствовать типу параметра или корректно преобразовываться к нему.
Пример
Для первых пяти натуральных чисел рассчитать квадрат и куб числа (рис 7.2).
Основная процедура Proc_param организует цикл на пять чисел и вызывает процедуру Proc_print для распечатки в окне Immediate самого числа, его квадрата и куба.
(рис 7.2) Пример основной и вызываемой процедуры для расчета куба и квадрата числаПри вызове процедуры происходит передача аргумента i, который используется в Proc_print уже как значение формального параметра fi. i и fi совпадают.
Call Proc_print (i) - альтернативная запись вызова процедуры.
Замечания
Синтаксис описания каждого параметра процедуры имеет следующий вид:
[[Optional][ByVal|ByRef][ParamArray] varname[( )] As type][= defaultvalue]
Optional - ключевое слово. Указывает, что параметр может быть опущен.Важно
Variant .IsMissing(argname). Она возвращает значение True, если значение параметра опущено, и False - в противном случае.ParamArray означает передачу необязательного аргумента - массива типа Variant с неопределенным количеством элементов.Важно
Ключевое слово ParamArray
ByVal, ByRef и Optional для описываемого параметра.Varname - type - тип передаваемого аргумента. Если тип данных не указан, то VBA трактует аргумент как Variant .Важно
String должен иметь переменную длину.Нарушение одного из перечисленных условий может вызвать ошибку выполнения. Определение типа передаваемого значения позволяет повысить эффективность программы и избежать ошибок, связанных с неверно переданным аргументом.
Value on default - для необязательных аргументов устанавливает значение по умолчанию.В качестве передаваемых аргументов можно использовать выражения. ByVal.
Пример
Для сотрудников фирмы (максимально 2000 сотрудников) рассчитать выплаты в соответствии с количеством отработанных часов и ставкой оплаты за час работы. Налог составляет 13%. Если зарплата превышает 300$, то страховой взнос составляет 5%.
Процедура salary_employee (основная) запрашивает ввод количества отработанных часов и размер почасовой оплаты максимально для 2000 сотрудников и передает по значению эти данные в процедуру salary_em_proc.
Вызываемая процедура salary_em_proc рассчитывает и распечатывает денежную выплату. В вызываемой процедуре salary_em_proc определены три параметра. Это io - код сотрудника, ho - количество часов, - ставка почасовой оплаты.
(рис 7.3) Передача аргументов по значениюИзменим задачу, чтобы показать способ передачи аргументов по ссылке. Пусть дополнительно в вызываемой процедуре будет рассчитываться суммарная выплата, значение которой в измененном виде будет доступно основной процедуре.
В основной процедуре salary_employee объявите переменную , в которой будет накапливаться суммарная выплата. В вызываемой процедуре введите четвертый параметр - накапливаемая сумма. Этот параметр передается по ссылке, т.к. его значение изменяется в вызываемой процедуре. Оператор вызова процедуры будет выглядеть так: salary_em_sum id, h, r, .
(рис 7.4) Передача аргумента по ссылке (параметр SI)
При написании процедуры-функции сохраняются все возможности, используемые при написании процедур общего типа, но дополнительно процедура-функция может возвращать результирующее значение в своем имени. В теле функции достаточно предусмотреть оператор присваивания, который установит значение результата:
function name=expression
Если значение явно не присваивается, то оно устанавливается по умолчанию в соответствии с типом возвращаемого значения: 0 - для числовых типов, строку нулевой длины - для строковых переменных, Empty - для типа и Nothing - для ссылок на объекты.
Замечание
Если тип возвращаемого функцией значения зависит от обстоятельств, то используйте для возвращаемого значения тип .
Пример
Функция возвращает количество выделенных ячеек, если тип выделения - объект Range (подробно об объекте Range см. Лекцию 8). Если выделен объект другого типа, например, встроенная диаграмма или рисунок, то возвращаемое значение -
Для присвоения значения функции записаны два
В вызывающей процедуре вычисленное функцией значение сохраняется на активном листе в ячейках D1 (количество ячеек в интервале A1:C5 ) и D2 (сообщение о некорректности выделения).
(рис 7.5) Пример сохранения вычисленного функцией значения на активном листе
При построении формулы с помощью мастера функций
Пример
Создать функцию расчета выплат, учитывая, что налог составляет 13% и, если зарплата превышает 300 $, то в страховой фонд дополнительно взимается 5%.
В отличие от процедуры salary_em_proc функция salary_em_ возвращает рассчитанное значение. Возврат значения происходит при помощи операторов присваивания, в которых слева используется salary_employee вместо оператора вызова процедуры salary_em_proc io, h, r записан оператор, распечатывающий рассчитанную выплату как MsgBox io " salary " salary_em(h, r).
(рис 7.6) Пример высвечивания в диалоге значения, вычисленного функциейФункцию salary_em_ можно использовать как в процедурах VBA, так и на рабочем листе, как пользовательскую функцию.
На рис 7.7 в ячейку E3 введены отработанные часы, а в ячейку F3 - ставка оплаты за час. В ячейке G3 рассчитана выплата по формуле =salary_em_(E3;F3).
(рис 7.7) Использование функции salary_em_ как пользовательской функции на рабочем листеЗамечания
При задании аргументов процедур можно использовать либо позиционное, либо произвольное расположение аргументов.
В первом случае VBA интерпретирует не только сами аргументы, но и порядок их расположения, предполагая, что они перечислены в соответствии с расположением
Использование поименованных аргументов исключает влияние позиции аргумента на его интерпретацию. Для задания поименованных аргументов после названия формального параметра вызываемой процедуры поставьте оператор назначения - двоеточие и знак равенства ( := ), за которым укажите передаваемое значение аргумента.
Преимущества
Используя поименованные аргументы, к функции расчета выплат можно было бы обратиться так: salary_em(.
Пример
Процедура запрашивает имя и фамилию и составляет адрес электронной почты на Yandex из первой буквы имени и фамилии полностью.
Диалоговое окно запроса на ввод имени и фамилии размещается на экране, при этом используются координаты xpos=100 и ypos=100. В первом операторе InputBox применяются позиционные аргументы - пропущенные два аргумента отмечены запятыми. Во втором операторе InputBox используются поименованные аргументы.
(рис 7.8) Использование поименованных аргументов при вызове функцииФункция Left выделяет первую букву имени. Подробно об аргументах функций InputBox и Left см. ниже.
Ключевое слово Optional, задаваемое при описании параметров процедуры, предполагает, что значение параметра не обязательно будет передано в процедуру. Иными словами, аргумент возможен, но необязателен.
Пример
Функция рассчитывает налоговые выплаты и имеет два параметра S - доход, R - ставка налога. Если ставка налога не задана, то налог рассчитывается, исходя из 13%.
Если количество аргументов, передаваемых вызываемой процедуре, неизвестно до момента вызова процедуры, то последний параметр в заголовке вызываемой процедуры должен быть описан как ParamArray. Тогда при вызове процедуры последний аргумент рассматривается как массив переменных типа и внутри процедуры производятся действия уже с массивом.
Замечание
Ubound для определения количества элементов в передаваемом массиве.Пример
Создать функцию умножения аргументов.
Для умножения произвольного количества аргументов можно предложить два варианта функций:
В вызывающей процедуре mult_arr создается массив из восьми чисел, элементы которого перемножаются при помощи функций multr или multa.
Результат умножения выводится в окно Immediate Window.
Напомним, что Option не указывает на другое.
(рис 7.11) Вызывающая процедура и оба способа записи функции
Если процедурам присвоить специальные имена, то они запускаются автоматически.
Auto_Open автоматически запускается при открытии Auto_Close автоматически запускается при закрытии Обычно в этих процедурах создаются панели инструментов, разрешается или отменяется их высвечивание, производятся настройки экрана или изменяются меню.
Запомните
С каждым объектом приложения или формы связан определенный набор событий. Процедуры обработки событий позволяют выполнить некоторые действия при наступлении того или иного события, связанного с объектом приложения.
Событийные процедуры записываются на процедурных листах - листах-обработчиках событий. Двойной щелчок на объект в окне проекта (рабочая книга, рабочий или диаграммный лист, форма) открывает процедурный лист, связанный с выбранным объектом приложения.
Событийные процедуры имеют составные имена: название или тип объекта и название события, разделенные нижним подчеркиванием ( _ ). Например, процедура с именем Workbook_Open выполняется при открытии
Пример
На рис 7.12 в окне проекта выбрана рабочая книга (объект Эта книга ). В списке объектов на процедурном листе . Как следствие в списке процедур раскрыт .
(рис 7.12) Выбор события Open для объекта Эта книгаДля события Open, выбранного из списка событий, в окне программы появились операторы начала и конца соответствующей событийной процедуры. Имя процедуры установлено автоматически. Теперь можно записать операторы, которые должны выполняться при наступлении события - открытия
При открытии iserror название
(рис 7.13) Результат выполнения событийной процедуры открытия рабочей книги iserrorЯзык Visual Basic имеет большое число встроенных функций. Это
(рис 7.14) Классы функций и перечень строковых функцийКлассы функций можно увидеть в Object Browser, выбрав библиотеку VBA.
Дополнительно можно задать название класса функций на английском языке и выполнить поиск.
Наряду с функциями VBA в процедурах можно использовать встроенные функции Max или Min.
При необходимости использования табличной функции нужно сделать уточнение при помощи ссылки на объект ).
ВНИМАНИЕ
Пример
Рассчитать максимум из 4-х чисел и их среднее арифметическое.
Процедура использует две функции Max и . Ниже в примере приведены оба способа ссылок на функции
(рис 7.15) Уточнения при использовании табличных функций
Visual Basic располагает большим набором встроенных функций для обработки алфавитно-цифровых (символьных) данных. Многие из них совпадают с табличными. Но есть табличные
| Название и синтаксис функции | Описание | Примеры |
|---|---|---|
|
Возвращает ASCII- |
возвращает 42 |
|
Возвращает символ по ASCII-коду | возвращает * |
Format(еxpression [,format][,firstdayofweek][,firstweekofyear]) |
Преобразует аргумент в соответствии с заданным форматом | Format(42.399, "#.00") возвращает 42,40
|
|
Возвращает шестнадцатиричное представление числа | возвращает 12
|
InStr([start,] string1, string2[, |
Ищет подстроку в прямом направлении | InStr(1, "To be or not to be", "be") возвращает 4 |
InstrRev(stringcheck, stringmatch[, start][, |
Ищет подстроку в обратном направлении | InstrRev("To be or not to be", "be") возвращает 17 |
LCase(string) |
Преобразует строку в нижний регистр | LCase("World") возвращает world |
Left( |
Выделяет левую часть строки | Left("World", 2) возвращает Wo |
|
Определяет длину строки | возвращает 5 |
LTrim(string) |
Удаляет ведущие пробелы Пробелы справа сохраняются |
LTrim(" возвращает без левых пробелов |
|
Выделяет подстроку | возвращает orl |
Oct(number) |
Возвращает восьмеричное представление числа | Oct(12) возвращает 14 |
|
Заменяет подстроку на новую подстроку | возвращает The |
Right( |
Выделяет правую часть строки | Right("World",2) возвращает ld |
RTrim(string) |
Удаляет завершающие пробелы Пробелы слева сохраняются |
RTrim(" возвращает без правых пробелов |
Space(number) |
Создает строку пробелов | Space(6) создает строку из 6 пробелов |
Str(number) |
Преобразует число в строку | Str(123) возвращает строку 123 |
StrComp(string1, string2[, |
Сравнивает две строки: двоичное сравнение текстуальное сравнение |
StrComp("WORld", "world", 1) возвращает 0 (равенство строк будет обнаружено при текстуальном сравнении) |
String(number, character) |
Создает строку символов | String (5,"*") и String (5,42) возвращают ***** . 42 - ASCII- |
|
Удаляет пробелы с двух сторон строки | возвращает без левых и правых пробелов |
UCase(string) |
Преобразует строку в верхний регистр | UCase("World") возвращает WORLD |
|
Преобразует строку в число | возвращает число 6.28 |
| Функция | Тип результата | Функция | Тип результата | |
|---|---|---|---|---|
CBооl |
Воо1еап |
CCиr |
Сиrrепсу |
|
CDate |
Date |
CDbl |
Doublе |
|
CInt |
Iпtegеr |
CLng |
Long |
|
CSng |
Single |
CStr |
String |
|
CVаr |
|
В качестве параметра функциям преобразования строк передается выражение ( expression ), которое и преобразуется в выбранный тип.
Каждая number ). При использовании действительных чисел как констант разделителем целой и дробной части является точка. В разделе Derived Math Functions справочника по VBA можно найти формулы расчета математических функций, не являющихся встроенными функциями.
| Функция | Описание |
|---|---|
|
Возвращает |
Atn |
Возвращает арктангенс числа |
Cоs |
Возвращает косинус угла* |
Eхр |
Возвращает степень числа e (еx) |
Fiх |
Возвращает целую часть числа |
Int |
Округляет число до меньшего целого числа |
Log |
Возвращает |
Randomize |
Инициирует генератор случайных чисел |
|
Возвращает случайное число |
|
Округляет число до целого, если не задан аргумент numdecimalplaces (десятичный разряд, до которого производится округление) |
Sin |
Возвращает синус угла* |
Sgn |
Возвращает знак числа |
Sqr |
Возвращает квадратный корень из числа |
Тап |
Возвращает тангенс угла* |
| * Углы задаются в радианах. Для перевода градусов в радианы умножьте градусы на /180. | |
Под датой подразумевается переменная типа Date или дата-константа, которая задана согласно системному краткому формату даты с разделителями даты, определенными системной настройкой, и заключена в кавычки c использованием символа "решетка" ( # ).
Важно
Date в памяти компьютера сохраняется как число типа Double. Целая часть числа - это дата, а дробная часть - время.Date: одни сутки - это 24 часа, или 1440 минут, или 86400 секунд.| Название и синтаксис функций | Описание | Пример |
|---|---|---|
Date() * |
Возвращает или устанавливает системную дату | Date_Today=Date() запоминает системную дату
|
DateSerial(year, |
Преобразует в дату три целых числа: год, месяц и день | DateSerial(2007,7,24) возвращает 24.07.2007 |
DateValue(date) |
Преобразует в дату |
DateValue("24 июля 2007") возвращает 24.07.2007 |
| Если год не задан, то используется год из системной даты | ||
Day(date) |
Из даты выделяет день месяца | Day(#7/24/2007#) возвращает 24 |
|
Из заданного времени выделяет часы | возвращает 16 |
Minute(time) |
Из заданного времени выделяет минуты | Minute(#4:35:17 PM#) возвращает 35 |
|
Из даты выделяет месяц | возвращает 7 |
Now() * |
Возвращает текущую дату и текущее время | Date_Today=Now() |
Second(date) |
Из заданного времени выделяет секунды | Second (#4:35:17 PM#) возвращает 17 |
Time() * |
Возвращает или устанавливает системное время | Time_Today= Time() |
* |
Возвращает временной интервал в секундах от полуночи (тип Single ) |
|
TimeSerial( |
Преобразует в дату три целых числа: часы, минуты и секунды | TimeSerial(16, 35, 17) возвращает 16:35:17 |
TimeValue(time) |
Преобразует в дату |
TimeValue("4:35:17PM") возвращает время 16:35:17 |
Weekday(date, [firstdayofweek]) |
Возвращает день недели, соответствующий заданной дате | Weekday(#7/25/2007#, 2) возвращает 3 (третий день недели - среда) |
Year(date) |
Из даты выделяет год | Year(#7/24/2007#) возвращает 2007 |
| * Функции не имеют аргументов и могут записываться без скобок | ||
Программа для решения некоторой задачи может иметь сложную структуру и состоять из любого количества операторов.
Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые
Преимущества
Процедура может располагаться на любом процедурном листе, в любом модуле или открытом проекте и может вызываться из любой процедуры.
Процедура состоит из некоторого количества операторов, объединенных в группу для решения некоторой задачи, т.е. это последовательность операторов языка, к которым возможно обращение как к связанной группе операторов. Невозможно выполнить часть процедуры - можно выполнить процедуру только целиком.
Важно
Option Explicit ), объявления модульных, глобальных переменных и переменных Обычно в составе проекта присутствуют
В качестве вызываемых процедур применяются подпрограммы и функции: процедуры-функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают.
Замечание
Чтобы отличать процедуры-функции от остальных процедур, для последних будем использовать термин "процедуры общего типа". Для краткости вместо термина "процедура-функция" будем использовать термин "функция".
Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями. Событие, например, - это нажатие
Удобно
Auto_Open - автопоцедура, выполняемая при открытии документа.Далее под термином "процедура" будем подразумевать любую процедуру - вызывающую, вызываемую, процедуру-функцию или событийную процедуру, если специально не оговорено иное.
Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими двумя операторами, составляют
При вставке новой процедуры с использованием команды Insert-Procedure в окне кода автоматически появляются команды начала и окончания процедуры (функции) - достаточно в диалоге задать название новой процедуры и выбрать ее тип.
Выход из процедуры обычно происходит естественным образом - при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции).
Запомните
Оператор объявления процедуры присваивает ей имя и перечисляет
[Private|Public][Static] Sub name ([arglist])
Private или Public (указывается одно из двух) определяют область видимости процедуры:Private определяет, что процедура доступна только в том модуле, в котором она объявлена;Public объявляет процедуру доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.Важно
Option Private, то процедуры, размещенные в этом модуле, не доступны вне проекта.Private и Public опущены, то процедура считается общедоступной - Public.Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры.name - имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля.Оператор
[Private|Public][Static] Function name ([arglist]) [As Type]
Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным наличием типа Type возвращаемого функцией значения, который является необязательным в объявлении функции.
Важно
Variant .Процедуры проекта могут быть связаны между собой сложным образом: одни процедуры могут вызывать другие процедуры, которые в свою очередь могут вызывать дополнительные процедуры. Некоторые процедуры могут автоматически выполняться, если случается некоторое событие и для них не требуются команды вызова, но они могут обращаться к процедурам общего типа или к процедурам-функциям. Вызов процедуры общего типа отличается от вызова процедуры-функции.
proc_A или b=func_b.proc_A arg1, arg2.func_b(arg1, arg2).Call, задавая значения аргументов в скобках Call proc_A(arg1, Arg2).Сервис-Макрос -Макросы , а может быть только вызвана другой процедурой или функцией.Сервис-Макрос -Макросы .Напомним, что после выполнения вызванной процедуры происходит возврат к команде, следующей за вызовом процедуры.
Вызываемая процедура может находиться в том же модуле (проекте), что и вызвавшая ее процедура, или в другом модуле (проекте).
Важно
Это производится стандартным способом - в операторе вызова процедуры указывается
ProjectName.ModuleName.ProcedureName
Например, вызов процедуры Proc_A, расположенной в модуле Module1 проекта Project1 можно записать так: Project1.Module1.Proc_A.
Замечание
Пример
Процедура высвечивает приветствие после ввода пользователем своего имени.
(рис 7.1) Пример основной и вызываемой процедурыВ результате выполнения операторов 1-го и 2-го способов высвечивается приветствие "Hello, Conrad".
Через список параметров осуществляется связь между вызывающей и вызываемой процедурами. Параметр:
Значение, которое будет подставлено вместо параметра при вызове процедуры, называется аргументом. Передаваемые аргументы являются позиционными, т.к. своей позицией в списке каждый аргумент должен показать, какой параметр он заменяет.
В качестве аргументов процедуре можно передать значения переменных, выражения, константы или массивы, но обязательно тип передаваемого аргумента должен соответствовать типу параметра или корректно преобразовываться к нему.
Пример
Для первых пяти натуральных чисел рассчитать квадрат и куб числа (рис 7.2).
Основная процедура Proc_param организует цикл на пять чисел и вызывает процедуру Proc_print для распечатки в окне Immediate самого числа, его квадрата и куба.
(рис 7.2) Пример основной и вызываемой процедуры для расчета куба и квадрата числаПри вызове процедуры происходит передача аргумента i, который используется в Proc_print уже как значение формального параметра fi. i и fi совпадают.
Call Proc_print (i) - альтернативная запись вызова процедуры.
Замечания
Синтаксис описания каждого параметра процедуры имеет следующий вид:
[[Optional][ByVal|ByRef][ParamArray] varname[( )] As type][= defaultvalue]
Optional - ключевое слово. Указывает, что параметр может быть опущен.Важно
Variant .IsMissing(argname). Она возвращает значение True, если значение параметра опущено, и False - в противном случае.ParamArray означает передачу необязательного аргумента - массива типа Variant с неопределенным количеством элементов.Важно
Ключевое слово ParamArray
ByVal, ByRef и Optional для описываемого параметра.Varname - type - тип передаваемого аргумента. Если тип данных не указан, то VBA трактует аргумент как Variant .Важно
String должен иметь переменную длину.Нарушение одного из перечисленных условий может вызвать ошибку выполнения. Определение типа передаваемого значения позволяет повысить эффективность программы и избежать ошибок, связанных с неверно переданным аргументом.
Value on default - для необязательных аргументов устанавливает значение по умолчанию.В качестве передаваемых аргументов можно использовать выражения. ByVal.
Пример
Для сотрудников фирмы (максимально 2000 сотрудников) рассчитать выплаты в соответствии с количеством отработанных часов и ставкой оплаты за час работы. Налог составляет 13%. Если зарплата превышает 300$, то страховой взнос составляет 5%.
Процедура salary_employee (основная) запрашивает ввод количества отработанных часов и размер почасовой оплаты максимально для 2000 сотрудников и передает по значению эти данные в процедуру salary_em_proc.
Вызываемая процедура salary_em_proc рассчитывает и распечатывает денежную выплату. В вызываемой процедуре salary_em_proc определены три параметра. Это io - код сотрудника, ho - количество часов, - ставка почасовой оплаты.
(рис 7.3) Передача аргументов по значениюИзменим задачу, чтобы показать способ передачи аргументов по ссылке. Пусть дополнительно в вызываемой процедуре будет рассчитываться суммарная выплата, значение которой в измененном виде будет доступно основной процедуре.
В основной процедуре salary_employee объявите переменную , в которой будет накапливаться суммарная выплата. В вызываемой процедуре введите четвертый параметр - накапливаемая сумма. Этот параметр передается по ссылке, т.к. его значение изменяется в вызываемой процедуре. Оператор вызова процедуры будет выглядеть так: salary_em_sum id, h, r, .
(рис 7.4) Передача аргумента по ссылке (параметр SI)
При написании процедуры-функции сохраняются все возможности, используемые при написании процедур общего типа, но дополнительно процедура-функция может возвращать результирующее значение в своем имени. В теле функции достаточно предусмотреть оператор присваивания, который установит значение результата:
function name=expression
Если значение явно не присваивается, то оно устанавливается по умолчанию в соответствии с типом возвращаемого значения: 0 - для числовых типов, строку нулевой длины - для строковых переменных, Empty - для типа и Nothing - для ссылок на объекты.
Замечание
Если тип возвращаемого функцией значения зависит от обстоятельств, то используйте для возвращаемого значения тип .
Пример
Функция возвращает количество выделенных ячеек, если тип выделения - объект Range (подробно об объекте Range см. Лекцию 8). Если выделен объект другого типа, например, встроенная диаграмма или рисунок, то возвращаемое значение -
Для присвоения значения функции записаны два
В вызывающей процедуре вычисленное функцией значение сохраняется на активном листе в ячейках D1 (количество ячеек в интервале A1:C5 ) и D2 (сообщение о некорректности выделения).
(рис 7.5) Пример сохранения вычисленного функцией значения на активном листе
При построении формулы с помощью мастера функций
Пример
Создать функцию расчета выплат, учитывая, что налог составляет 13% и, если зарплата превышает 300 $, то в страховой фонд дополнительно взимается 5%.
В отличие от процедуры salary_em_proc функция salary_em_ возвращает рассчитанное значение. Возврат значения происходит при помощи операторов присваивания, в которых слева используется salary_employee вместо оператора вызова процедуры salary_em_proc io, h, r записан оператор, распечатывающий рассчитанную выплату как MsgBox io " salary " salary_em(h, r).
(рис 7.6) Пример высвечивания в диалоге значения, вычисленного функциейФункцию salary_em_ можно использовать как в процедурах VBA, так и на рабочем листе, как пользовательскую функцию.
На рис 7.7 в ячейку E3 введены отработанные часы, а в ячейку F3 - ставка оплаты за час. В ячейке G3 рассчитана выплата по формуле =salary_em_(E3;F3).
(рис 7.7) Использование функции salary_em_ как пользовательской функции на рабочем листеЗамечания
При задании аргументов процедур можно использовать либо позиционное, либо произвольное расположение аргументов.
В первом случае VBA интерпретирует не только сами аргументы, но и порядок их расположения, предполагая, что они перечислены в соответствии с расположением
Использование поименованных аргументов исключает влияние позиции аргумента на его интерпретацию. Для задания поименованных аргументов после названия формального параметра вызываемой процедуры поставьте оператор назначения - двоеточие и знак равенства ( := ), за которым укажите передаваемое значение аргумента.
Преимущества
Используя поименованные аргументы, к функции расчета выплат можно было бы обратиться так: salary_em(.
Пример
Процедура запрашивает имя и фамилию и составляет адрес электронной почты на Yandex из первой буквы имени и фамилии полностью.
Диалоговое окно запроса на ввод имени и фамилии размещается на экране, при этом используются координаты xpos=100 и ypos=100. В первом операторе InputBox применяются позиционные аргументы - пропущенные два аргумента отмечены запятыми. Во втором операторе InputBox используются поименованные аргументы.
(рис 7.8) Использование поименованных аргументов при вызове функцииФункция Left выделяет первую букву имени. Подробно об аргументах функций InputBox и Left см. ниже.
Ключевое слово Optional, задаваемое при описании параметров процедуры, предполагает, что значение параметра не обязательно будет передано в процедуру. Иными словами, аргумент возможен, но необязателен.
Пример
Функция рассчитывает налоговые выплаты и имеет два параметра S - доход, R - ставка налога. Если ставка налога не задана, то налог рассчитывается, исходя из 13%.
Если количество аргументов, передаваемых вызываемой процедуре, неизвестно до момента вызова процедуры, то последний параметр в заголовке вызываемой процедуры должен быть описан как ParamArray. Тогда при вызове процедуры последний аргумент рассматривается как массив переменных типа и внутри процедуры производятся действия уже с массивом.
Замечание
Ubound для определения количества элементов в передаваемом массиве.Пример
Создать функцию умножения аргументов.
Для умножения произвольного количества аргументов можно предложить два варианта функций:
В вызывающей процедуре mult_arr создается массив из восьми чисел, элементы которого перемножаются при помощи функций multr или multa.
Результат умножения выводится в окно Immediate Window.
Напомним, что Option не указывает на другое.
(рис 7.11) Вызывающая процедура и оба способа записи функции
Если процедурам присвоить специальные имена, то они запускаются автоматически.
Auto_Open автоматически запускается при открытии Auto_Close автоматически запускается при закрытии Обычно в этих процедурах создаются панели инструментов, разрешается или отменяется их высвечивание, производятся настройки экрана или изменяются меню.
Запомните
С каждым объектом приложения или формы связан определенный набор событий. Процедуры обработки событий позволяют выполнить некоторые действия при наступлении того или иного события, связанного с объектом приложения.
Событийные процедуры записываются на процедурных листах - листах-обработчиках событий. Двойной щелчок на объект в окне проекта (рабочая книга, рабочий или диаграммный лист, форма) открывает процедурный лист, связанный с выбранным объектом приложения.
Событийные процедуры имеют составные имена: название или тип объекта и название события, разделенные нижним подчеркиванием ( _ ). Например, процедура с именем Workbook_Open выполняется при открытии
Пример
На рис 7.12 в окне проекта выбрана рабочая книга (объект Эта книга ). В списке объектов на процедурном листе . Как следствие в списке процедур раскрыт .
(рис 7.12) Выбор события Open для объекта Эта книгаДля события Open, выбранного из списка событий, в окне программы появились операторы начала и конца соответствующей событийной процедуры. Имя процедуры установлено автоматически. Теперь можно записать операторы, которые должны выполняться при наступлении события - открытия
При открытии iserror название
(рис 7.13) Результат выполнения событийной процедуры открытия рабочей книги iserrorЯзык Visual Basic имеет большое число встроенных функций. Это
(рис 7.14) Классы функций и перечень строковых функцийКлассы функций можно увидеть в Object Browser, выбрав библиотеку VBA.
Дополнительно можно задать название класса функций на английском языке и выполнить поиск.
Наряду с функциями VBA в процедурах можно использовать встроенные функции Max или Min.
При необходимости использования табличной функции нужно сделать уточнение при помощи ссылки на объект ).
ВНИМАНИЕ
Пример
Рассчитать максимум из 4-х чисел и их среднее арифметическое.
Процедура использует две функции Max и . Ниже в примере приведены оба способа ссылок на функции
(рис 7.15) Уточнения при использовании табличных функций
Visual Basic располагает большим набором встроенных функций для обработки алфавитно-цифровых (символьных) данных. Многие из них совпадают с табличными. Но есть табличные
| Название и синтаксис функции | Описание | Примеры |
|---|---|---|
|
Возвращает ASCII- |
возвращает 42 |
|
Возвращает символ по ASCII-коду | возвращает * |
Format(еxpression [,format][,firstdayofweek][,firstweekofyear]) |
Преобразует аргумент в соответствии с заданным форматом | Format(42.399, "#.00") возвращает 42,40
|
|
Возвращает шестнадцатиричное представление числа | возвращает 12
|
InStr([start,] string1, string2[, |
Ищет подстроку в прямом направлении | InStr(1, "To be or not to be", "be") возвращает 4 |
InstrRev(stringcheck, stringmatch[, start][, |
Ищет подстроку в обратном направлении | InstrRev("To be or not to be", "be") возвращает 17 |
LCase(string) |
Преобразует строку в нижний регистр | LCase("World") возвращает world |
Left( |
Выделяет левую часть строки | Left("World", 2) возвращает Wo |
|
Определяет длину строки | возвращает 5 |
LTrim(string) |
Удаляет ведущие пробелы Пробелы справа сохраняются |
LTrim(" возвращает без левых пробелов |
|
Выделяет подстроку | возвращает orl |
Oct(number) |
Возвращает восьмеричное представление числа | Oct(12) возвращает 14 |
|
Заменяет подстроку на новую подстроку | возвращает The |
Right( |
Выделяет правую часть строки | Right("World",2) возвращает ld |
RTrim(string) |
Удаляет завершающие пробелы Пробелы слева сохраняются |
RTrim(" возвращает без правых пробелов |
Space(number) |
Создает строку пробелов | Space(6) создает строку из 6 пробелов |
Str(number) |
Преобразует число в строку | Str(123) возвращает строку 123 |
StrComp(string1, string2[, |
Сравнивает две строки: двоичное сравнение текстуальное сравнение |
StrComp("WORld", "world", 1) возвращает 0 (равенство строк будет обнаружено при текстуальном сравнении) |
String(number, character) |
Создает строку символов | String (5,"*") и String (5,42) возвращают ***** . 42 - ASCII- |
|
Удаляет пробелы с двух сторон строки | возвращает без левых и правых пробелов |
UCase(string) |
Преобразует строку в верхний регистр | UCase("World") возвращает WORLD |
|
Преобразует строку в число | возвращает число 6.28 |
| Функция | Тип результата | Функция | Тип результата | |
|---|---|---|---|---|
CBооl |
Воо1еап |
CCиr |
Сиrrепсу |
|
CDate |
Date |
CDbl |
Doublе |
|
CInt |
Iпtegеr |
CLng |
Long |
|
CSng |
Single |
CStr |
String |
|
CVаr |
|
В качестве параметра функциям преобразования строк передается выражение ( expression ), которое и преобразуется в выбранный тип.
Каждая number ). При использовании действительных чисел как констант разделителем целой и дробной части является точка. В разделе Derived Math Functions справочника по VBA можно найти формулы расчета математических функций, не являющихся встроенными функциями.
| Функция | Описание |
|---|---|
|
Возвращает |
Atn |
Возвращает арктангенс числа |
Cоs |
Возвращает косинус угла* |
Eхр |
Возвращает степень числа e (еx) |
Fiх |
Возвращает целую часть числа |
Int |
Округляет число до меньшего целого числа |
Log |
Возвращает |
Randomize |
Инициирует генератор случайных чисел |
|
Возвращает случайное число |
|
Округляет число до целого, если не задан аргумент numdecimalplaces (десятичный разряд, до которого производится округление) |
Sin |
Возвращает синус угла* |
Sgn |
Возвращает знак числа |
Sqr |
Возвращает квадратный корень из числа |
Тап |
Возвращает тангенс угла* |
| * Углы задаются в радианах. Для перевода градусов в радианы умножьте градусы на /180. | |
Под датой подразумевается переменная типа Date или дата-константа, которая задана согласно системному краткому формату даты с разделителями даты, определенными системной настройкой, и заключена в кавычки c использованием символа "решетка" ( # ).
Важно
Date в памяти компьютера сохраняется как число типа Double. Целая часть числа - это дата, а дробная часть - время.Date: одни сутки - это 24 часа, или 1440 минут, или 86400 секунд.| Название и синтаксис функций | Описание | Пример |
|---|---|---|
Date() * |
Возвращает или устанавливает системную дату | Date_Today=Date() запоминает системную дату
|
DateSerial(year, |
Преобразует в дату три целых числа: год, месяц и день | DateSerial(2007,7,24) возвращает 24.07.2007 |
DateValue(date) |
Преобразует в дату |
DateValue("24 июля 2007") возвращает 24.07.2007 |
| Если год не задан, то используется год из системной даты | ||
Day(date) |
Из даты выделяет день месяца | Day(#7/24/2007#) возвращает 24 |
|
Из заданного времени выделяет часы | возвращает 16 |
Minute(time) |
Из заданного времени выделяет минуты | Minute(#4:35:17 PM#) возвращает 35 |
|
Из даты выделяет месяц | возвращает 7 |
Now() * |
Возвращает текущую дату и текущее время | Date_Today=Now() |
Second(date) |
Из заданного времени выделяет секунды | Second (#4:35:17 PM#) возвращает 17 |
Time() * |
Возвращает или устанавливает системное время | Time_Today= Time() |
* |
Возвращает временной интервал в секундах от полуночи (тип Single ) |
|
TimeSerial( |
Преобразует в дату три целых числа: часы, минуты и секунды | TimeSerial(16, 35, 17) возвращает 16:35:17 |
TimeValue(time) |
Преобразует в дату |
TimeValue("4:35:17PM") возвращает время 16:35:17 |
Weekday(date, [firstdayofweek]) |
Возвращает день недели, соответствующий заданной дате | Weekday(#7/25/2007#, 2) возвращает 3 (третий день недели - среда) |
Year(date) |
Из даты выделяет год | Year(#7/24/2007#) возвращает 2007 |
| * Функции не имеют аргументов и могут записываться без скобок | ||
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.