MyTetra Share
Делитесь знаниями!
Что такое переменная и как правильно её объявить?
Время создания: 31.07.2019 22:34
Текстовые метки: переменные, VBA
Раздел: Разные закладки - VBA - Меню VB-справка
Запись: xintrea/mytetra_db_adgaver_new/master/base/1484220964weorxdepjb/text.html на raw.githubusercontent.com

Что такое переменная и как правильно её объявить?

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

Требования к переменным:

В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 254 символов. Так же нельзя использовать в качестве имен для переменных зарезервированные константы редактора VBA(например Sub, Msgbox, ubound, Date и т.п.). Так же для переменных неважен регистр букв.

Теперь рассмотрим основные декларированные в VBA типы данных, которые можно хранить в переменных:

Тип данных

Занимает байт в памяти

Пределы значений

Byte

1

Целые числа от 0 до 255

Boolean

2

True или False

Integer

2

Целые числа от (-32768) до 32767

Long

4

Целые числа от (-2147483648) до 2147483647

Single

4

От (–3.402823Е+38) до (–1.401298Е-45) и от 1.401298Е-45 до 3.402823Е+38

Double

8

От ±1.79769313486232Е+308 до ±4.94065645841247Е-324

Decimal

12

От ±79228162514264337593543950335 без десятичных знаков до ±7,9228162514264337593543950335 с 28-ю знаками после запятой

Currency

8

От (–922337203685477.5808) до 922337203685477.5807

Date

8

От 01.01.100 до 31.12.9999(не надо путать с датами в Excel - 01.01.1900 до 31.12.2078)

String

1

От 0 до 65400 символов для фиксированных строк и чуть более 2 млрд. для строк переменной длины

Object

4

Любой объект

Array

Определяется кол-вом и размером элементов

-

Variant

от 16-ти

Любой из встроенных типов данных

Как видно из таблицы больше всего памяти занимает Variant. Притом это если хранит числовые данные. Если же такая переменная будет хранить данные строкового типа(текст), то размер занимаемой памяти будет измеряться уже начиная с 22 байт + длина строки, хранящейся в переменной. Чем больше памяти занимает переменная, тем дольше она инициализируется в памяти и тем медленнее код будет выполняться. Вот поэтому и важно явно задавать тип данных, хранимых в переменной - это называется объявить переменную.

Тип данных Decimal больше не используется, поэтому объявить переменную данного типа в VBA не получится - подобная попытка приведет к синтаксической ошибке. Для работы с данными типа Decimal переменную необходимо изначально объявить как Variant или вообще без типа (например Dim a), т.к. тип данных Variant используется в VBA по умолчанию и принимает любой тип данных.

как объявлять переменные
На самом деле все очень просто. Это делается при помощи операторов области действия: Dim, Public,Static и оператора присвоения типа As. Самый распространенный оператор - Dim. Его и возьмем в качестве примера. Синтаксис объявления:


Visual Basic

[оператор области действия] Имя_переменной As [тип данных]


1

[оператор области действия] Имя_переменной As [тип данных]

Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:


Visual Basic

Dim MyVar1, MyVar2, MyVar3 As Integer


1

Dim MyVar1, MyVar2, MyVar3 As Integer

Вроде бы исходя из логики всем переменным присвоен тип данных Integer. Но это ошибочное суждение. Тип Integer присвоен только последней переменной, к которой он "привязан" оператором As - MyVar3. Все остальные переменные имеют тип данных Variant. Т.е. если Вы не задаете переменной тип хранимых данных явно(т.е. не указываете для неё тип данных), то VBA сам присваивает такой переменной тип данных Variant, т.к. он может хранить любой тип данных. А вот так выглядит правильное присвоение типа данных:


Visual Basic

Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer


1

Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer

Это и есть объявление переменных. Т.е. сначала идет оператор области действия (Dim, Public,Static), сразу за ним имя переменной, затем оператор As и тип. Теперь разберемся с Dim, Public и Static.
Но это не все. Некоторые типы переменным можно присваивать еще короче - даже без оператора As:


Visual Basic

Dim MyVar1%, MyVar2%, MyVar3%


1

Dim MyVar1%, MyVar2%, MyVar3%

Всего шесть типов, которые можно объявить подобным методом:
! - Single
# - Double
$ - String
% - Integer
& - Long
@ - Currency
На что стоит обратить внимание, при объявлении переменных подобным образом: между именем переменной и знаком типа не должно быть пробелов.
Я лично предпочитаю использовать первый метод, т.е. полное указание типа. Это читабельнее и понятнее. Но это мои предпочтения и в своих кодах Вы вправе использовать удобный Вам метод - ошибки не будет.

