- •Создание динамических структур данных
- •Встроенный динамический класс Collection
- •Создание собственных динамических классов
- •Обертывание коллекции vba
- •Несколько слов об api, Win32, dll
- •Вызов функций и оператор Declare
- •Две кодировки ansi и Unicode
- •Два языка: c и vb. Различия при вызове функций
- •Соответствие между простыми типами данных
- •Структуры языка c и тип, определенный пользователем, в языке vba
- •Об описателях языка c и объектах Windows
- •Void функции языка c
- •Вызов аргументов по ссылке ByRef и по значению ByVal
- •Строковые аргументы при вызове функций Win32 api
- •Примеры работы с Win32 api функциями
- •Работа с окнами
- •Характеристики окружения
- •Вызов функций Win32 api, работающих в Unicode кодировке
- •Обработка ошибок, возникающих при вызове функций Win32 api
- •Функции api и вызов Callback функций
- •Функции высших порядков и конструкция AddressOf
- •Функции перечисления Win32 api
- •Функция EnumWindows
- •Еще один пример работы с функцией EnumWindows
- •Функции Win32 api для работы с таймером
- •Функция SetTimer
- •Функция обратного вызова TimerProc
- •Функция KillTimer
- •Пример создания, работы и удаления таймера
- •Классы как обертка вызовов функций Win32 api
- •Построение класса "ВашТаймер"
- •Использование класса ВашТаймер
- •Операторы
- •Операторы и строки
- •Оператор комментария
- •Присваивание
- •Оператор Let
- •Оператор lSet
- •Оператор rSet
- •Оператор Set
- •Управляющие операторы
- •Условный оператор If Then Else End If
- •Оператор выбора Select Case
- •Цикл For Next
- •Цикл Do...Loop
- •Цикл While...Wend
- •Цикл For Each...Next
- •Работа с каталогами, папками и файлами
- •Изменение текущего диска: оператор ChDrive
- •Изменение текущего каталога (папки): оператор ChDir
- •Создание каталога (папки): оператор MkDir
- •Переименование каталогов (папок) и файлов: оператор Name
- •Удаление каталога (папки): оператор RmDir
- •Установка атрибутов файла: оператор SetAttr
- •Копирование файлов: оператор FileCopy
- •Удаление файлов: оператор Kill
- •Прочие операторы
- •Операции с одним объектом. Оператор With
- •Операции
- •Работа с числовыми данными
- •Математические функции
- •Работа со строками
- •Сравнение строк
- •Сравнение с образцом
- •Основные операции над строками
- •Новые функции для работы со строками
- •Функция InStrRev - поиск последнего вхождения подстроки
- •Функция Replace - замена всех вхождений подстроки
- •Удаление подстроки
- •Разбор строки. Функции Split, Join и Filter
- •Преобразование строки в массив. Функция Split
- •Сборка элементов массива в строку. Функция Join
- •Фильтрация элементов массива. Функция Filter
- •Несколько модификаций встроенных функций
- •Замена, основанная на шаблоне. Функция WildReplace
- •Замена разных символов строки. Функция CharSetReplace
- •Фильтрация, основанная на шаблоне. Функция WildFilter
- •Разбор строки, допускающей разные разделители ее элементов. Функция WildSplit
- •Работа с датами и временем
- •Присваивание значений
- •Встроенные функции для работы с датами
- •Определение текущей даты или времени.
- •Вычисления над датами
- •Функция Timer и хронометраж вычислений
- •Некоторые встроенные функции
- •Функции проверки типов данных
- •Преобразование типов данных
- •Форматирование данных. Функции группы Format
- •Функция Format.
- •Другие функции форматирования
- •Описание и создание процедур
- •Классификация процедур
- •Синтаксис процедур и функций
- •Функции с побочным эффектом
- •Создание процедуры
- •Создание процедур обработки событий
- •Вызовы процедур и функций Вызовы процедур Sub
- •Вызовы функций
- •Использование именованных аргументов
- •Аргументы, являющиеся массивами
- •Конструкция ParamArray
- •Задача о медиане
- •Пользовательские функции, принимающие сложный объект Range
- •Рекурсивные процедуры
- •Деревья поиска
- •Класс TreeNode
- •Класс BinTree
- •Работа со словарем
- •Отладка
- •Написание надежных программ
- •Искусство отладки
- •Средства отладки
- •Панель отладки и команды меню
- •Окна наблюдения
- •Окно локальных переменных - Locals
- •Окно проверки - Immediate
- •Окно контрольных выражений - Watch
Функция 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. (html, txt)
Представим результаты вычислений в виде таблицы. Они представляют интерес сами по себе. Заметьте, что наибольшее время потребовалось для вычислений над самым коротким типом - 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 |