Макросы на VBA нужны для обработки данных. Эти данные должны где-то храниться. Вы скажете, так вот же, все нужные для обработки данные хранятся на листе таблицы эксель. Да, они там хранятся и вобщем-то можно из макроса напрямую обращаться к значениям ячеек, но делать этого не рекомендую. И вот вам первое правило, которое нужно всегда соблюдать при написании макросов:
Что будет, если не следовать этому правилу?
-Время выполнения макросов сильно увеличится. Причем это будет достаточно ощутимо и выражаться в минутах, а иногда и в часах!
Почему так?
Потому что при обработке файлов с большим количеством данных, например в несколько сотен тысяч строк, макросу придется обратиться к каждой ячейкам каждой строки персонально. Это займет много времени.
Для хранения данных, которыми будете оперировать в макросе используйте переменные. Так же в переменных будут записываться значения "служебных" и вспомогательных величин, таких как счетчики циклов, метки и так далее.
Переменная - область памяти компьютера, которая имеет свое собственное имя. Именно в таких областях памяти (в переменных) и нужно хранить все используемые данные. Данные, которые записаны в переменную называются - значениями переменной.
Типы данных в VBA
Тип данных переменной показывает каким образом надо хранить записываемые в нее данные и сколько необходимо выделить для переменной памяти. Поэтому, если вам нужно экономить ресурсы памяти, объявляйте переменные.
Основные типы данных
Тип данных | Количество байт резервируется | Диапазон значений |
---|---|---|
Byte | 1 | 0-255 |
Boolean | 2 | True или False |
Integer | 2 | от -32768 до 32767 |
Long | 4 | от -2147483648 до 2147483647 |
Double (отрицательные) | 8 | -1.79769313486232E308 to -4.94065645841247E-324 |
Double (положительные) | 8 | 4.94065645841247E-324 to 1.79769313486232E308 |
Currency | 8 | -922,337,203,685,477.5808 to 922,337,203,685,477.5807 |
Date | 1 | с 1/1/100 до 12/31/9999 |
String | 10 + длина строки | от 0 до ~ 2 млрд символов |
Object | 4 | Любая ссылка на объект |
Variant | зависит от типа | любой тип данных |
Для объявления переменной нужно выбирать самый оптимальный тип данных - в котором используется меньшее количество байтов, но достаточный для записи максимальных значений.
Объявление переменных
Многие языки программирования строго типизированные, т.е. обязательно нужно объявлять переменную и ее тип данных. В VBA же переменную можно вообще не объявлять, а просто присвоить ей значение. Переменная будет создана и иметь тип данных, которые ей присваиваются. Но хорошим стилем программирования считается все же написание кода с объявлением переменных, к тому же это помогает оптимизировать объемы выделяемой на выполнение макроса памяти, а также скорость выполнения.
Чтобы не забывать и сделать переменные обязательными для объявления, нужно в модуле написать в самом верху, над всеми подпрограммами
Option Explicit
Объявление переменной всегда начинается с ключевого слова Dim
, далее идет имя переменной.
Имя переменной всегда должно начинаться с буквы. Существуют зарезервированные слова, которые не могут быть использованы в качестве имени переменной. Например, переменную нельзя назвать sub
, потому что это ключевое слово для объявления подпрограммы (см. предыдущий урок).
О том, что слово невозможно использовать в качестве имени переменной редактор VBE вам сообщит.
Затем идет ключевое слово as
и указывается тип переменной.
Пример:
Dim a as integer
- объявили переменную а типа integer (целое число)
Dim txt as string
- объявили переменную txt типа string (текстовую)
Присваивание значений переменным в VBA
Присваивание значения переменной, по сути, означает запись в область памяти с указанным именем, указанного значения. Присваивание записывается с помощью знака равенства. Имя переменной указывается слева от знака равенства, а значение - справа.
Например:
a = 5
txt="Пример"
Давайте в заключении напишем два макроса. В одном переменные будут объявлены, а в другом нет. А в итоге выведем сообщение показывающее время выполнения макроса. Это будет хорошим примером, демонстрирующим важность объявления переменных. В самом коде пока разбираться не нужно, это просто пример для демонстрации времени выполнения.
Первый вариант макроса -без объявления переменных. Переменным сразу присваиваются значения.
Sub Test()
StartTime = Timer
a = 0
b = 0
For i = 1 To 100000000
a = a + 1
b = b + 1
Next i
EndTIme = Timer
MsgBox Format(EndTIme - StartTime, "0.0")
End Sub
Выполнился за 6,6 секунд
Второй вариант - с использованием объявления переменных.
Sub Test()
Dim a As Long
Dim b As Long
Dim StartTime As Date
Dim EndTIme As Date
Dim i As Long
StartTime = Timer
a = 0
b = 0
For i = 1 To 100000000
a = a + 1
b = b + 1
Next i
EndTIme = Timer
MsgBox Format(EndTIme - StartTime, "0.0")
End Sub
Время выполнения 1,5 секунды.
Преимущество второго варианта очевидно. Делайте вывод и старайтесь всегда объявлять переменные.
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧
А почему в первом случае макрос дольше выполнялся? Получается, что для некоторых переменных VBA взял типы данных с излишней длинной? Как можно определить, какие типы были использованы в первом случае, когда их не задали явно?