Теперь разберемся с операторами области действия:

  • Dim - данный оператор используется для объявления переменной, значение которой будет храниться только в той процедуре, внутри которой данная переменная объявлена. Во время запуска процедуры такая переменная инициализируется в памяти, Вы можете использовать её значение внутри только этой процедуры и по завершению процедуры переменная выгружается из памяти(обнуляется) и данные по ней теряются. Переменную, объявленную подобным образом еще называют локальной переменной. Однако с помощью данного оператора можно объявить переменную, которая будет доступна в любой процедуре модуля. Необходимо объявить переменную вне процедуры - в области объявлений(читать как первой строкой в модуле, после строк объявлений типа - Option Explicit). Тогда значение переменной будет доступно в любой процедуре лишь того модуля, в котором данная переменная была объявлена. Такие переменные называются переменными уровня модуля.
  • Static - данный оператор используется для объявления переменной, значение которой предполагается использовать внутри процедуры, но не теряя значения данной переменной по завершении процедуры. Переменные данного типа обычно используют в качестве накопительных счетчиков. Такая переменная инициализируется в памяти при первом запуске процедуры, в которой она объявлена. По завершении процедуры данные по переменной не выгружаются из памяти, но однако они не доступны в других процедурах. Как только Вы запустите процедуру с этой переменной еще раз - данные по такой переменной будут доступны в том виде, в котором были до завершения процедуры. Выгружается из памяти такая переменная только после закрытия проекта(книги с кодом). В простонародье такие переменные чаще называют глобальными(возможно из-за того, что раньше подобные переменные объявлялись при помощи оператора Global, который в настоящее время устарел и не используется)
  • Public - данный оператор используется для объявления переменной, значение которой будет храниться в любой процедуре проекта. Переменная, объявленная подобным образом, должна быть объявлена вне процедуры - в области объявлений. Такая переменная загружается в память во время загрузки проекта(при открытии книги) и хранит значение до выгрузки проекта(закрытия книги). Использовать её можно в любом модуле и любой процедуре проекта. Важно: объявлять подобным образом переменную необходимо строго в стандартном модуле . Такие переменные называются переменными уровня проекта.

Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия - Private. Объявленная подобным образом процедура доступна только из того модуля, в котором расположена и такая процедура не видна в диалоговом окне вызова макросов(Alt+F8).

Как правильно назвать переменную:

"Что самое сложное в работе программиста? - выдумывать имена переменным." :-)А ведь придумать имя переменной тоже не так-то просто. Можно, конечно, давать им имена типа: a, d, f, x, y и т.д.(я сам иногда так делаю, но либо в простых кодах, либо для специального запутывания кода). Но стоит задуматься: а как Вы с ними будете управляться в большом коде? Код строк на 10 еще потерпит такие имена, а вот более крупные проекты - не советовал бы я в них оперировать такими переменными. Вы сами запутаетесь какая переменная как объявлена и какой тип данных может хранить и что за значение ей присвоено. Поэтому лучше всего давать переменным осмысленные имена и следовать соглашению об именовании переменных. Что за соглашение? Все очень просто: перед основным названием переменной ставится префикс, указывающий на тип данных, который мы предполагаем хранить в данной переменной. Про имеющиеся типы данных я уже рассказал выше. А ниже приведена примерная таблица соответствий префиксов типам данных:

Префикс

Тип хранимых данных

b

Boolean

bt

Byte

i

Integer

l

Long

s

Single

d

Double

c

Currency

dt

Date

str

String

obj

Object

v

Variant

Лично я немного для себя её переделал, т.к. некоторые обозначения мне кажутся скудными. Например Double я обозначаю как dbl, а Single как sgl. Это мне кажется более наглядным.

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


Visual Basic

DefBool B Sub test() Dim bCheck End Sub


1

2

3

4

DefBool B

Sub test()

    Dim bCheck

End Sub

Автоматически переменной bCheck будет присвоен тип Boolean, т.к. она начинается с буквы b - регистр здесь не имеет значения(впрочем как в VBA в целом). Оператор Def задается в области объявления. Можно задать не одну букву, а целый диапазон букв:


Visual Basic

DefBool B-C Sub test() Dim bCheck, cCheck End Sub


1

2

3

4

DefBool B-C

Sub test()

    Dim bCheck, cCheck

End Sub

Но я считаю, что одной буквы для одного типа вполне достаточно. Можно задать сразу несколько операторов Def.


Visual Basic

DefBool B DefStr S Sub test() Dim bCheck, sCheck End Sub


1

2

3

4

5

DefBool B

DefStr S

Sub test()

    Dim bCheck, sCheck

End Sub

Ниже приведен полный перечень операторов типов и данные, которые задает каждый из них:
DefBool - Задает тип Boolean
DefByte - Задает тип Byte
DefCur - Задает тип Currency
DefDate - Задает тип Date
DefDbl - Задает тип Double
DefInt - Задает тип Integer
DefLng - Задает тип Long
DefObj - Задает тип Object
DefSng - Задает тип Single
DefStr - Задает тип String
DefVar - Задает тип Variant
По умолчанию в VBA применена инструкция DefVar для всех переменных.

Ну и немаловажный момент это непосредственно осмысленное имя переменной. Имя переменной должно примерно отражать то, что в ней будет храниться. Например, Вы создаете отчет и Вам надо объявить две переменные: одна имя листа, другая имя книги. Можно было сделать так: str1, str2. Коротко, здорово. Но если подумать - и как можно понять, какая из этих переменных что хранит? Никак. Надо просматривать код и вспоминать, какой переменной какое значение было присвоено. Не совсем удобно, правда? А если бы Вы задали имена так: strBookName, strSheetName, то вроде как более понятно, что мы в них будем хранить.Это удобно не только вам самим при работе с кодом, но и другим людям, которые, возможно в будущем будут пользоваться Вашим кодом. Им будет удобнее читать код, если он будет оформлен грамотно, а переменные названы осмысленно. И не стоит экономить на длине имени - имя должно быть понятным. Без фанатизма, конечно :-). Хоть VBA и позволяет нам создавать переменные длиной до 254 символов, но читать такую переменную так же неудобно, как и с одним символом. Но здесь уже все зависит от Ваших предпочтений и фантазии.
Небольшое дополнение: лучше привыкать давать названия переменным на латинице(т.е. английский алфавит), т.к. для VBA английский язык "родной" и лучше использовать его.

Небольшой пример использования переменных в кодах:


Visual Basic

Dim sAddress As String, sNewAddress As String, sShName As String 'выделяем ячейку D9 Range("D9").Select 'назначаем переменной адрес выделенных ячеек sAddress = Selection.Address 'показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.excel-vba.ru" 'назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" 'выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.excel-vba.ru" 'задаем значение переменной sShName = "excel-vba" 'переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Dim sAddress As String, sNewAddress As String, sShName As String

'выделяем ячейку D9

Range("D9").Select

'назначаем переменной адрес выделенных ячеек

sAddress = Selection.Address

'показываем сообщение

MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.excel-vba.ru"

'назначаем другой переменной значение адреса ячейки A1

sNewAddress = "A1"

'выделяем ячейку, заданную переменной sNewAddres

Range(sNewAddress).Select

MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.excel-vba.ru"

'задаем значение переменной

sShName = "excel-vba"

'переименовываем активный лист на имя, заданное переменной

ActiveSheet.Name = sShName



Константы
Так же есть и иной вид "переменных" - константы. Это такая же переменная, только(как следует из её названия) - она не может быть изменена во время выполнения кода, т.к. является величиной постоянной и значение её назначается только один раз - перед выполнением кода.


Visual Basic

Const sMyConst As String = "Имя моей программы"


1

Const sMyConst As String = "Имя моей программы"

Константам могут быть назначены данные тех же типов, что и для переменных. И область видимости/жизни переменных задается так же операторами Public и Static. Здесь обращаю внимание на то, что Dim уже не используется, т.к. Dim это идентификатор только для переменных. Пару важных отличий объявления констант от объявления переменных:

  • при объявлении константы необходимо обязательно указывать явно, что это константа ключевым словом Const
  • сразу в момент объявления необходимо назначить константе значение: = "Имя моей программы"

Во всем остальном объявление и применение констант идентично объявлению переменных. Коротко приведу пару примеров.
Если константа объявлена внутри процедуры:


Visual Basic

Sub TestConst() Const sMyConst As String = "Имя моей программы" MsgBox sMyConst 'показываем сообщение с именем программы End Sub


1

2

3

4

Sub TestConst()

    Const sMyConst As String = "Имя моей программы"

    MsgBox sMyConst 'показываем сообщение с именем программы

End Sub

то она не может быть использована в другой процедуре:


Visual Basic

Sub TestConst() Const sMyConst As String = "Имя моей программы" MsgBox sMyConst 'показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst 'вызовет ошибку Variable not defined End Sub


1

2

3

4

5

6

7

Sub TestConst()

    Const sMyConst As String = "Имя моей программы"

    MsgBox sMyConst 'показываем сообщение с именем программы

End Sub

Sub TestConst2()

    MsgBox sMyConst 'вызовет ошибку Variable not defined

End Sub

Чтобы использовать одну константу во всех процедурах проекта(книги), необходимо объявить её как Public:


Visual Basic

Public Const sMyConst As String = "Имя моей программы" Sub TestConst() MsgBox sMyConst 'показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst 'вызовет ошибку Variable not defined End Sub


1

2

3

4

5

6

7

Public Const sMyConst As String = "Имя моей программы"

Sub TestConst()

    MsgBox sMyConst 'показываем сообщение с именем программы

End Sub

Sub TestConst2()

    MsgBox sMyConst 'вызовет ошибку Variable not defined

End Sub

Подробнее можно прочитать выше - как я уже писал для констант применяются те же правила, что и для переменных.

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования