Что такое dim в vba

Что такое dim в vba

Я наткнулся на выражение DIM:

Первая часть, определяющая массив байтов, достаточно прямая, но что делает остальная часть? И почему "&" после имени переменной?

vba excel-vba excel

2 ответа

6 Решение Vityata [2017-12-15 15:18:00]

В VBA, если вы объявляете Dim a, b, c as Long только последняя переменная объявлена как Long , остальные две — a и b объявляются как Variant . Таким образом, некоторые люди используют определенные ярлыки, когда они хотят объявить несколько переменных в одной строке. Эти ярлыки или сокращения также называются суффиксами типа декларации.

Один из этих ярлыков — & , который объявляет переменную как Long . Если вы не пишете & в конце, он будет объявлен как Variant .

Таким образом, ваша строка Dim a() As Byte, u&, j&, s&, n&, q такая же, как:

Dim a() As Byte, u As Long, j As Long, s As Long, n As Long, q As Variant

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

Вы также можете объявить тип литерала, когда вы назначаете его типу Variant. Например, в этом случае 10 будет иметь тип Double , из-за # :

0 JohnyL [2017-12-15 15:32:00]

Там также один тип @Vityata не упоминал — Decimal , но вы не можете объявить этот тип напрямую (на самом деле для этого типа нет четного ключевого слова). Чтобы иметь Decimal тип, вам необходимо сделать следующее:

Переменные VBA, объявление переменных, Option Explicit, правила именования, типы данных VBA, исходные значения переменных

Переменные — контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе — вы сдаете в "гардероб" какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы "предъявляете номерок" и получаете их. Пример работы с переменными в VBA может выглядеть так:

Dim nMyAge As Integer

nMyAge = nMyAge + 10

Перед работой с переменной настоятельно рекомендуется ее объявить. Объявление переменной в нашем примере выглядит так:

Dim nMyAge As Integer

Как расшифровать эту строку:

Dim — это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:

  • Dim — используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре — только на время работы этой процедуры;
  • Private — при объявлении переменных в VBA значит то же, что и Dim;
  • Public — такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
  • Static — такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений. Например:

Static nVar1 As Integer

nVar1 = nVar1 + 1

Если нет никаких особых требований, то есть смысл всегда выбирать область видимости Dim.

Второе слово в нашем объявление (nMyAge) — это идентификатор (проще говоря, имя) переменной. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции и процедуры и т.п.). Имя:

  • должно начинаться с буквы;
  • не должно содержать пробелов и символов пунктуации (исключение — символ подчеркивания);
  • максимальная длина — 255 символов;
  • должно быть уникальным в текущей области видимости (подробнее — далее);
  • зарезервированные слова (те, которые подсвечиваются другим цветом в окне редактора кода) использовать нельзя.

