Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3490 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 9:

Операции и встроенные функции

Функция Timer и хронометраж вычислений

Функция Timer возвращает значение типа Single, представляющее число секунд, прошедших после полуночи. Эта функция широко используется при проведении хронометража вычислений в программах. Чтобы повысить эффективность выполнения VBA программ зачастую приходится прибегать к проведению хронометража, чтобы выявить наиболее критичные по времени выполнения участки программ, а затем уже применять специальные меры для ускорения вычислений. Приведем сейчас пример, в котором анализируется время, затрачиваемое для выполнения операций над арифметическими данными разных подтипов.

Public Sub Speed()
	'Эта программа выполняет замеры времени вычислений над данными разного типа
	
	Dim Start As Single, Finish As Single
	Dim i As Long, j As Long
	Dim bx As Byte, by As Byte, bz As Byte
	Dim ix As Integer, iy As Integer, iz As Integer
	Dim lx As Long, ly As Long, lz As Long
	Dim sx As Single, sy As Single, sz As Single
	Dim dx As Double, dy As Double, dz As Double
	
	For i = 1 To 5 'Внешний цикл для повторения замеров времени
		Start = Timer
		For j = 1 To 100000
			bx = 99: by = 101
			bz = by * (by - bx) \ by
		Next j
		Finish = Timer
		Debug.Print "Тип Byte: Время ", i, " = ", Finish - Start
		Debug.Print "bz = ", bz
		
		Start = Timer
		For j = 1 To 100000
			ix = 99: iy = 101
			iz = iy * (iy - ix) \ iy
		Next j
		Finish = Timer
		Debug.Print "Тип Integer: Время ", i, " = ", Finish - Start
		Debug.Print "iz = ", iz

		Start = Timer
		For j = 1 To 100000
			lx = 99: ly = 101
			lz = ly * (ly - lx) \ ly
		Next j
		Finish = Timer
		Debug.Print "Тип Long: Время ", i, " = ", Finish - Start
		Debug.Print "lz = ", lz
		
		Start = Timer
		For j = 1 To 100000
			sx = 99: sy = 101
			sz = sy * (sy - sx) / sy
		Next j
		Finish = Timer
		Debug.Print "Тип Single: Время ", i, " = ", Finish - Start
		Debug.Print "sz = ", sz
		
		Start = Timer
		For j = 1 To 100000
			dx = 99: dy = 101
			dz = dy * (dy - dx) / dy
		Next j
		Finish = Timer
		Debug.Print "Тип Double: Время ", i, " = ", Finish - Start
		Debug.Print "dz = ", dz
		
	 Next i
	
End Sub
8.7.

Представим результаты вычислений в виде таблицы. Они представляют интерес сами по себе. Заметьте, что наибольшее время потребовалось для вычислений над самым коротким типом - Byte, а в целом вычисления над разными типами выполняются примерно с одинаковой скоростью.

Таблица 8.5. Время вычислений над данными разных типов
Тип / Номер Эксперимента 1 2 3 4 5
Byte 0.3515625 0.359375 0.3320313 0.3320313 0.34375
Integer 0.2421875 0.2382813 0.2421875 0.2421875 0.2382813
Long 0.2890625 0.28125 0.28125 0.28125 0.28125
Single 0.2929688 0.2695313 0.28125 0.28125 0.28125
Double 0.3085938 0.2890625 0.2929688 0.2929688 0.28125
Некоторые встроенные функции

Как мы уже говорили, встроенных функций множество. Помнить их всех не требуется, поскольку под рукой всегда есть справочная система. Для общего знакомства рассмотрим еще некоторые группы функций.

Функции проверки типов данных

К этой группе относится функция TypeName, которая по имени переменной возвращает значение типа String, представляющее ее тип.

Вызов имеет вид:

TypeName(имяПеременной)

где параметр имяПеременной представляет выражение типа Variant, определяющее любую переменную, за исключением переменной с определяемым пользователем типом.

Строка, возвращаемая функцией TypeName, может быть любой из следующих: Byte, Integer, Long, Single, Double, Currency, Decimal, Date, String, Boolean, Error, Empty (если переменная не инициализирована), Null, Object, Unknown (тип неизвестен), Nothing (объектная переменная, не содержащая ссылки на объект).

Для проверки типа имеется также набор функций с булевыми значениями. Они применяются к переменным или выражениям (часто имеющим тип Variant ) и определяют, имеют ли те заданный тип или значение. В следующей таблице перечислены функции этой группы и указаны определяемые ими типы.

Таблица 8.6. Функции проверки типов
Функция Что проверяет
IsArray(переменная) Является ли переменная массивом.
IsDate(выражение) Может ли значение выражения быть преобразовано в значение даты.
IsEmpty(переменная) Была ли инициализирована переменная.
IsError(выражение) Представляет ли выражение значение ошибки.
IsNull(выражение) Является ли результатом выражения пустое значение ( Null ).
IsNumeric(выражение) Имеет ли выражение числовое значение. (Для выражений типа дата возвращает False ).
IsObject(переменная) Представляет ли переменная объектную переменную. Возвращает True, даже для переменной со значением Nothing.
Преобразование типов данных

