Вопрос: Что означает DIM в Visual Basic и BASIC? Использование именованных аргументов функций. Выбрать объект General из списка объектов в окне Object

Dim имели разные значения, приписываемые ему.

Я нашел ссылки на Dim значение "Объявить в памяти" , более релевантная ссылка - это документ на Dim Statement опубликовал Oracle как часть справочника языка Siebel VB. Конечно, вы можете утверждать, что если вы не объявляете переменные в памяти, где вы это делаете? Может быть "Объявить в модуле" - хорошая альтернатива, учитывая, как используется Dim .

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

Фактически, при истоках Basic Dim использовался только для объявления массивов. Для обычных переменных не использовалось ключевое слово, вместо этого их тип был выведен из их имени. Например, если имя переменной заканчивается на $ , то это строка (это то, что вы могли видеть даже в именах методов до VB6, например Mid$). Итак, вы использовали Dim только для измерения размеров массивов (обратите внимание, что ReDim изменяет размеры массивов).

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

Во всяком случае, это не совсем так. Поскольку BASIC является частью нашей культуры и понимает, почему это так, как я, надеюсь, поможет улучшить наше видение мира.

Я сижу на своем компьютере с желанием помочь сохранить этот маленький кусочек нашей культуры, который кажется потерянным, замененным нашим угадыванием того, что это было. Итак, я выкопал MSDN как текущие, так и старые компакт-диски из версии 1998 года. Я также искал документацию для старого QBasic [должен был использовать DOSBox] и сумел получить руководство по Дартмуту, чтобы узнать, как они говорят о Dim . Для моего разочарования они не говорят, что означает Dim , и говорят только, как он используется.

Но прежде чем моя надежда была тусклой, мне удалось найти это Руководство по использованию микрокомпьютера BBC (которое, как утверждается, относится к 1984 году, и я не стоит сомневаться в этом). Микрокомпьютер BBC использовал вариант BASIC под названием BBC BASIC, и он описан в документе. Несмотря на то, что он не говорит, что означает Dim , он говорит (на странице 104):

Вы можете измерить N $, чтобы иметь столько записей, сколько хотите. Для Например, DIM N $(1000) создаст строковый массив с пространством для 1000 разные имена.

Как я уже сказал, он не говорит, что Dim обозначает размерность, но служит доказательством того, что ассоциирование Dim с Dimension было обычным явлением на момент написания этого документа.

Теперь я получил дополнительный сюрприз позже (на странице 208), заголовок раздела, который описывает ключевое слово DIM (примечание: это не указано в содержимом) говорит:

Размер DIM массива

Итак, я не получил цитату "Dim стоит...", но, я думаю, ясно, что любой достойный человек, способный читать этот документ, будет считать, что Dim означает измерение.

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

Прежде чем вы сможете использовать массив, вы должны определить его в инструкции DIM (измерение).

Вы можете найти это как часть True BASIC Online User Guides на веб-странице True BASIC inc, компании, основанной Thomas Eugene Kurtz , соавтор BASIC.

Итак, во время повторного использования Dim является сокращением для Dimension и да. Это существовало в FORTRAN раньше, поэтому вполне вероятно, что он был выбран влиянием FORTRAN как Патрик Макдональд сказал в своем ответе .

Dim sum as string = "this is not a chinese meal" REM example usage in VB.NET ;)

Английское слово DIMENSION, от которого и берется сокращение DIM, означает «размерность», «размер». Этот оператор нужен для уточнения и определения переменных, с которыми работает программа. Дело в том, что по умолчанию (так называемый default, который нехорошо ассоциируется с датой 19 августа 1998 года) QB пользуется обычными переменными одинарной точности. Если, скажем, нам понадобятся однопараметрические переменные A(I), то он их нам даст штук 10-12, а затем объявит об overflow (переполнении). Вообще говоря, оператором DIM объявляют массивы (об этом чуть позже) или определяют тип данных для немассивной переменной. Второй оператор REDIM, который можно считать дополнительным видом оператора DIM, заявляет параметры или преобразовывает параметры динамических массивов, снимая предыдущие ограничения. Формат операторов таков:

DIM variable[(subscripts)]

[,variable[(subscripts)] ]...

REDIM variable(subscripts)

[,variable(subscripts) ]...

Дадим некоторые комментарии. Здесь

SHARED указывает на то, что записанные за ним переменные разделяются также и со всеми подпрограммами или процедурами функций в создаваемом и исполняемом модуле.

