Понимание переменных и констант в макросах Excel

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

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

Константы могут быть полезны, если вам нужно использовать одно и то же большое значение несколько раз. Вместо копирования числа можно просто написать имя константы. Например, вы можете использовать константу «Пи» для хранения числа «Пи», которое является постоянным значением. Он очень большой, и каждый раз его достаточно сложно написать или найти и скопировать. И так, достаточно написать два символа, и среда автоматически использует нужное число.

Пользователю Excel необходимо объявлять переменные, если ему необходимо время от времени изменять хранимое в них значение. Например, вы можете установить переменную sVAT_Rate, в которой будет храниться текущая ставка НДС для продукта. Если что-то изменится, вы сможете быстро это исправить. Это особенно полезно для тех, кто ведет бизнес в США, где некоторые товары вообще могут не облагаться НДС (причем этот налог тоже различается от штата к штату).

Типы данных

Каждый контейнер данных может относиться к одному из нескольких типов. Ниже представлена ​​таблица с описанием стандартных типов обрабатываемой информации. Их много, и новичку поначалу может показаться, что они повторяют друг друга. Но это иллюзорное ощущение. Читайте дальше, чтобы узнать, почему так важно указывать правильный тип данных.

Не рекомендуется использовать тип данных, который занимает больше места в памяти для небольших чисел. Например, для числа 1 достаточно использовать тип Байт. Это положительно скажется на производительности исполняемого модуля, особенно на слабых компьютерах. Но здесь важно не переборщить. Если вы используете слишком компактный тип данных, в него может не поместиться слишком большое значение.

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

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

Для объявления переменной используется оператор Dim. Например, вот так:

Dim Variable_Name как целое число

Имя_переменной — это имя переменной. Далее пишется оператор As, указывающий тип данных. Вместо строк «Имя_переменной» и «Целое число» можно вставить собственное имя и тип данных.

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

Конст iMaxCount = 5000

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

  1. Вариант обрабатывается гораздо медленнее, и если таких переменных много, обработка информации может существенно замедляться на слабых компьютерах. Казалось бы, что решат эти секунды? Но если вам придется написать большое количество строк кода, а потом еще и запустить его на слабых компьютерах (которые до сих пор продаются, учитывая, что современные офисные пакеты требуют много оперативной памяти), можно и вовсе остановить работу. Известны случаи, когда непродуманное написание макросов приводило к зависанию смартбуков, имеющих небольшой объем оперативной памяти и не предназначенных для выполнения сложных задач. 
  2. Допускаются опечатки в именах, предотвратить которые можно с помощью оператора Option Explicit, позволяющего найти необъявленную переменную, если она найдена. Это простой способ обнаружить ошибки, поскольку малейшая опечатка приводит к тому, что интерпретатор не может идентифицировать переменную. А если включить режим объявления переменных, то интерпретатор просто не позволит запустить макрос, если будут обнаружены контейнеры данных, не объявленные в самом начале модуля.
  3. Избегайте ошибок, вызванных несоответствием значений переменных типу данных. Обычно присвоение текстового значения целочисленной переменной приводит к ошибке. Да, с одной стороны, обобщенный тип присваивается без объявления, но если их объявить заранее, то можно избежать случайных ошибок.

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

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

  1. Строки делаются пустыми.
  2. Числа принимают значение 0.
  3. Переменные типа Boolean изначально считаются ложными.
  4. Дата по умолчанию — 30 декабря 1899 года.

Например, вам не нужно присваивать значение 0 целочисленной переменной, если ранее значение не было указано. Она уже содержит этот номер.

Опция Явное заявление

Этот оператор позволяет объявить все переменные, используемые в коде VBA, и определить наличие любых необъявленных контейнеров перед запуском кода. Чтобы использовать эту функцию, просто напишите строку кода Option Explicit в самом верху кода макроса.

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

  1. Заходим в среду разработки по пути – Инструменты > Параметры.
  2. В открывшемся после этого окне откройте вкладку Редактор.
  3. И, наконец, установите флажок рядом с пунктом «Требовать объявление переменной».

По завершении этих действий нажмите кнопку «ОК». 

Всё, теперь при написании каждого нового макроса эта строка будет вставляться вверху кода автоматически.

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

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

Предположим, у нас есть функция Общая стоимость(), и он использует переменную sVAT_Rate. В зависимости от позиции в модуле он будет иметь разную область применения:

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

Уменьшить sVAT_Rate как одиночный

Функция Total_Cost() как двойная

.

.

.

End Function

Если переменная объявлена ​​в верхней части самого модуля, она распространяется по всему модулю. То есть его можно прочитать любой процедурой.

При этом если одна из процедур изменила значение переменной, то следующая тоже прочитает это исправленное значение. Но в других модулях эта переменная все равно не будет прочитана.

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

Функция Total_Cost() как двойная

Уменьшить sVAT_Rate как одиночный

   .

   .

   .

End Function

В этом случае переменная объявляется внутри процедуры, и интерпретатор выдаст ошибку, если она будет использована в другой процедуре.

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

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

Вот таблица с хорошим примером того, как она работает с константами и переменными.

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

Публичная sVAT_Rate как одиночная

Публичная константа iMax_Count = 5000

В этом примере вы можете увидеть, как ключевое слово Public используется для объявления переменной и что нужно написать в редакторе Visual Basic, чтобы объявить общедоступную константу. Область действия этих контейнеров значений распространяется на все модули.
Вариант Явный

Частный sVAT_Rate как одиночный

Частная константа iMax_Count = 5000

Здесь переменные и константы объявляются с использованием ключевого слова Private. Это означает, что их можно увидеть только внутри текущего модуля, а процедуры в других модулях не могут их использовать.

Зачем нужны константы и переменные

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

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

Это особенно важно, когда макрос пишется несколькими программистами. Можно знать, что какая-то переменная не должна меняться. А другой нет. Если вы укажете оператор Const, другой разработчик будет знать, что это значение не меняется.

Или, если есть константа с одним именем, а переменная имеет другое, но похожее имя. Разработчик может их просто спутать. Например, одна переменная, которую не нужно изменять, называется Переменная11, а другая, которую можно редактировать, называется Переменная1. Человек может автоматически при написании кода случайно пропустить лишний блок и не заметить его. В результате будет изменен контейнер для значений, который трогать не следует.

Или сам разработчик может забыть, какие переменные ему можно трогать, а какие нет. Такое часто случается, когда код пишется несколько недель, а его размер становится большим. За это время очень легко забыть даже, что означает та или иная переменная.

Да, в этой ситуации можно обойтись комментариями, но не проще ли указать слово Const?

Выводы

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

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

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