Для приведения данных к нужному типу в VBA включен обширный набор функций: CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar, CVErr, Fix, Int.

Все они имеют следующий синтаксис:

ИмяФункции(выражение)

Обязательный аргумент выражение является любым строковым выражением или числовым выражением. В следующей таблице указаны типы возвращаемых значений и их диапазоны.

Таблица 8.7. Функции приведения к типу
Функция Тип Диапазон аргумента выражение
CBool Boolean Любая допустимая строка или числовое выражение. Например, Cbool(0)= Cbool("00")= False, Cbool(1)=Cbool("-6")=True.
CByte Byte От 0 до 255.
CCur Currency От -922 337 203 685 477,5808 до 922 337 203 685 477,5807.Например, CCur("25,878755")= 25.8788, а CCur("25.878755") - ошибочный вызов, т. к. в строке отделять дробную часть должна запятая.
CDate Date Любое допустимое выражение даты. Например, Cdate(32444.5)=28.10.88 12:00:00, Cdate("17/08/1972")=17.08.72, Cdate("6:45:28 PM")= 18:45:28.
CDbl Double -4,94065645841247E-324 для отрицательных чисел; от 4,94065645841247E-324 до 1,79769313486232E308 для положительных чисел.
CDec Decimal +/-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 зависят от аргумента выражение. Например, CStr(True) = "Истина", CStr(122.344) = "122.344", CStr(#10/24/47#) = 24.10.47

Если переданное в функцию значение аргумента выражение находится вне допустимого диапазона для соответствующего типа данных, возникает ошибка.

Функция CVErr возвращает значение типа Variant с подтипом Error, содержащее код ошибки, указанный пользователем. Она используется для создания определяемых пользователем ошибок.

Если дробная часть числа равна 0,5, то функции CInt и CLng всегда округляют число до ближайшего четного числа. Например, Cint(0,5)= 0, а Cint(1,5)= 2.

Функции Fix и Int вычисляют целую часть числа (без округления). Они отличаются на отрицательных числах: Fix (-7.6) = -7, а Int(-7.6) = -8.

Форматирование данных. Функции группы Format

Числовые и строковые данные, данные типа дата и данные типа время могут быть отформатированы в соответствии с предопределенными в языке форматами или форматами, определенными пользователем. Для этой цели используется группа функций форматирования.

Функция Format.

Функция возвращает строку, отформатированную в соответствии с указаниями, заданными при вызове. Ее синтаксис:

Format(expression[, format[, firstdayofweek[, firstweekofyear]]])

Ее параметры:

  • expression - любое правильное выражение.
  • Format - имя встроенного параметра или определение пользовательского формата. Если параметр опущен, то применяется формат, зависящий от типа первого аргумента
  • Firstdayofweek и firstweekofyear - их смысл был описан, когда мы рассматривали работу с датами

Приведем ряд примеров, в которых используется форматирование чисел на основе форматов, определяемых по умолчанию и пользователем:

? VBA.Format(55)
55
? VBA.Format(5.5)
5,5
? VBA.Format(-52.125, "##0.#0") 
-52,13
? VBA.Format(-52.125, "000.##0") 
-052,125
? VBA.Format(1152.125, "#,##0.#0") 
1 152,13
? VBA.Format(0.52125, "0.##0%") 
52,125%

Несколько примеров форматирования строк:

? VBA.Format("5.4") 
05.04.99
? VBA.Format("5,4") 
5,4
? VBA.Format("Мария", ">") 
МАРИЯ
? VBA.Format("Мария", "<") 
мария
? VBA.Format("Мария", "> Это ") 
 Это МАРИЯ

Даты форматируются обычно с использованием встроенных форматов, но можно применять и собственные определения форматов. Вот несколько примеров:

? VBA.Format(VBA.Time, "Long Time")
16:24:57
? VBA.Format(VBA.Time, "Short Time")
16:25
? VBA.Format(VBA.Time, "hh/mm/ss")
16.26.03
? VBA.Format(VBA.Date, "Long Date")
9 Май 1999 г.
? VBA.Format(VBA.Date, "Short Date")
09.05.99
? VBA.Format(VBA.Date, "yy/mm/dd")
99.05.09
Другие функции форматирования

Функция Format является общей функцией применимой к произвольным выражениям. Остальные функции применимы к выражениям специального типа, предоставляя некоторые дополнительные возможности. Мы не станем их подробно рассматривать, ограничившись простым перечислением:

  1. FormatCurrency - возвращает денежное выражение, используя денежный знак.
  2. FormatDataTime - возвращает дату или время.
  3. FormatNumber - возвращает выражение, отформатированное как число.
  4. FormatPercent - возвращает выражение, заданное в процентах, с указанием знака процента.
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.