Переменные и константы в VBA

В VBA, как и в любом другом языке программирования, для хранения любых значений используются переменные и константы. Как следует из названия, переменные могут изменяться, а константы хранят фиксированные значения.

Например, константа Pi хранит значение 3,14159265. Число «Пи» не изменится в процессе выполнения программы, но хранить такое значение все же удобнее как константу.

В то же время мы можем использовать переменную sVAT_Rate для хранения ставки НДС по приобретенным товарам. Значение переменной sVAT_Rate может варьироваться в зависимости от приобретаемого продукта.

Типы данных

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

Тип данных РазмерОписаниеДиапазон значений
Байт1 байтПоложительные целые числа; часто используется для двоичных данныхот 0 в 255
Логический2 байтМожет быть либо Истина, либо ЛожьПравда или ложь
Целое2 байтЦелые числа (без дробной части)от -32 до +768
Длинное4 байтБольшие целые числа (без дробной части)от -2 147 483 648 до +2 147 483 647
одинарной4 байтЧисло одинарной точности с плавающей запятойот -3.4e38 до +3.4e38
двойной8 байтЧисло двойной точности с плавающей запятойот -1.8e308 до +1.8e308
Валюта8 байтЧисло с плавающей запятой, с фиксированным количеством десятичных знаков.от -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Время8 байтДата и время. Данные типа Дата представлены числом с плавающей запятой. Целая часть этого числа выражает дату, а дробная часть — время.с 1 января 100 по 31 декабря 9999 года
объект4 байтСсылка на объектЛюбая ссылка на объект
строкаменяетсяНабор символов. Тип String может иметь фиксированную или переменную длину. Чаще используется с переменной длиной.Фиксированная длина – примерно до 65 символов. Переменная длина – примерно до 500 миллиардов символов.
ВариантменяетсяМожет содержать дату, число с плавающей запятой или строку символов. Этот тип используется в тех случаях, когда заранее неизвестно, какой тип данных будет введен.Число – Двойное, строка – Строка

Очевидно, воспользовавшись приведенной выше таблицей и выбрав правильный тип данных, можно более экономно использовать память (например, выбрать тип данных Целое вместо Длинное or одинарной вместо двойной). Однако при использовании более компактных типов данных нужно быть осторожным, чтобы ваш код не пытался вместить в них непропорционально большие значения.

Объявление переменных и констант

Примечание переводчика: Говоря о переменных в VBA, стоит упомянуть еще один очень важный момент. Если мы объявляем переменную, но не присваиваем ей никакого значения, то она инициализируется значением по умолчанию:

• текстовые строки инициализируются пустыми строками;

• числа — значение 0;

• тип переменных Логический - ЛОЖЬ;

• даты – 30 декабря 1899 г.

Прежде чем использовать переменную или константу, ее необходимо объявить. Для этого добавьте в макрос следующую простую строку кода:

Dim Имя_Переменной As Тип_Данных

В приведенной выше строке кода Имя_переменной — имя переменной, которая будет использоваться в коде, и Тип данных — это один из типов данных из таблицы, приведенной чуть ранее в этой статье. Например:

Dim sVAT_Rate как одиночный Dim и как целое число

Константы объявляются аналогично, но при объявлении констант необходимо сразу указывать их значение. Например, вот так:

Const iMaxCount = 5000 Const iMaxScore = 100

В Excel не обязательно объявлять переменные. По умолчанию все введенные, но не объявленные переменные в Excel будут иметь тип Вариант и сможет принимать как числовые, так и текстовые значения.

