Инструкции Defтип также применимы к функциям.
CalcNum = ATestFunction(4) ' Вызывает процедуру Function, определенную пользователем.
Описание процедуры Function ATestFunction.
Function ATestFunction(INumber)
ATestFunction = INumber * 2 ' Возвращает значение типа Integer.
End Function
3.2.3 Преобразования типа данных
Каждая из функций, приведенных в таблице 3.2.3, преобразует выражение к соответствующему типу данных. Обязательный аргумент выражение является любым строковым выражением или числовым выражением.
Таблица 3.2.3 – Функции преобразования типов
Функция | Тип | Диапазон аргумента выражение |
Cbool | Boolean | Любая допустимая строка или числовое выражение. |
CByte | Byte | От 0 до 255. |
Ccur | Currency | От -922 337 203 685 477,5808 до 922 337 203 685 477,5807. |
Cdate | Date | Любое допустимое выражение даты. |
CDbl | Double | От -1,79769313486232E308 до -4,94065645841247E-324 для отрицательных чисел; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных чисел. |
Cdec | Decimal | +/-79 228 162 514 264 337 593 543 950 335 без масштабирования, т.е. для чисел без дробной части. Диапазон чисел с 28 знаками в дробной части +/-7,9228162514264337593543950335. Минимальное ненулевое число 0,0000000000000000000000000001. |
Cint | Integer | От -32 768 до 32 767 с округлением дробной части. |
CLng | Long | От -2 147 483 648 до 2 147 483 647 с округлением дробной части. |
CSng | Single | От -3,402823E38 до -1,401298E-45 для отрицательных чисел; от 1,401298E-45 до 3,402823E38 для положительных чисел. |
Cvar | Variant | Диапазон значений Double для числовых значений. Диапазон значений String для нечисловых значений. |
CStr | String | Возвращаемые значения функции CStr зависят от аргумента выражение. |
Если переданное в функцию значение аргумента выражение находится вне допустимого диапазона для соответствующего типа данных, возникает ошибка.
Вообще говоря, функции преобразования типов данных используются для документирования программы. Это позволяет показать, что результат некоторой операции должен быть представлен определенным типом данных, а не типом, используемым по умолчанию. Например, функция CCur обеспечивает арифметические действия над числами в денежном формате в тех случаях, когда по умолчанию используются действия над числами с плавающей точкой обычной или двойной точности или над целыми числами.
Функции преобразования типов данных следует использовать вместо функции Val для совместимости с различными национальными настройками при преобразовании из любого типа данных в другой. Например, при использовании функции CCur разделители целой и дробной частей, а также разделители разрядов и параметры денежных единиц правильно распознаются в зависимости от национальной настройки компьютера.
Если дробная часть числа в точности равна 0,5, то функции CInt и CLng всегда округляют число до ближайшего четного числа. Например, 0,5 округляется до 0, а 1,5 до 2.
Чтобы определить, может ли аргумент дата быть преобразована к типу даты или времени, следует использовать функцию IsDate. Функция CDate распознает литералы даты и литералы времени, а также числа, которые попадают в приемлемый диапазон дат. При преобразовании числа в дату переводится целая часть числа. Любая дробная часть числа преобразуется во время суток, отсчитываемое от полуночи.
Функция CDate распознает форматы дат в соответствии с национальной настройкой системы. Правильный порядок дней, месяцев и годов может не быть определен, если дата задается в формате, отличном от распознаваемых форматов дат. Кроме того, длинный формат даты также не распознается, если он содержит строку для дня недели.
3.3 Вызов процедур и функций
При программировании широко используются процедуры, позволяющие разбивать программные коды на небольшие логические блоки, которые, во-первых, легче отлаживать, а во-вторых, можно в свою очередь использовать при создании других процедур. В Visual Basic существуют следующие виды процедур:
· Sub
· Function
· Property
Процедура sub не возвращает значения и наиболее часто используется для обработки связанного с ней события. Ее можно помещать в стандартные модули, модули классов и форм. Она имеет следующий синтаксис:
[Private] [Public] [Static} Sub имяПроцедуры (аргументы)
операторы
End Sub
Между ключевыми словами Sub и End Sub в процедуре располагаются выполняемые при ее вызове операторы программного кода. Параметр аргументы можно применять для объявления передаваемых в процедуру переменных.
Процедуры Sub подразделяются на общие процедуры и процедуры событий. Общие процедуры служат для размещения повторяющихся операторов, используемых процедурами по обработке событии, тем самым разгружая их и исключая дублирование часто встречающихся кодов, что в свою очередь облегчает поддержку приложения.
Процедуры обработки событий связаны с объектами, размещенными в формах Visual Basic, или с самой формой и выполняются при наступлении события, с которым они связаны.
Процедуры Function в отличие от процедур sub могут возвращать значение в вызывающую процедуру. Синтаксис процедуры Function выглядит следующим образом:
[Private] [Public] [Static} Function имяПроцедуры (аргументы) [As type]
операторы
End Function
Процедуры Function, как и переменные, имеют тип, задаваемый с помощью ключевого слова As. Если тип процедуры не задан, по умолчанию ей присваивается тип Variant. Тип процедуры определяет в свою очередь тип возвращаемого ею значения. Возвращаемое процедурой значение присваивается имени процедуры имяПроцедуры и может быть использовано в выражениях программного кода аналогично стандартным функциям Visual Basic.
Процедура Sub не возвращает значения, однако она может изменять значения переменных, заданных для нее в качестве параметров. Вызов процедуры Sub можно осуществлять двумя способами. Первый способ предполагает использование ключевого слова Call. Например, процедуру с именем Nameproc можно вызвать оператором
Call NameProc (аргумент1, аргумент2, ...аргументы)
Второй способ позволяет вызвать процедуру sub по ее имени. Например,
NameProc аргумент1, аргумент2, ...аргументы
При вызове процедуры модуля формы из другого модуля необходимо указывать ссылку на имя модуля формы, содержащего процедуру. Например, для вызова процедуры с именем Nameproc, находящейся в модуле формы Form1, оператор должен выглядеть так:
Call Form1.NameProc (аргумент1, аргумент2, ...аргументМ)
Вызов процедуры Function аналогичен вызову встроенных функций Visual Basic. Кроме этого, процедуру Function можно вызывать так же, как процедуру Sub:
Call Square(Side)
Square Side
В этом случае Visual Basic игнорирует возвращаемое функцией значение.
Переменные, передаваемые процедуре, называют параметрами процедуры. По умолчанию они имеют тип Variant. Visual Basic позволяет задавать тип параметров с помощью ключевого слова As:
Function Square (intA As Integer) As Integer
Передача параметров в процедуру может осуществляться двумя способами: по значению (by value) и по ссылке (by reference). В первом случае в процедуру в качестве переменной передается не сама переменная, а ее копия. Поэтому изменение параметра в процедуре затрагивает не переменную, а ее копию. Для передачи в процедуру параметров по ссылке используется ключевое слово ByVal, например:
Sub NameProc (ByVal strArg As String)
тело процедуры
End Sub
При передаче параметров по ссылке процедура получает доступ к области памяти, в которой эта переменная хранится, в результате чего при изменении в процедуре параметра происходит изменение значения переменной. По умолчанию в Visual Basic передача параметров в процедуру осуществляется по ссылке.
Используя ключевое слово Optional, можно задавать необязательные параметры процедуры. При этом необходимо иметь в виду, что если какой-либо из параметров задан как необязательный, то и расположенные после него параметры также должны быть объявлены необязательными:
Sub NameProc (Optional strArg1 As String, Optional strArg2 As String)
тело процедуры
End Sub
Обязательные параметры процедуры должны задаваться до необязательных, например:
Sub NameProc (strArg1 As String, Optional strArg2 As String)
тело процедуры
End Sub
3.4 Связь с рабочим листом
3.4.1 Способы адресации к ячейкам листа
Получить доступ к ячейке листа электронной таблицы Excel можно различными способами:
а) прямая ссылка на имя ячейки:
a = Range(“A1”).Value ‘Получить значение из ячейки A1 текущей таблицы
a = Worksheets(“Лист1”).Range(“A1”).Value ‘Получить значение из ячейки
‘A1 листа с именем “Лист1” в текущей книге (файле *.xls)
a = Worksheets(1).Range(“A1”).Value
Получить значение из ячейки A1 листа следующего первым по порядку в текущей книге (файле *.xls)
a = Workbooks(“Work.xls”).Worksheets(1).Range(“A1”).Value
Получить значение из ячейки A1 листа следующего первым по порядку в книге “Work.xls”
Range (“A1”).Value = a ‘Занести значение из переменной a в ячейку А1
б) прямая ссылка на номер ячейки. Если представить ячейку таблицы, как элемент двухмерной таблицы, то, например, ячейка “A1” будет иметь ссылку “1,1”(строка, столбец).
a = Cells(2,2).Value ‘Получить значение из ячейки В2 текущей таблицы
a = Worksheets(“Лист1”).Cells(2,2).Value
a = Worksheets(1).Cells(2,2).Value
a = Workbooks(“Work.xls”).Worksheets(1).Cells(2,2).Value
Cells(2,2).Value = a ‘Занести значение из переменной а в ячейку В2
в) Косвенная ссылка на имя ячейки. На первом шаге необходимо выделить необходимую ячейку инструкцией Range(“A2”).Select, а далее получить доступ к ячейке с помощью инструкции ActiveCell.FormulaR1C1 (всегда возвращается значение типа текст, поэтому необходимо преобразовывать полученное значение с помощью функций CDbl, CInt, Val и тому подобных):