variable это имя переменной или массива.

subscripts размеры массива, указываемые в формате:

[нижний TO] верхний [,[нижний TO] верхний]...

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

AS type объявляет тип данных массива или переменной (INTEGER, LONG, SINGLE, DOUBLE, STRING, или же указывается тип данных, определяемых самим пользователем).

В операторе DIM объявляют также и характер (статический или динамический) массива. Если способ хранения массива не указывается явно как $STATIC, $DYNAMIC, или COMMON, массивы с цифрами вместо индексов являются статическими, а массивы в DIM с символьными переменными являются динамическими. Оператор REDIM всегда объявляет динамические массивы. Режим статических массивов автоматически заявлен при запуске программы и таким и остается. Хранение динамических массивов происходит в памяти машины во время выполнения программы.

Вернемся к программе, считающей факториал. Добавим в ней такие строки

dim fkt as double

if i<25 then goto 20

print i;“! = ”fkt

Вот теперь для того, чтобы заставить программу «заткнуться» от переполнения, нужно взять весьма большое число, например 171.

Еще одно дополнение. Для экономии памяти машины, часто используют такую возможность, заложенную в QB, как приписывание знака % (процент) к имени числовой переменной для того, чтобы она была заявлена в программе, как целое число. Таким образом, наша последняя программа с учетом такого способа описания целых переменных будет выглядеть так:

dim fkt as double

if i%<25 then goto 20

print i%;“! = ”fkt

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

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

Для чего нужна переменная? Чтобы хранить значение и применить его позже в любой момент. Например, в ячейке А1 записана сумма, а нажатием на кнопку запускается обновление отчета. После обновления отчета сумма в А1 изменится. Необходимо сверить сумму до обновления с суммой после и в зависимости от этого сделать какое-либо действие. Переменная как раз позволит запомнить значение ячейки до того, как она обновится и использовать именно это значение после обновления.

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

В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 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 по умолчанию и принимает любой тип данных.

Так же переменным можно назначать и другие типы данных, которых нет в таблице выше - это типы, которые поддерживаются объектной моделью приложений, к которым "подключен" VBA. Например, если зайти в VBA из Excel, то библиотека типов объектной модели Excel подключена по умолчанию и для переменных становится доступно множество типов этой объектной модели. Многие из них знакомы всем: Workbook, Worksheet, Range, Cells, Chart и т.д. Т.е. это книги, листы, ячейки, диаграммы. Типов много, почти на каждый объект и коллекцию. Рассматривать здесь все бессмысленно. Могу лишь привести пару строк кода:

"Имя моей программы"

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

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

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

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

Dim MyVar1, MyVar2, MyVar3 As Integer

Dim MyVar1, MyVar2, MyVar3 As Integer

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

Dim MyVar1%, MyVar2%, MyVar3%

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

Теперь разберемся с операторами области действия(Dim , Public и Static):

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

    Option Explicit Sub main() Public MyVariable As String MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable "пробуем изменить значение переменной Call sub_main "показываем измененное значение переменной MsgBox MyVariable End Sub "доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

    переменные не будут видны во всех модулях всех процедур и функций проекта, потому что:
    1. Оператор Public недопустим внутри процедуры(между Sub и End Sub), поэтому VBA при попытке выполнения такой процедуры обязательно выдаст ошибку - Invalid Attribut in Sub or Function .
    2. Даже если Public заменить на Dim - это уже будет переменная уровня процедуры и для других процедур будет недоступна.
    3. Т.к. объявление неверное - вторая процедура(ChangeMyVariable) ничего не знает о переменной MyVariable и естественно, не сможет изменить именно её.
    Правильное объявление

    "выше глобальных переменных и констант могут быть только декларации: Option Explicit "принудительное объявление переменных Option Base 1 "нижняя граница объявляемых массивов начинается с 1 Option Compare Text "сравнение текста без учета регистра "глобальная переменная - первой строкой, выше всех процедур Public MyVariable As String "далее процедуры и функции Sub main() MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable, vbInformation, "www.сайт" "пробуем изменить значение переменной Call ChangeMyVariable "показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www.сайт" End Sub "доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

    "выше глобальных переменных и констант могут быть только декларации: Option Explicit "принудительное объявление переменных Option Base 1 "нижняя граница объявляемых массивов начинается с 1 Option Compare Text "сравнение текста без учета регистра "глобальная переменная - первой строкой, выше всех процедур Public MyVariable As String "далее процедуры и функции Sub main() MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable, vbInformation, "www.сайт" "пробуем изменить значение переменной Call ChangeMyVariable "показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www..процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

  • Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия - 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, при помощи которых можно указать тип данных по умолчанию для переменных, первая буква имени которых попадает в заданный в операторе диапазон. Например:

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

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

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

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 английский язык "родной" и лучше использовать его.

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