Таким образом, программист может использовать новую переменную в любой момент (даже если она не была объявлена), а Excel будет трактовать ее как переменную типа Вариант. Однако есть несколько причин, почему этого делать не следует:

  1. Использование памяти и скорость вычислений. Если не объявить переменную с указанием типа данных, то по умолчанию ей будет установлен тип Вариант. Этот тип данных использует больше памяти, чем другие типы данных. Несколько дополнительных байтов на переменную могут показаться не такими уж большими, но на практике программы могут иметь тысячи переменных (особенно при работе с массивами). Следовательно, дополнительная память, используемая такими переменными, как Вариант, по сравнению с переменными типа Целое or одинарной, может составить значительную сумму. Кроме того, операции с переменными типа Вариант выполняются гораздо медленнее, чем с переменными других типов, соответственно лишняя тысяча переменных типа Вариант может существенно замедлить расчеты.
  2. Предотвращение опечаток в именах переменных. Если все переменные объявлены, можно использовать оператор VBA — Вариант Явный (об этом мы поговорим позже), чтобы идентифицировать все необъявленные переменные. Это исключает появление ошибки в программе в результате неправильно написанного имени переменной. Например, используя переменную с именем sVAT_Rate, можно допустить опечатку и, присвоив значение этой переменной, написать: «VATRate = 0,175». Ожидается, что с этого момента переменная sVAT_Rate должно содержать значение 0,175 – но это, конечно, не так. Если включен режим обязательного объявления всех используемых переменных, то компилятор VBA сразу укажет на ошибку, так как не найдет переменную Ставка НДС среди объявленных.
  3. Выделение значений, не соответствующих заявленному типу переменной. Если вы объявите переменную определенного типа и попытаетесь присвоить ей данные другого типа, вы получите ошибку, которая, если ее не исправить, может привести к сбою программы. На первый взгляд это может показаться веской причиной не объявлять переменные, но на деле, чем раньше оказывается, что одна из переменных получила не те данные, которые должна была получить – тем лучше! В противном случае, если программа продолжит работу, результаты могут оказаться неверными и неожиданными, и найти причину ошибок будет гораздо сложнее. Также возможно, что макрос будет «успешно» выполнен. В результате ошибка останется незамеченной и работа продолжится с неверными данными!

В связи с этим желательно как можно раньше обнаружить неправильный тип данных и исправить такие ошибки в коде. По этим причинам рекомендуется объявлять все переменные при написании макроса VBA.

Вариант Явный

оператор Вариант Явный вызывает объявление всех переменных, которые будут использоваться в коде VBA, и помечает все необъявленные переменные как ошибки во время компиляции (до начала выполнения кода). Применить этот оператор несложно — просто напишите эту строку в самом верху файла VBA:

Option Explicit

Если вы хотите всегда вставлять Вариант Явный в начало каждого нового созданного модуля VBA, это можно сделать автоматически. Для этого вам необходимо включить опцию Требовать объявление переменной в настройках редактора VBA.

Это делается так:

  • В меню редактора Visual Basic нажмите кнопку инструменты > Опции
  • В появившемся диалоге откройте вкладку редактор
  • Поставьте галочку Требовать объявление переменной и нажмите OK

При включении строка Вариант Явный будет автоматически вставлен в начало каждого нового создаваемого модуля.

Область применения переменных и констант

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

Option Explicit Dim sVAT_Rate Как одиночная функция Total_Cost() Как Double... Конечная функция
Если переменная sVAT_Rate объявлен в самом начале модуля, то областью действия этой переменной будет весь модуль (т.е. переменная sVAT_Rate будут распознаваться всеми процедурами этого модуля).

Следовательно, если в функции Общая стоимость переменная sVAT_Rate будет присвоено некоторое значение, то следующая функция, выполняемая в том же модуле, будет использовать переменную sVAT_Rate с тем же значением.

Однако если вызывается какая-то функция, расположенная в другом модуле, то для нее переменная sVAT_Rate не будет известно.

Опция Явная функция Total_Cost() As Double Dim sVAT_Rate As Single... Конечная функция
Если переменная sVAT_Rate объявлен в начале функции Общая стоимость, то его область действия будет ограничена только этой функцией (т.е. внутри функции Общая стоимость, вы можете использовать переменную sVAT_Rate, но не снаружи).

При попытке использовать sVAT_Rate в другой процедуре компилятор VBA сообщит об ошибке, поскольку эта переменная не была объявлена ​​вне функции Общая стоимость (при условии, что используется оператор Вариант Явный).

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

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

Вы также можете использовать ключевые слова для объявления констант. Общая и Частный, но не вместо ключевого слова Const, вместе с этим.

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

Опция Explicit Public sVAT_Rate As Single Public Const iMax_Count = 5000 ...    
В этом примере ключевое слово Общая используется для объявления переменной sVAT_Rate и константы iMax_Count. Объем объявленных таким образом элементов будет составлять весь текущий проект.

Это означает, что sVAT_Rate и iMax_Count будет доступен в любом модуле проекта.

Опция Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ...    
В этом примере, чтобы объявить переменную sVAT_Rate и константы iMax_Count ключевое слово используется Частный. Областью действия этих элементов является текущий модуль.

Это означает, что sVAT_Rate и iMax_Count будет доступен во всех процедурах текущего модуля, но не будет доступен процедурам других модулей.

Оставьте комментарий