Оператор Dim
Объявляет переменные и распределяет дисковое пространство.
Синтаксис
Dim [ WithEvents ] varname [ ( [ subscripts ] ] ] [ As [New ] type ] [ [ WithEvents ] varname [ subscripts] ] ] [ As [ New ] type ].
Синтаксис оператора Dim состоит из следующих частей:
Если явно не указано в нижней части, нижняя граница массива контролируется заявлением Option Base. Если оператор Option Base не задан, нижняя граница равна нулю.
Примечания
Переменные, объявляемые с помощью оператора Dim на уровне модуля, доступны всем процедурам внутри этого модуля. На уровне процедуры переменные доступны только внутри соответствующей процедуры.
Чтобы объявить тип данных переменной, используйте заявление Dim на уровне модуля или процедуры. Например, следующий оператор объявляет переменную с типом Integer.
Также используйте оператор Dim для объявления типа объекта переменной. В следующем примере объявляется переменная для нового экземпляра листа.
Если ключевое слово New не используется при объявлении переменной объекта, переменная, ссылающаяся на объект, должна быть назначена существующему объекту с помощью утверждения Set перед его использованием. Пока она не назначена объекту, объявленная объектная переменная имеет особое значение Nothing, указывающее на отсутствие ссылки на какой-либо конкретный экземпляр объекта.
Вы можете также использовать оператор Dim с пустыми скобками для объявления динамического массива. Объявив динамический массив, используйте заявление ReDim в процедуре, чтобы определить количество измерений и элементов в массиве. Если вы пытаетесь перенастроить измерение для переменной массива, размер которой был явно указан в частном, публичном или дим-заявлении, возникает ошибка.
Если вы не указываете тип данных или тип объекта, а в модуле нет Def_type_, переменная по умолчанию является Variant. При инициализации переменных числовой переменной присваивается значение 0, строке переменной длины — строка нулевой длины («»), а строка фиксированной длины заполняется нулями. Переменные типа Variant при инициализации получают значение Empty. Каждый элемент переменной определяемого пользователем типа инициализируется как отдельная переменная.
Когда оператор Dim используется в процедуре, обычно этот оператор Dim располагают в начале этой процедуры
Пример
В этом примере показывается, как используется оператор Dim для объявления переменных. В нем также показывается, как оператор Dim используется для объявления массивов. Нижний предел по умолчанию для подскрипников массива — 0 и может быть переопределен на уровне модуля с помощью утверждения Option Base.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Dim statement
Declares variables and allocates storage space.
Syntax
The Dim statement syntax has these parts:
When not explicitly stated in lower, the lower bound of an array is controlled by the Option Base statement. The lower bound is zero if no Option Base statement is present.
The New keyword can’t be used to declare variables of any intrinsic data type or to declare instances of dependent objects, and it can’t be used with WithEvents.
Remarks
Variables declared with Dim at the module level are available to all procedures within the module. At the procedure level, variables are available only within the procedure.
Use the Dim statement at the module or procedure level to declare the data type of a variable. For example, the following statement declares a variable as an Integer.
Also use a Dim statement to declare the object type of a variable. The following declares a variable for a new instance of a worksheet.
If the New keyword is not used when declaring an object variable, the variable that refers to the object must be assigned an existing object by using the Set statement before it can be used. Until it is assigned an object, the declared object variable has the special value Nothing, which indicates that it doesn’t refer to any particular instance of an object.
You can also use the Dim statement with empty parentheses to declare a dynamic array. After declaring a dynamic array, use the ReDim statement within a procedure to define the number of dimensions and elements in the array. If you try to redeclare a dimension for an array variable whose size was explicitly specified in a Private, Public, or Dim statement, an error occurs.
If you don’t specify a data type or object type, and there is no Def_type_ statement in the module, the variable is Variant by default. When variables are initialized, a numeric variable is initialized to 0, a variable-length string is initialized to a zero-length string («»), and a fixed-length string is filled with zeros. Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable.
When you use the Dim statement in a procedure, you generally put the Dim statement at the beginning of the procedure.
Example
This example shows the Dim statement used to declare variables. It also shows the Dim statement used to declare arrays. The default lower bound for array subscripts is 0 and can be overridden at the module level by using the Option Base statement.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Оператор Dim (Visual Basic)
Объявляет и выделяет дисковое пространство для одной или нескольких переменных.
Синтаксис
Компоненты
Необязательный элемент. См. список атрибутов.
Необязательный элемент. Может применяться один из перечисленных ниже типов.
Необязательный элемент. См. раздел Shared.
Необязательный элемент. См. раздел Shadows.
Необязательный элемент. См. раздел static.
Необязательный элемент. См. раздел ReadOnly.
Необязательный элемент. Указывает, что это переменные объекта, которые ссылаются на экземпляры класса, которые могут создавать события. См. раздел WithEvents.
Обязательный элемент. Список переменных, объявляемых в этой инструкции.
Каждый элемент variable имеет перечисленные ниже синтаксис и компоненты.
Комментарии
компилятор Visual Basic использует Dim инструкцию для определения типа данных переменной и других сведений, например кода, который может получить доступ к переменной. В следующем примере объявляется переменная для хранения Integer значения.
Можно указать любой тип данных или имя перечисления, структуры, класса или интерфейса.
Переменную можно объявить в процедуре, блоке, классе, структуре или модуле. Нельзя объявить переменную в исходном файле, пространстве имен или интерфейсе. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
Если Option Explicit параметр имеет значение On (значение по умолчанию), компилятору требуется объявление для каждой используемой переменной. Дополнительные сведения см. в разделе оператор Option Explicit.
Указание начального значения
Определение типа применяется на уровне процедуры. Он не применяется за пределами процедуры в классе, структуре, модуле или интерфейсе. Дополнительные сведения о выводе типа см. в разделе Option Infer и определение локального типа.
Сведения о том, что происходит, если не указан тип данных или инициализатор, см. в подразделе типы данных и значения по умолчанию далее в этой статье.
Инициализатор объекта можно использовать для объявления экземпляров именованных и анонимных типов. Следующий код создает экземпляр Student класса и использует инициализатор объекта для инициализации свойств.
Объявление нескольких переменных
Можно объявить несколько переменных в одном операторе объявления, указав имя переменной для каждой из них, и после каждого имени массива с круглыми скобками. Переменные разделяются запятыми.
Если объявить более одной переменной с одним As предложением, вы не сможете предоставить инициализатор для этой группы переменных.
Можно указать различные типы данных для разных переменных, используя отдельное As предложение для каждой объявляемой переменной. Каждая переменная принимает тип данных, указанный в первом As предложении, обнаруженном после его variablename части.
Массивы
Можно объявить переменную для хранения массива, который может содержать несколько значений. Чтобы указать, что переменная содержит массив, сразу после нее следует использовать variablename круглые скобки. Дополнительные сведения см. в руководстве по работе с массивами.
Можно указать нижнюю и верхнюю границы каждого измерения массива. Для этого добавьте в boundslist круглые скобки. Для каждого измерения объект boundslist задает верхнюю границу и, при необходимости, нижнюю границу. Нижняя граница всегда равна нулю, независимо от того, указана она или нет. Каждый индекс может изменяться от нуля до значения его верхней границы.
Следующие две инструкции эквивалентны. Каждый оператор объявляет массив из 21 Integer элемента. При доступе к массиву индекс может изменяться от 0 до 20.
Массив может иметь размер от 1 до 32.
Все границы в объявлении массива можно оставить пустыми. В этом случае массив имеет указанное число измерений, но не инициализировано. Он имеет значение Nothing до тех пор, пока не будет инициализировано по крайней мере часть его элементов. В Dim инструкции должны быть указаны границы для всех измерений или для отсутствия измерений.
Если массив имеет более одного измерения, необходимо включить запятые между круглыми скобками, чтобы указать количество измерений.
Значения массива можно инициализировать с помощью литерала массива. Для этого заключите значения инициализации в фигурные скобки ( <> ).
Для многомерных массивов инициализация каждого отдельного измерения заключается в фигурные скобки во внешнем измерении. Элементы задаются в построчном порядке.
Дополнительные сведения о литералах массивов см. в разделе массивы.
Типы данных и значения по умолчанию
Если параметр Option Strict включен, возникает ошибка времени при компиляции.
Если параметр Option Infer отключен, а параметр Option Strict включен, возникает ошибка времени компиляции.
если указать тип данных, но не указать инициализатор, Visual Basic инициализирует переменную как значение по умолчанию для ее типа данных. В следующей таблице приведены значения инициализации по умолчанию.
Каждый элемент структуры инициализируется так, как если бы он был отдельной переменной. Если вы объявили длину массива, но не инициализируйте его элементы, каждый элемент инициализируется так, как если бы он был отдельной переменной.
Время существования статической локальной переменной
| Объявление процедуры | Переменная инициализирована | Переменная останавливается |
|---|---|---|
| В модуле | При первом вызове процедуры | При остановке выполнения программы |
| В классе или структуре процедура Shared | При первом вызове процедуры либо в определенном экземпляре, либо в самом классе или структуре. | При остановке выполнения программы |
| В классе или структуре процедура не Shared | При первом вызове процедуры в определенном экземпляре | Когда экземпляр выпускается для сборки мусора (GC) |
Атрибуты и модификаторы
Атрибуты можно применять только к переменным члена, а не к локальным переменным. Атрибут вносит сведения в метаданные сборки, что не имеет смысла для временного хранения, например локальных переменных.
Код за пределами класса, структуры или модуля должен уточнять имя переменной-члена именем этого класса, структуры или модуля. Код за пределами процедуры или блока не может ссылаться на локальные переменные в этой процедуре или блоке.
Освобождение управляемых ресурсов
Если класс принадлежит особому ценному и ограниченному ресурсу (например, к подключению к базе данных или файлу), может возникнуть необходимость в ожидании следующей сборки мусора для очистки экземпляра класса, который больше не используется. Класс может реализовать интерфейс, IDisposable чтобы предоставить способ освобождения ресурсов перед сборкой мусора. Класс, реализующий этот интерфейс, предоставляет Dispose метод, который может быть вызван для немедленного освобождения ценных ресурсов.
Using Инструкция автоматизирует процесс получения ресурса, выполнения набора инструкций и последующего удаления ресурса. Однако ресурс должен реализовывать IDisposable интерфейс. Дополнительные сведения см. в разделе Оператор using.
Пример 1
В следующем примере переменные объявляются с помощью Dim инструкции с различными параметрами.
Пример 2
В следующем примере выводятся простые числа от 1 до 30. Область локальных переменных описывается в разделе Комментарии к коду.
Пример 3
В следующем примере speedValue переменная объявляется на уровне класса. Private Ключевое слово используется для объявления переменной. Доступ к переменной может осуществляться любой процедурой в Car классе.
Что такое переменная и как правильно её объявить?
Для чего нужна переменная? Чтобы хранить значение и применить его позже в любой момент. Например, в ячейке А1 записана сумма, а нажатием на кнопку запускается обновление отчета. После обновления отчета сумма в А1 изменится. Необходимо сверить сумму до обновления с суммой после и в зависимости от этого сделать какое-либо действие. Переменная как раз позволит запомнить значение ячейки до того, как она обновится и использовать именно это значение после обновления.
Требования к переменным:
В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 254 символов. Так же нельзя использовать в качестве имен для переменных зарезервированные константы редактора VBA(например Sub, Msgbox, ubound, Date и т.п.). Так же для переменных неважен регистр букв.
Теперь рассмотрим основные декларированные в VBA типы данных, которые можно хранить в переменных:
Dim rRange as Range ‘назначили переменной тип ячейка/диапазон Set rRange = Range(«A1») ‘присвоили ссылку на ячейку A1 текущего листа
Про объявление переменных подробно написано чуть ниже.
А более подробно про обращение к диапазонам из VBA можно почитать в этой статье: Как обратиться к диапазону из VBA
[оператор области действия] Имя_переменной As [тип данных]
Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:
Dim MyVar1, MyVar2, MyVar3 As Integer
Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer
Dim MyVar1%, MyVar2%, MyVar3%
Option Explicit Sub main() Public MyVariable As String MyVariable = «Глобальная переменная» ‘показываем текущее значение переменной MsgBox MyVariable ‘пробуем изменить значение переменной Call sub_main ‘показываем измененное значение переменной MsgBox MyVariable End Sub ‘доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = «Изменили её значение» End Sub
Как правильно назвать переменную:
| Префикс | Тип хранимых данных |
|---|---|
| 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 Sub test() Dim bCheck End Sub
DefBool B-C Sub test() Dim bCheck, cCheck End Sub
Но я считаю, что одной буквы для одного типа вполне достаточно. Можно задать сразу несколько операторов Def.
DefBool B DefStr S Sub test() Dim bCheck, sCheck End Sub
Небольшой пример использования переменных в кодах:
Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Назначение значений переменным задается при помощи знака равно(=). Однако, есть небольшой нюанс: для переменных типа Object (а так же других объектных типов(Workbook, Worksheet, Range, Cells, Chart и т.п.)) присвоение идет при помощи ключевого оператора Set :
‘присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection
Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.
Для других же типов Set не нужен и в переменную значение заносится без этих нюансов.
Const sMyConst As String = «Имя моей программы»
Во всем остальном объявление и применение констант идентично объявлению переменных. Коротко приведу пару примеров.
Если константа объявлена внутри процедуры:
Sub TestConst() Const sMyConst As String = «Имя моей программы» MsgBox sMyConst ‘показываем сообщение с именем программы End Sub
то она не может быть использована в другой процедуре:
Sub TestConst() Const sMyConst As String = «Имя моей программы» MsgBox sMyConst ‘показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst ‘вызовет ошибку Variable not defined End Sub
Чтобы использовать одну константу во всех процедурах модуля(того, в котором она объявлена), необходимо объявить её в области объявлений:
Const sMyConst As String = «Имя моей программы» Sub TestConst() MsgBox sMyConst ‘показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst ‘уже не вызовет ошибку Variable not defined End Sub
Чтобы использовать одну константу во всех процедурах проекта(книги), необходимо объявить её как Public:
Public Const sMyConst As String = «Имя моей программы» Sub TestConst() MsgBox sMyConst ‘показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst ‘не вызовет ошибку Variable not defined, даже если процедура в другом модуле End Sub
Статья помогла? Поделись ссылкой с друзьями!
Работа с переменными
Постоянная одного человека — переменная другого
Эта статья содержит полное руководство по работе с переменными и использованию VBA Dim.
Первый раздел содержит краткое руководство по использованию оператора Dim, включая примеры и формат оператора Dim.
Остальная часть поста содержит наиболее полное руководство, которое вы найдете в VBA Dim Statement.
Если вы заинтересованы в объявлении параметров, вы можете прочитать о них здесь.
Краткое руководство по использованию VBA Dim Statement
| Описание | Формат | Пример |
| Базовая переменная | Dim [имя переменной] As [Тип] | Dim count As Long Dim amount As Currency Dim name As String Dim visible As Boolean |
| Фиксированная строка | Dim [имя переменной] As String *[размер] | Dim s As String * 4 Dim t As String * 10 |
| Вариант | Dim [имя переменной] As Variant Dim [имя переменной] | Dim var As Variant Dim var |
| Объект использует Dim и New | Dim [имя переменной] As New [тип объекта] | Dim coll As New Collection Dim coll As New Class1 |
| Объект использует Dim и New | Dim [имя переменной] As [тип объекта] Set [имя переменной] = New [тип объекта] | Dim coll As Collection Set coll = New Collection Dim coll As Class1 Set coll = New Class1 |
| Статический массив | Dim [имя переменной] ([первый] To [последний] ) As[Тип] | Dim arr(1 To 6) As Long |
| Динамический массив | Dim [имя переменной]() As [Тип] ReDim [имя переменной] ([первый] To [последний]) | Dim arr() As Long ReDim arr(1 To 6) |
| Внешняя библиотека (Раннее связывание) * | Dim [имя переменной] As New [пункт] | Dim dict As New Dictionary |
| Внешняя библиотека (Раннее связывание с использованием Set) * | Dim [имя переменной] As [пункт] Set [имя переменной] = New [пункт] | Dim dict As Dictionary Set dict = New Dictonary |
| Внешняя библиотека (Позднее связывание) | Dim [имя переменной] As Object Set [имя переменной] = CreateObject («[библиотека]») | Dim dict As Object Set dict = CreateObject(«Scripting. Dictionary») |
Полезные ссылки
Что такое VBA Dim Statement?
Ключевое слово Dim — это сокращение от Dimension. Он используется для объявления переменных в VBA.
Объявление означает, что мы говорим VBA о переменной, которую будем использовать позже.
Существует четыре типа Dim Statement. Все они очень похожи по синтаксису.
Ниже приводится краткое описание каждого типа
В следующем разделе мы рассмотрим формат оператора VBA Dim с некоторыми примерами каждого из них.
В последующих разделах мы рассмотрим каждый тип более подробно.
Формат VBA Dim Statement
Формат выражения Dim показан ниже.
Мы рассмотрим эти различные типы операторов Dim в следующих разделах.
Как использовать Dim с несколькими переменными
Мы можем объявить несколько переменных в одном выражении Dim.
Если мы опускаем тип, то VBA автоматически устанавливает тип как Variant. Мы увидим больше о Variant позже.
Когда вы объявляете несколько переменных, вы должны указать тип каждой отдельно.
Вы можете поместить столько переменных, сколько захотите, в одном выражении Dim, но для удобства чтения рекомендуется оставить его равным 3 или 4.
Где я должен поместить Dim Statement?
Оператор Dim может быть помещен в любое место кода. Тем не менее, он должен предшествовать любой строке, где используется переменная.
Если переменная используется перед оператором Dim, вы получите ошибку «переменная не определена»
Когда дело доходит до позиционирования ваших Dim утверждений, вы можете сделать это двумя основными способами. Вы можете разместить все свои Dim заявления в верхней части процедуры.
ИЛИ вы можете объявить переменные непосредственно перед их использованием:
Я лично предпочитаю последнее, так как оно делает код более аккуратным, и его легче читать, обновлять и обнаруживать ошибки.
Использование Dim в циклах
Помещение оператора Dim в цикл не влияет на переменную.
Когда VBA запускает Sub (или Function), первым делом он создает все переменные, которые были объявлены в выражениях Dim.
Следующие 2 фрагмента кода практически одинаковы. Во-первых, переменная Count объявляется перед циклом. Во втором он объявлен в цикле.
Код будет вести себя точно так же, потому что VBA создаст переменные при входе в подпрограмму.
Могу ли я использовать Dim для присвоения значения?
В таких языках, как C ++, C # и Java, мы можем объявлять и назначать переменные в одной строке:
Мы не можем сделать это в VBA. Мы можем использовать оператор двоеточия для размещения объявлений и назначения строк в одной строке.
Мы не объявляем и не присваиваем в одной строке VBA. Что мы делаем, это помещаем эти две строки (ниже) в одну строку в редакторе. Что касается VBA, это две отдельные строки, как здесь:
Здесь мы помещаем 3 строки кода в одну строку редактора, используя двоеточие:
Нет никаких преимуществ или недостатков в назначении и объявлении в одной строке редактора. Все сводится к личным предпочтениям.
Dim действительно требуется?
Ответ в том, что это не обязательно. VBA не требует от вас использовать Dim Statement.
Однако не использовать оператор Dim — плохая практика и может привести к множеству проблем.
Вы можете использовать переменную без предварительного использования оператора Dim. В этом случае переменная автоматически будет типом варианта.
Это может привести к таким проблемам, как
Из-за этих проблем рекомендуется сделать использование Dim обязательным в нашем коде. Мы делаем это с помощью оператора Option Explicit.
Мы можем сделать Dim обязательным в модуле, набрав «Option Explicit» в верхней части модуля.
Мы можем сделать это автоматически в каждом новом модуле, выбрав Tools-> Options из меню и отметив флажок «Требовать декларацию переменной». Затем, когда вы вставите новый модуль, «Option Explicit» будет автоматически добавлен в начало.
Давайте посмотрим на некоторые ошибки, которые могут остаться незамеченными, если мы не будем использовать Dim.
Ошибки Переменной
В приведенном ниже коде мы используем переменную Total без использования оператора Dim.
Если мы случайно написали Total неправильно, VBA сочтет это новой переменной.
В приведенном ниже коде мы неправильно написали переменную Total как Totall.
VBA не обнаружит ошибок в коде, и будет напечатано неверное значение.
Давайте добавим Option Explicit и попробуйте приведенный выше код снова
Теперь, когда мы запустим код, мы получим ошибку «Переменная не определена». Чтобы эта ошибка не появлялась, мы должны использовать Dim для каждой переменной, которую мы хотим использовать.
Когда мы добавим оператор Dim для Total и запустим код, мы получим ошибку, сообщающую, что опечатка Totall не была определена.
Это действительно полезно, так как помогает нам найти ошибку, которая в противном случае осталась бы незамеченной.
Ошибка в ключевом слове
Вот второй пример, который более тонкий.
Когда следующий код выполняется, он должен изменить шрифт в ячейке A1 на синий.
Однако, когда код запускается, ничего не происходит.
Ошибка здесь в том, что rgblue должен быть rgbBlue. Если вы добавите Option Explicit в модуль, появится ошибка «переменная не определена». Это значительно облегчает решение проблемы.
Эти два примера очень просты. Если у вас много кода, то подобные ошибки могут стать кошмаром для отслеживания.
Использование Dim с Basic Variables
VBA имеет те же основные типы переменных, которые используются в электронной таблице Excel.
Вы можете увидеть список всех типов переменных VBA здесь.
Тем не менее, большую часть времени вы будете использовать следующие:
Однако в 32-битной (или выше) системе целое число автоматически преобразуется в длинное. Поскольку Windows была 32-битной начиная с Windows 95 \ NT, нет смысла использовать Integer.
В двух словах, всегда используйте Long для целочисленного типа в VBA.
Фиксированный тип строки
В VBA есть один необычный тип базовой переменной, с которым вы, возможно, не знакомы.
Это фиксированный тип строки. Когда мы создаем нормальную строку в VBA, мы можем добавить текст, и VBA автоматически изменит размер строки для нас.
Фиксированная строка никогда не изменяется. Эта строка всегда будет иметь одинаковый размер независимо от того, что вы ей назначаете
вот несколько примеров:
Использование Dim с Variants
Когда мы объявляем переменную как вариант, VBA решает во время выполнения, какой тип переменной должен быть.
Мы объявляем варианты следующим образом
Однако использование вариантов является плохой практикой, и вот почему:
Тип ошибки
Ошибки твои друзья!
Они могут раздражать и расстраивать, когда они случаются, но они предупреждают вас о будущих проблемах, которые не так легко найти.
Ошибка несоответствия типов предупреждает вас, когда используются неверные данные.
Например. Представьте, что у нас есть лист оценок учеников. Если кто-то случайно (или намеренно) заменит метку на текст, данные будут недействительными.
Если мы используем вариант для хранения меток, то ошибки не возникнет
Это не хорошо, потому что в ваших данных есть ошибка, а вы не знаете об этом.
Если вы зададите переменную Long, VBA сообщит вам об ошибке «Несоответствие типов», если значения являются текстовыми.
Доступ к Intellisense
Intellisense — удивительная особенность VBA. Он дает вам доступные параметры в зависимости от типа, который вы создали.
Представьте, что вы объявляете переменную листа, используя Dim
Когда вы используете переменную wk с десятичной точкой, VBA автоматически отобразит доступные опции для переменной.
Вы можете увидеть Intellisense на скриншоте ниже
Если вы используете Variant как тип, то Intellisense будет недоступен
Это потому, что VBA не будет знать тип переменной до времени выполнения.
Использование Dim с Objects
Если вы не знаете, что такое Objects, вы можете прочитать мою статью об VBA Objects здесь.
Есть 3 типа объектов:
Примечание. Объект VBA Collection используется аналогично тому, как мы используем объект Class Module. Мы используем новое, чтобы создать его.
Давайте посмотрим на каждый из них по очереди.
Объекты Excel
Объекты Excel, такие как Рабочая книга, Рабочий лист, Диапазон и т. Д., Не используют Новый, поскольку они автоматически создаются Excel. Смотрите, «когда New не требуется».
При создании или открытии книги Excel автоматически создает связанный объект.
Например, в приведенном ниже коде мы открываем рабочую книгу. VBA создаст объект, а функция Open вернет книгу, которую мы можем сохранить в переменной
Если мы создадим новый лист, произойдет похожая вещь. VBA автоматически создаст его и предоставит доступ к объекту.
Нам не нужно использовать ключевое слово New для этих объектов Excel.
Мы просто присваиваем переменную функции, которая либо создает новый объект, либо дает нам доступ к существующему.
Вот несколько примеров назначения переменных Workbook, Worksheet и range
Если вы хотите узнать больше об этих объектах, вы можете ознакомиться со следующими статьями: Workbook VBA, Worksheet VBA и Cell и Range VBA.
Использование Dim с Class Module Objects
В VBA мы используем Class Modules для создания наших собственных пользовательских объектов. Вы можете прочитать все о Class Modules здесь.
Если мы создаем объект, нам нужно использовать ключевое слово New.
Мы можем сделать это в операторе Dim или в операторе Set.
Следующий код создает объект, используя ключевое слово New в выражении Dim:
Использование New в выражении Dim означает, что каждый раз при запуске нашего кода будет создаваться ровно один объект.
Использование Set дает нам больше гибкости. Мы можем создать много объектов из одной переменной. Мы также можем создать объект на основе условия.
Этот следующий код показывает, как мы создаем объект Class Module, используя Set. (Чтобы создать модуль класса, перейдите в окно проекта, щелкните правой кнопкой мыши соответствующую книгу и выберите «Вставить модуль класса». Подробнее см. «Создание Simple Class Module».)
Давайте посмотрим на пример использования Set. В приведенном ниже коде мы хотим прочитать диапазон данных. Мы создаем объект только в том случае, если значение больше 50.
Мы используем Set для создания объекта Class1. Это потому, что количество нужных нам объектов зависит от количества значений более 50.
Я сохранил этот пример простым для ясности. В реальной версии этого кода мы бы заполнили объект Class Module данными и добавили его в структуру данных, такую как Collection или Dictionary.
Вот пример реальной версии, основанной на данных ниже:
Чтобы узнать больше о Set вы можете заглянуть сюда.
Объекты из внешней библиотеки
Действительно полезная часть VBA — это то, как у нас есть доступ к внешним библиотекам. Это открывает целый новый мир тому, что мы можем сделать.
Примерами являются библиотеки Access, Outlook и Word, которые позволяют нам взаимодействовать с этими приложениями.
Мы можем использовать библиотеки для различных типов структур данных, таких как Словарь, Массив, Стек и Очередь.
Существуют библиотеки для очистки веб-сайта (библиотека объектов Microsoft HTML), использования регулярных выражений (регулярные выражения Microsoft VBScript) и многих других задач.
Мы можем создать эти объекты двумя способами:
Давайте посмотрим на это по очереди.
Раннее связывание
Раннее связывание означает, что мы добавляем справочный файл. Как только этот файл добавлен, мы можем рассматривать объект как объект модуля класса.
Мы добавляем ссылку, используя Tools-> Reference, а затем проверяем соответствующий файл в списке.
Например, чтобы использовать словарь, мы ставим флажок «Microsoft Scripting Runtime»
Как только мы добавим ссылку, мы можем использовать словарь как объект модуля класса
Преимущество раннего связывания заключается в том, что у нас есть доступ к Intellisense. Недостатком является то, что это может вызвать конфликтные проблемы на других компьютерах.
Лучше всего использовать раннюю привязку при написании кода, а затем использовать позднюю привязку при распространении кода другим пользователям.
Позднее связывание
Позднее связывание означает, что мы создаем объект во время выполнения.
Мы объявляем переменную как тип «Объект». Затем мы используем CreateObject для создания объекта.
Использование Dim с Arrays
В VBA есть два типа массивов:
Динамический массив дает нам гораздо больше гибкости. Мы можем установить размер во время выполнения кода.
Мы объявляем динамический массив, используя инструкцию Dim, и устанавливаем размер позже, используя ReDim.
Использование ReDim
Большая разница между Dim и ReDim заключается в том, что мы можем использовать переменную в выражении ReDim. В операторе Dim размер должен быть постоянным значением.
На самом деле мы можем использовать оператор Redim без предварительного использования оператора Dim.
В первом примере вы можете видеть, что мы используем Dim:
Во втором примере мы не используем Dim:
Преимущество состоит в том, что вам не нужно тусклое утверждение. Недостатком является то, что это может сбить с толку тех, кто читает ваш код. В любом случае это не имеет большого значения.
Вы можете использовать ключевое слово Preserve с ReDim для сохранения существующих данных при изменении размера массива. Вы можете прочитать больше об этом здесь.
Вы можете найти все, что вам нужно знать о массивах в VBA здесь.
Устранение неполадок ошибок Dim
В таблице ниже приведены ошибки, с которыми вы можете столкнуться при использовании Dim. См. Ошибки VBA для объяснения различных типов ошибок.
| Ошибка | Тип | Причина |
| Массив уже рассчитан | Компиляция | Использование Redim для статического массива. |
| Ожидаемый: идентификатор | Синтаксис | Использование зарезервированного слова в качестве имени переменной. |
| Ожидаемый: новый тип имени | Синтаксис | Тип отсутствует в выражении Dim. |
| Переменная объекта или переменная блока не установлена | Время выполнения | New не был использован для создания объекта. |
| Переменная объекта или переменная блока не установлена | Время выполнения | Set не использовался для назначения переменной объекта. |
| Пользовательский тип не определен | Компиляция | Тип не распознан. Это может произойти, если ссылочный файл не добавлен в меню «Инструменты-> Ссылка» или имя модуля класса написано неправильно. |
| Недопустимый оператор вне блока Type | Компиляция | Имя переменной отсутствует в выражении Dim |
| Переменная не определена | Компиляция | Переменная используется перед Dim-строкой. |
Локальные и глобальные переменные
Когда мы используем Dim в процедуре (то есть подпрограмме или функции), она считается локальной. Это означает, что это доступно только с этой процедурой.
Глобальные переменные объявляются вне процедур. В зависимости от типа, они могут быть доступны для всех процедур в одном и том же модуле или для всех процедур во всех модулях в текущей рабочей книге.
В приведенном ниже коде мы объявили count как глобальную переменную:
Что произойдет, если у нас будет глобальная переменная и локальная переменная с одинаковым именем?
На самом деле это не вызывает ошибку. VBA дает приоритет локальной декларации.
Подобная ситуация может привести только к проблемам, так как трудно отследить, какой счет используется.
Вообще глобальных переменных следует избегать, где это возможно. Они делают код очень трудным для чтения, потому что их значения могут быть изменены в любом месте кода. Это затрудняет обнаружение и устранение ошибок.
Важно знать и понимать глобальные переменные как вы, поскольку вы можете встретить их в существующем коде.
Dim против Private
В VBA есть ключевое слово Private.
Если мы используем ключевое слово Private с переменной или подфункцией / функцией, то этот элемент доступен только в текущем модуле.
Использование Dim и Private для переменной дает тот же результат
В VBA принято использовать Private для глобальных переменных и Dim для локальных
Local OnlyThere в VBA есть 2 других типа объявлений, которые называются Public и Global.
Ниже приводится краткое изложение всех 4 типов:
Заключение
На этом мы заканчиваем статью о VBA Dim Statement. Если у вас есть какие-либо вопросы или мысли, пожалуйста, дайте мне знать в комментариях ниже.