При создании программ VBA настоятельно рекомендуется определиться с правилами, по которым будут присваиваться имена объектам — соглашение об именовании. Чаще всего используется так называемое венгерское соглашение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):

  • имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
  • str (или s) — String, символьное значение;
  • fn (или f) — функция;
  • c (или сделать все буквы заглавными) — константа;
  • b — Boolean, логическое значение (true или false);
  • d — дата;
  • obj (или o) — ссылка на объект;
  • n — числовое значение.
  • имена функций, методов и каждое слово в составном слове должно начинаться с заглавной буквы:
    • в ранних версиях VB не было слова Const — все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили подчеркивания:

    Многие программисты используют такой подход для обозначения констант и сейчас (но использование ключевого слова Const теперь обязательно — об этом будет рассказано в следующем разделе).

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

    В VBA предусмотрены следующие типы данных:

    • числовые (byte — целое число от 0 до 255, integer — целое число от -32768 до 32767, long — большое целое число, currency (большое десятичное число с 19 позициями, включая 4 позиции после запятой), decimal (еще большее десятичное число с 29 позициями), single и double — значение с плавающей запятой (double в два раза больше));
    Читайте также:  Фильмы про вычислительные машины

    Внимание! Попытка объявить переменную с типом Decimal (например, Dim n As Decimal) приведет к синтаксической ошибке. Чтобы получить возможность работать с типом Decimal, переменную нужно изначально объявить как Variant или вообще объявить без типа (Dim n), поскольку тип данных Variant используется в VBA по умолчанию.

    • строковые (string переменной длины (до примерно 2 млрд символов) и фиксированной длины (до примерно 65400 символов);
    • дата и время (date — от 01.01.100 до 31.12.9999);
    • логический (boolean — может хранить только значения True и False);
    • объектный (object — хранит ссылку на любой объект в памяти);
    • Variant — специальный тип данных, который может хранить любые другие типы данных.

    Можно еще использовать пользовательские типы данных, но их вначале нужно определить при помощи выражения Type. Обычно пользовательские типы данных используются как дополнительное средство проверки вводимых пользователем значений (классический пример — почтовый индекс).

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

    • общий принцип — выбирайте наименьший тип данных, который может вместить выбранные вами значения. Если есть какие-то сомнения — выбирайте больший тип данных во избежание возникновения ошибок;
    • если есть возможность, лучше не использовать типы данных с плавающей запятой (single и double). Работа с такими типами данных производится медленнее, кроме того, могут быть проблемы при сравнениях за счет округлений;
    • если есть возможность, лучше не пользоваться типом Variant. Этот тип все равно приводится VBA к одному из других типов, но памяти для него требуется больше. Кроме того, в ходе такого неявного образования могут возникнуть ошибки;
    • при определении переменных можно использовать так называемые символы определения типа (% — integer, $ — String и т.п.). Например, в нашем примере нужно закомментировать строку Dim nVar 1 As Integer, а во второй строке написать:

    Такой подход является устаревшим и к использованию не рекомендуется.

    При объявлении переменных можно и не указывать ее тип. Например, наше объявление может выглядеть так:

    В этом случае переменная будет автоматически объявлена с типом Variant.

    В принципе, в VBA можно работать и без объявления переменных. Например, такой код

    nVar1 = nVar1 + 1

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

    • сокращается количество ошибок: программа с самого начала откажется принимать в переменную значение неправильно типа (например, строковое вместо числового);
    • при работе с объектами подсказка по свойствам и методам действует только тогда, когда мы изначально объявили объектную переменную с нужным типом. Например, в Excel два варианта кода будут работать одинаково:

    Dim oWbk As Workbook

    Set oWbk = Workbooks.Add()

    Set oWbk = Workbooks.Add()

    Но подсказка по свойствам и методам объекта oWbk будет работать только во втором случае.

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

    а можно вставлять эту команду во все модули при их создании автоматически — установив в окне редактора кода флажок Require Variable Declarations (меню Tools -> Options, вкладка Editor).

    Проиллюстрировать, зачем они это делают, можно на простом примере:

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

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

    Можно объявить несколько переменных в одной строке, например, так:

    Dim n1 As Integer, s1 As String

    Присвоение значений переменным выглядит так:

    Если нужно увеличить уже существующее значение переменной, то команда может выглядеть так:

    nVar1 = nVar1 + 1

    В обоих примерах знак равенства означает не "равно", а присвоить.

    При присвоении значений переменным нужно помнить о следующем:

    • строковые значения всегда заключаются в двойные кавычки:
    • значение даты/времени заключаются в "решетки" — символы фунта:

    Обратите внимание, что при присвоении значения даты/времени таким "явным способом" нам придется использовать принятые в США стандарты: 05 в данном случае — это месяц, 06 — день. Отображение же этого значения (например, в окне сообщения) будет зависеть от региональных настроек на компьютере пользователя.

    Если нужно передать шестнадцатеричное значение, то перед ним ставятся символы &H:

    Что содержится в переменных до присвоения им значений?

    • В переменных всех числовых типов данных — 0.
    • В строковых переменных переменной длины — "" (строка нулевой длины).
    • В строковых переменных фиксированной длины — строка данной длины с символами ASCII 0 (эти символы на экран не выводятся).
    • В Variant — пустое значение.
    • В Object — ничто (нет ссылки ни на один из объектов).

    Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

    Читайте также:  Термопаста для северного моста

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

    Необязательный. В разделе список атрибутов.

    Необязательный. Ниже указаны доступные значения.

    Необязательный. В разделе общих.

    Необязательный. В разделе тени.

    Необязательный. В разделе статических.

    Необязательный. В разделе ReadOnly.

    Необязательный. Указывает, что эти объектные переменные, которые ссылаются на экземпляры класса, который может порождать события. В разделе WithEvents.

    Обязательный. Список переменных, объявляемых в этом операторе.

    Каждый элемент variable имеет перечисленные ниже синтаксис и компоненты.

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With < [ .propertyname = propinitializer [ , . ] ] >] ] [ = initializer ]

    Отделение Описание
    variablename Обязательный. Имя переменной. См. раздел Declared Element Names.
    boundslist Необязательный. Список границ каждого измерения массива.
    New Необязательный. Создает новый экземпляр класса при Dim выполняется инструкция.
    datatype Необязательный. Тип данных переменной.
    With Необязательный. Введение в список инициализаторов объекта.
    propertyname Необязательный. Имя свойства в классе при создании экземпляра.
    propinitializer После propertyname =. Выражение, которое является вычисляется и присваивается имя свойства.
    initializer Необязателен при New не указан. Выражение, которое вычисляется и присваивается переменной при ее создании.

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

    Можно указать любой тип данных или имя перечисления, структуры, класса или интерфейса.

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

    Можно объявить переменную в процедуре, блок, класса, структуры или модуля. Невозможно объявить переменную в исходный файл, пространство имен или интерфейс. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.

    Переменная, объявленная на уровне модуля, вне любой процедуры переменной-члена или поля. Переменные-члены находятся в области всего их класса, структуры или модуля. Переменная, объявленная на уровне процедуры является локальной переменной. Локальные переменные находятся в области действия только в процедурах или блоках.

    Следующие модификаторы доступа используются для объявления переменных вне процедуры: Public , Protected , Friend , Protected Friend , и Private . Дополнительные сведения см. в разделе уровни доступа в Visual Basic.

    Dim Ключевое слово является необязательным и обычно указывается, если необходимо указать любой из следующих модификаторов: Public , Protected , Friend , Protected Friend , Private , Shared , Shadows , Static , ReadOnly , или WithEvents .

    Если Option Explicit является on (по умолчанию), компилятор требует объявления для каждой переменной можно использовать. Дополнительные сведения см. в разделе оператор Option Explicit.

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

    Если указан инициализатор и тип данных не указан в As предложение, Вывод типа используется для вывода типа данных на основе инициализатора. В следующем примере оба num1 и num2 являются строго типизированными как целые числа. Во втором объявлении вывод типа определяет тип значение 3.

    Определение типов применяется на уровне процедуры. Он не применяется вне процедур в класс, структура, модуль или интерфейс. Дополнительные сведения о выводе типа см. в разделе Option Infer оператор и Вывод локального типа.

    Сведения о что происходит, если не указан тип данных или инициализатор содержатся по умолчанию типы данных и значения Далее в этом разделе.

    Можно использовать инициализатора объекта для объявления экземпляров именованных и анонимных типов. Следующий код создает экземпляр Student класса и использует инициализатор объектов для инициализации свойств.

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

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

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

    Можно объявить переменную для хранения массив, который может содержать несколько значений. Чтобы указать, что переменная содержит массив, выполните его variablename немедленно со скобками. Дополнительные сведения о массивах см. в разделе массивы.

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

    Следующие две инструкции эквивалентны. Каждый оператор объявляет массив из 21 Integer элементы. При доступе к массива, индекс может изменяться от 0 до 20.

    Следующий оператор объявляет двумерный массив типа Double . Массив имеет 4 строки (3 + 1) по 6 столбцов (5 + 1) каждая. Обратите внимание, что верхняя граница представляет наибольшее возможное значение для индекса, не длину измерения. Длина измерения равна значению верхней границы плюс один.

    Массив может содержать от 1 до 32 размерностей.

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

    Читайте также:  Стандартный контроллер sata ahci что это

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

    Можно объявить массив нулевой длины объявив одно из измерений массива равным -1. Переменная, содержащая массив нулевой длины не имеет значения Nothing . Массивы нулевой длины необходимы определенные функции среды CLR. При попытке получить доступ к такой массив, возникает исключение времени выполнения. Дополнительные сведения см. в разделе массивы.

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

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

    Дополнительные сведения о литералах массива см массивы.

    В следующей таблице перечислены результаты различных сочетаний заданных типов данных и инициализаторов в операторе Dim .

    Указан тип данных? Указан инициализатор? Пример Результат
    Нет Нет Dim qty Если Option Strict — off (по умолчанию), значение переменной Nothing .

    Если параметр Option Strict включен, при компиляции возникает ошибка.

    Нет Да Dim qty = 5 Если Option Infer включен (по умолчанию), переменная получает тип данных инициализатора. В разделе Вывод локального типа.

    Если параметры Option Infer и Option Strict отключены, переменная получает тип данных Object .

    Если параметр Option Infer отключен, а параметр Option Strict включен, при компиляции возникает ошибка.

    Да Нет Dim qty As Integer Переменная инициализируется со значением по умолчанию для типа данных. См. в таблице ниже в данном разделе. Да Да Dim qty As Integer = 5 Если тип данных инициализатора нельзя преобразовать в указанный тип данных, возникает ошибка времени компиляции.

    Если указать тип данных, но не указан инициализатор, Visual Basic инициализирует переменную со значением по умолчанию для его типа данных. В следующей таблице представлены значения инициализации.

    Тип данных Значение по умолчанию
    Все числовые типы (включая Byte и SByte )
    Char Двоичный 0
    Все ссылочные типы (включая Object , String , и все массивы) Nothing
    Boolean False
    Date 00:00:00 1 января 1 года (01/01/0001 12:00:00 AM)

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

    A Static Локальная переменная имеет дольше процедуры, в котором она объявлена. Пределы существования переменной зависят от того, где объявлен процедуры и является ли оно Shared .

    Объявление процедуры Переменная, инициализированная Переменная прекращает существующие
    В модуле Первый раз при вызове процедуры Когда программа завершает выполнение
    В классе или структуре — процедуры Shared Первый раз при вызове процедуры на определенном экземпляре или на классе или структуре самой Когда программа завершает выполнение
    В классе или структуре не процедуры Shared При первом вызове процедуры на определенном экземпляре Когда экземпляр освобождается для сборки мусора (GC)

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

    На уровне модуля нельзя использовать Static модификатор объявления переменных-членов. На уровне процедур нельзя использовать Shared , Shadows , ReadOnly , WithEvents , или любой доступ модификаторы объявления локальных переменных.

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

    Можно указать WithEvents только для переменных-членов, но не для локальных переменных внутри процедуры. При указании WithEvents , тип данных переменной должен быть определенный тип класса, не Object . Нельзя объявить массив с WithEvents . Дополнительные сведения о событиях см. в разделе события.

    Примечание

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

    Сборщик мусора .NET Framework без дополнительного кодирования с вашей стороны освобождает управляемые ресурсы. Однако можно принудительно реализации управляемых ресурсов, а не ждать, пока сборщик мусора.

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

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

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

    В следующем примере перечисляются простых чисел от 1 до 30. Область локальных переменных, описан в комментариях к коду.

    В следующем примере speedValue переменная, объявленная на уровне класса. Private Ключевое слово используется для объявления переменной. Переменная может осуществляться из любой процедуры в Car класса.

    Ссылка на основную публикацию
    Что случилось с facebook
    На форумах и в поисковых запросах часто встречается вопрос, почему не работает Фейсбук сегодня, и что делать в такой ситуации....
    Читы для вар тандер на орлы
    Данный чит носит название Орлы чит для War Thunder 3.0. Это обновление для игры вышло совсем недавно, но для него...
    Что больше мегабит или килобит
    В эпоху оптоволокна и накопителей объемом в десятки терабайт считать в битах не принято. Мы бы совсем забыли, чем отличается...
    Что смотрят в интернете больше всего
    Наверное, многим интересно, что чаще всего запрашивают люди в поисковиках, какие поисковые запросы самые популярные и востребованные. Ошибки и опечатки...
    Adblock detector