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

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

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

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

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

Типы данных

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

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

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

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

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

Dim Variable_Name As Integer

Variable_Name – это название переменной. Далее пишется оператор As, указывающий на тип данных. Вместо строк «Variable_Name» и «Integer» можно вставить свое название и тип данных.

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

Const iMaxCount = 5000

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

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

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

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

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

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

Оператор Option Explicit

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

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

  1. Перейти в среде разработки по пути – Tools > Options.
  2. В открывшемся после этого окне следует открыть вкладку Editor.
  3. И наконец, поставить флажок возле пункта Require Variable Declaration.

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

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

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

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

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

Option Explicit

Dim sVAT_Rate As Single

Function Total_Cost() As Double

.

.

.

End Function

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

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

Option Explicit

Function Total_Cost() As Double

Dim sVAT_Rate As Single

   .

   .

   .

End Function

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

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

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

Вот таблица с наглядным примером, как это работает с константами и переменными.

Option Explicit

Public sVAT_Rate As Single

Public Const iMax_Count = 5000

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

Private sVAT_Rate As Single

Private Const iMax_Count = 5000

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

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

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

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

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

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

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

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

Выводы

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

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

ОфисГуру
Adblock
detector