Sub main() "объявляем переменные с назначением конкретных типов "As String - текст "As Long - целое число Dim sAddress As String , sNewAddress As String , sShName As String Dim lRow As Long Dim rRange as Range "присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection "меняем выделение - выделяем ячейку D9 Range("D9" ).Select "назначаем переменной адрес выделенных ячеек sAddress = Selection.Address "назначаем переменной lRow значение первой строки выделенной области lRow = Selection.Row "показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.сайт" MsgBox "Номер первой строки: " & lRow, vbInformation, "www.сайт" "назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" "выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.сайт" "выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.сайт" "задаем значение переменной sShName = "excel-vba" "переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub

Sub main() "объявляем переменные с назначением конкретных типов "As String - текст "As Long - целое число Dim sAddress As String, sNewAddress As String, sShName As String Dim lRow As Long Dim rRange as Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection "меняем выделение - выделяем ячейку D9 Range("D9").Select "назначаем переменной адрес выделенных ячеек sAddress = Selection.Address "назначаем переменной lRow значение первой строки выделенной области lRow = Selection.Row "показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www..сайт" "назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" "выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.сайт" "выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.сайт" "задаем значение переменной sShName = "excel-vba" "переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub

Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Если переменной назначается ссылка на ячейку(Set var = Range("A1")), то обращение к переменной идентично обращению к самой ячейке А1 когда бы это ни происходило. Такое назначение не запоминает свойства ячейки до или после - в переменной хранится ссылка на конкретную ячейку и доступ есть исключительно к свойствам ячейки на текущий момент. Чтобы запомнить значение, цвет ячейки или даже адрес (а так же и другие свойства) до изменения ячейки и применить их даже после изменения/перемещения самой ячейки - необходимо запоминать в переменные именно свойства ячейки:

Sub main() Dim val, l_InteriorColor As Long , l_FontColor As Long Dim rRange As Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на активную ячейку Set rRange = ActiveCell "запоминаем свойства ячейки val = rRange.Value "значение l_InteriorColor = rRange.Interior.Color "цвет заливки l_FontColor = rRange.Font.Color "цвет шрифта "копируем другую ячейку и вставляем на место активной ActiveSheet.Range("D1" ).Copy rRange "проверяем, что rRange теперь имеет совершенно другие свойста - как у D1 "Цвет заливки rRange: " "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" "назначаем свойства из сохраненных в переменных rRange.Value = val "значение rRange.Interior.Color = l_InteriorColor "цвет заливки rRange.Font.Color = l_FontColor "цвет шрифта "проверяем, что rRange возвращены параметры до копирования MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" End Sub

Sub main() Dim val, l_InteriorColor As Long, l_FontColor As Long Dim rRange As Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на активную ячейку Set rRange = ActiveCell "запоминаем свойства ячейки val = rRange.Value "значение l_InteriorColor = rRange.Interior.Color "цвет заливки l_FontColor = rRange.Font.Color "цвет шрифта "копируем другую ячейку и вставляем на место активной ActiveSheet.Range("D1").Copy rRange "проверяем, что rRange теперь имеет совершенно другие свойста - как у D1 MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www..Value = val "значение rRange.Interior.Color = l_InteriorColor "цвет заливки rRange.Font.Color = l_FontColor "цвет шрифта "проверяем, что rRange возвращены параметры до копирования MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" End Sub

Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.

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

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

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

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

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

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

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

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

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

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

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

Типы данных

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

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

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

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

Примечание переводчика: Говоря о переменных в VBA, стоит упомянуть ещё один очень важный момент. Если мы объявляем переменную, но не присваиваем ей какое-либо значение, то она инициализируется значением по умолчанию:
текстовые строки – инициализируются пустыми строками;
числа – значением 0;
переменные типа Boolean – False;
даты – 30 декабря 1899.

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

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

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

Dim sVAT_Rate As Single Dim i As Integer

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

Const iMaxCount = 5000 Const iMaxScore = 100

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

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

  1. Использование памяти и скорость вычислений. Если не объявлять переменную с указанием типа данных, то по умолчанию для неё будет установлен тип Variant . Этот тип данных использует больше памяти, чем другие типы данных.Казалось бы, несколько лишних байт на каждую переменную – не так уж много, но на практике в создаваемых программах могут быть тысячи переменных (особенно при работе с массивами). Поэтому излишняя память, используемая переменными типа Variant , по сравнению с переменными типа Integer или Single , может сложится в значительную сумму.К тому же, операции с переменными типа Variant выполняются гораздо медленнее, чем с переменными других типов, соответственно лишняя тысяча переменных типа Variant может значительно замедлить вычисления.
  2. Профилактика опечаток в именах переменных. Если все переменные объявляются, то можно использовать оператор VBA – Option Explicit (о нём расскажем далее), чтобы выявить все не объявленные переменные.Таким образом исключается появление в программе ошибки в результате не верно записанного имени переменной. Например, используя в коде переменную с именем sVAT_Rate , можно допустить опечатку и, присваивая значение этой переменной, записать: “VATRate = 0,175”. Ожидается, что с этого момента, переменная sVAT_Rate должна содержать значение 0,175 – но, конечно же, этого не происходит. Если же включен режим обязательного объявления всех используемых переменных, то компилятор VBA сразу же укажет на ошибку, так как не найдёт переменную VATRate среди объявленных.
  3. Выделение значений, не соответствующих объявленному типу переменной. Если объявить переменную определённого типа и попытаться присвоить ей данные другого типа, то появится ошибка, не исправив которую, можно получить сбой в работе программы.На первый взгляд, это может показаться хорошей причиной, чтобы не объявлять переменные, но на самом деле, чем раньше выяснится, что одна из переменных получила не те данные, которые должна была получить – тем лучше! Иначе, если программа продолжит работу, результаты могут оказаться неверными и неожиданными, а найти причину ошибок будет гораздо сложнее.Возможно также, что макрос будет “успешно” выполнен. В результате ошибка останется незамеченной и работа продолжится с неверными данными!

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

Option Explicit

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

Option Explicit

Если хотите всегда вставлять Option Explicit в начало каждого нового созданного модуля VBA, то это можно делать автоматически. Для этого необходимо включить параметр Require Variable Declaration в настройках редактора VBA.

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

  • В меню редактора Visual Basic нажмите Tools > Options
  • В появившемся диалоговом окне откройте вкладку Editor
  • Отметьте галочкой параметр Require Variable Declaration и нажмите ОК

При включенном параметре строка Option Explicit будет автоматически вставляться в начало каждого нового созданного модуля.

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

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

Option Explicit Dim sVAT_Rate As Single Function Total_Cost() As Double ... End Function

Если переменная sVAT_Rate объявлена в самом начале модуля, то областью действия этой переменной будет весь модуль (т.е. переменная sVAT_Rate будет распознаваться всеми процедурами в этом модуле).

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

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

Option Explicit Function Total_Cost() As Double Dim sVAT_Rate As Single ... End Function

Если переменная sVAT_Rate объявлена в начале функции Total_Cost , то её область действия будет ограничена только этой функцией (т.е. в пределах функции Total_Cost , можно будет использовать переменную sVAT_Rate , а за её пределами – нет).

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

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

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

Для объявления констант также можно использовать ключевые слова Public и Private , но не вместо ключевого слова Const , а вместе с ним.

В следующих примерах показано использование ключевых слов Public и Private в применении к переменным и к константам.

6. Объявление переменных: оператор Dim для различных типов данных

Чаще всего люди стараются не пользоваться идентификаторами при обозначении типа переменной (тем более для таких типов, как дата/время). Вместо этого они применяют оператор Dim. Подобная операция называется объявлением. Объявление типов переменных при осуществлении обработки событий перед их использованием – естественно, с комментариями – представляет собой хороший стиль в программировании. Это также дает возможность улучшить «читабельность» текстов программ.

Если переменную объявили с помощью оператора Dim, в случае применения переменной с тем же именем и другим идентификатором типа будет наблюдаться ошибка «двойное определение» при запуске программы. К примеру, если следующее выражение Dim Count As Integer объявляет переменную Count, то нельзя применять переменные Counts, Count! Count# и Count®. Следует использовать только имя Count%, но это всего лишь другая форма для имени переменной Count.

Чтобы присвоить переменной тип variant, используют оператор Dim без As:

Dim F00 считает F00 переменной типа variant.

Можно написать и следующим образом: Dim Foo As Variant – это проще для прочтения.

Каждая информация, которая должна быть доступна всем процедурам обработки событий, относящихся к форме, размещается в разделе (General) данной формы.

Для размещения Option Explicit в раздел (General), следует выполнить следующие действия.

1. Открыть окно Code.

2. Выбрать объект (General) из списка объектов, которые предлагаются в окне Object.

3. Выбрать (Declaration) из списка Ргос.

4. Ввести Option Explicit.

Часто применять объявления на уровне формы в разделе (General) необходимо, когда пользователь экспериментирует с примерами программ из справочной системы.

Для того чтобы копировать пример программы из справочной системы, следует использовать кнопку Copy в окне Code для примера. После этого можно использовать пункт Paste из меню Edit для помещения примера в окно Code. Когда Visual Basic встречает команду Option Explicit, он перестает позволять использовать необъявленные переменные. Если попробовать все же использовать такую переменную, будет показано сообщение об ошибке.

Для применения обязательного объявления типа переменной можно пользоваться страницей Editor диалоговой панели Tools|0ptions. Программист всегда устанавливает такой флажок. После этого оператор Option Explicit автоматически помещается в те места кода, где это необходимо.

Из книги Давайте создадим компилятор! автора Креншоу Джек

Из книги Интернет-разведка [Руководство к действию] автора Ющук Евгений Леонидович

Метапоисковые машины Интернета с примерами поиска различных типов информации Каждый из увлеченных пользователей Сети в душе мечтает о существовании одной-единственной информационной системы, которая сочетала бы в себе достоинства всех поисковиков

Из книги Серверные технологии хранения данных в среде Windows® 2000 Windows® Server 2003 автора Дайлип Наик

Глава 10 Возможности подсистемы хранения данных в различных версиях Windows NT В предыдущих главах рассматривалась архитектура Windows в рамках определенных возможностей подсистемы хранения данных. Эта глава предназначена для профессионалов, использующих подсистемы хранения

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Объявление переменных Перед использованием переменной в коде Web-сценария рекомендуется выполнить ее объявление. Для этого служит оператор объявления переменной var, после которого указывают имя переменной:var x;Теперь объявленной переменной можно присвоить какое-либо

Из книги VBA для чайников автора Каммингс Стив

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

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

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

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Из книги Linux программирование в примерах автора Роббинс Арнольд

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

Из книги Конец холивара. Pascal vs C автора Кривцов М. А.

Объявление переменных класса Для объявления переменных, которые понадобятся в нескольких свойствах или методах, используйте раздел Declarations в самом начале модуля класса. Всегда объявляйте эти переменные как локальные (Private), ведь объекты в основном предназначены для

Из книги автора

Объявление переменных В этом разделе дано последовательное описание синтаксиса и семантики объявлений переменных. Разновидности переменных перечислены в следующей таблице:Таблица 3.4. Вид переменной Пояснение Простая переменная Скалярная переменная целого или

Из книги автора

Объявление данных Если непосредственно за ключевым словом near, far или huge следует идентификатор, то это значит, что соответствующий элемент данных будет размещен в стандартном сегменте (для near) или может быть размещен в другом сегменте данных (для far или huge). Например,

Из книги автора

9.4. Объявление переменных: declare и typeset Инструкции declare и typeset являются встроенными инструкциями (они абсолютно идентичны друг другу и являются синонимами) и предназначена для наложения ограничений на переменные. Это очень слабая попытка контроля над типами, которая

Из книги автора

8.1.2. Обзор различных типов файловых систем ЗАМЕЧАНИЕ. Обсуждение в данном разделе специфично для Linux. Однако, у многих современных систем Unix также есть сходные особенности. Мы рекомендуем вам изучить документацию своей системы. Исторически V7 Unix поддерживал лишь один тип

Из книги автора

Стандартные типы данных и описание переменных Значение присваиваемое переменной должно соответствовать её типу указанному в разделе описаний. В Pascal есть четыре стандартных типа величин (помимо тех, что могут быть дополнительно определены в каждой программе –

Из книги автора

Стандартные типы данных и описание переменных int – целоеlong – длинное целоеshort – короткое целоеunsigned – беззнаковое целоеfloat – вещественноеdouble – длинное вещественноеchar – литерноеВ отличии от Pfscal, в С логических переменных нет.Примеры описания переменных:int k;char a,

Понравилась статья? Поделиться с друзьями: