Хитрости »
1 Май 2011 225661 просмотров
Что такое переменная и как правильно её объявить?
Переменная — это некий контейнер, в котором 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.9999) |
String | 10(+длина строки) | От 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 и т.д. Т.е. это книги, листы, ячейки, диаграммы. Типов много, почти на каждый объект и коллекцию. Рассматривать здесь все бессмысленно. Могу лишь привести пару строк кода:
Dim rRange as Range 'назначили переменной тип ячейка/диапазон Set rRange = Range("A1") 'присвоили ссылку на ячейку A1 текущего листа
Про объявление переменных подробно написано чуть ниже.
А более подробно про обращение к диапазонам из VBA можно почитать в этой статье: Как обратиться к диапазону из VBA
На самом деле все очень просто. Это делается при помощи операторов области действия: Dim, Public,Static и оператора присвоения типа As. Самый распространенный оператор — Dim. Его и возьмем в качестве примера. Синтаксис объявления:
[оператор области действия] Имя_переменной As [тип данных]
Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:
Dim MyVar1, MyVar2, MyVar3 As Integer
Вроде бы исходя из логики всем переменным присвоен тип данных Integer. Но это ошибочное суждение. Тип Integer присвоен только последней переменной, к которой он «привязан» оператором As — MyVar3. Все остальные переменные имеют тип данных Variant. Т.е. если Вы не задаете каждой переменной свой тип хранимых данных явно(т.е. не указываете для неё тип данных через As), то VBA сам присваивает для такой переменной тип данных Variant, т.к. он может хранить любой тип данных. А вот так выглядит правильное присвоение типа данных:
Dim MyVar1 As Integer, MyVar2 As Integer, MyVar3 As Integer
Это и есть объявление переменных. Т.е. сначала идет оператор области действия (Dim, Public,Static), сразу за ним имя переменной, затем оператор As и тип.
Но это не все. Некоторые типы переменным можно присваивать еще короче — даже без оператора As:
Dim MyVar1%, MyVar2%, MyVar3%
Всего шесть типов, которые можно объявить подобным методом:
! — Single
# — Double
$ — String
% — Integer
& — Long
@ — Currency
На что стоит обратить внимание, при объявлении переменных подобным образом: между именем переменной и знаком типа не должно быть пробелов.
Я лично в большинстве статей предпочитаю использовать первый метод, т.е. полное указание типа. Это читабельнее и понятнее. В каких-то проектах могу использовать краткое указание, в общих(разработка в команде) — полное. В своих кодах Вы вправе использовать удобный Вам метод — ошибки не будет.
Теперь разберемся с операторами области действия(Dim, Public и Static):
- Dim — данный оператор используется для объявления переменной, значение которой будет храниться только в той процедуре, внутри которой данная переменная объявлена. Во время запуска процедуры такая переменная инициализируется в памяти и использовать её значение можно внутри только этой процедуры, а по завершению процедуры переменная выгружается из памяти(обнуляется) и данные по ней теряются. Переменную, объявленную подобным образом еще называют локальной переменной. Однако с помощью данного оператора можно объявить переменную, которая будет доступна в любой процедуре модуля. Необходимо объявить переменную вне процедуры — в области объявлений(читать как первой строкой в модуле, после строк объявлений типа — Option Explicit). Тогда значение переменной будет доступно в любой процедуре лишь того модуля, в котором данная переменная была объявлена. Такие переменные называются переменными уровня модуля. Также для использования переменных во всех процедурах и функциях одного конкретного модуля можно использовать оператор Private. Но он в данном случае ничем не отличается от Dim, а пишется длиннее Плюс, Private нельзя использовать внутри процедуры или функции(только в области объявлений), что еще больше сужает её применимость. По сути чаще этот оператор применяется к функциям и процедурам(об этом см.ниже)
- Static — данный оператор используется для объявления переменной, значение которой предполагается использовать внутри конкретной процедуры, но не теряя значения данной переменной по завершении процедуры. Переменные данного типа обычно используют в качестве накопительных счетчиков. Такая переменная инициализируется в памяти при первом запуске процедуры, в которой она объявлена. По завершении процедуры данные по переменной не выгружаются из памяти, но однако они не доступны в других процедурах. Как только Вы запустите процедуру с этой переменной еще раз — данные по такой переменной будут доступны в том виде, в котором были до завершения процедуры. Выгружается из памяти такая переменная только после закрытия проекта(книги с кодом).
- Public — данный оператор используется для объявления переменной, значение которой будет доступно в любой процедуре проекта(в обычных модулях, модулях класса, модулях форм, модулях листов и книг). Переменная, объявленная подобным образом, должна быть объявлена вне процедуры — в области объявлений. Такая переменная загружается в память во время загрузки проекта(при открытии книги) и хранит значение до выгрузки проекта(закрытия книги). Использовать её можно в любом модуле и любой процедуре проекта. Важно: объявлять подобным образом переменную необходимо строго в стандартном модуле. Такие переменные называются переменными уровня проекта. В простонародье такие переменные еще называют глобальными(возможно из-за того, что раньше подобные переменные объявлялись при помощи оператора Global, который в настоящее время устарел и не используется).
Для большего понимания того, где и как объявлять переменные уровня проекта два небольших примера.
Неправильное объявление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.excel-vba.ru" 'пробуем изменить значение переменной Call ChangeMyVariable 'показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www.excel-vba.ru" End Sub 'доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub
Если при этом вместо Public записать Dim, то эта переменная будет доступна из всех функций и процедур того модуля, в котором записана, но недоступна для функций и процедур других модулей.
Переменные уровня проекта невозможно объявить внутри модулей классов(ClassModule, ЭтаКнига(ThisWorkbook), модулей листов, модулей форм(UserForm) — подробнее про типы модулей: Что такое модуль? Какие бывают модули?) - Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия — Private. Объявленная подобным образом процедура доступна только из того модуля, в котором записана и такая процедура не видна в диалоговом окне вызова макросов(Alt+F8)
'процедура записана в Module1 'эта процедура будет доступна для вызова исключительно из процедур в этом же модуле 'но не будет доступна при вызове из других модулей Private Sub PrivateMain() MsgBox "Процедура может быть вызвана только из модуля, в котором записана", vbInformation, "www.excel-vba.ru" End Sub 'другая процедура, записанная в этом же модуле Sub CallPrivate() Call PrivateMain End Sub
'эта процедура записана в другом модуле - Module2 'при попытке вызова этой процедурой получим ошибку ' Sub or Function not defined ' потому что процедура PrivateMain объявлена только для Module1 Sub CallPrivate_FromModule1() Call PrivateMain End Sub
При этом, если из Excel нажать сочетание клавиш Alt+F8, то в окне будут доступны только CallPrivate_FromModule1 и CallPrivate. Процедура PrivateMain будет недоступна.
«Что самое сложное в работе программиста? — выдумывать имена переменным.» :-)А ведь придумать имя переменной тоже не так-то просто. Можно, конечно, давать им имена типа: 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 Sub test() Dim bCheck End Sub
Автоматически переменной bCheck будет присвоен тип Boolean, т.к. она начинается с буквы b — регистр здесь не имеет значения(впрочем как в 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 — Задает тип Boolean
DefByte — Задает тип Byte
DefCur — Задает тип Currency
DefDate — Задает тип Date
DefDbl — Задает тип Double
DefInt — Задает тип Integer
DefLng — Задает тип Long
DefObj — Задает тип Object
DefSng — Задает тип Single
DefStr — Задает тип String
DefVar — Задает тип Variant
По умолчанию в VBA применена инструкция DefVar для всех букв(иначе говоря для всех переменных, которым не назначен тип данных явно через оператор As).
Ну и немаловажный момент это непосредственно осмысленное имя переменной. Имя переменной должно примерно отражать то, что в ней будет храниться. Например, Вы создаете отчет и Вам надо объявить две переменные: одна имя листа, другая имя книги. Можно было сделать так: 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.excel-vba.ru" MsgBox "Номер первой строки: " & lRow, vbInformation, "www.excel-vba.ru" 'назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" 'выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.excel-vba.ru" 'выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.excel-vba.ru" 'задаем значение переменной sShName = "excel-vba" 'переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub
Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Назначение значений переменным задается при помощи знака равно(=). Однако, есть небольшой нюанс: для переменных типа Object(а так же других объектных типов(Workbook, Worksheet, Range, Cells, Chart и т.п.)) присвоение идет при помощи ключевого оператора Set:
'присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection
это так же называется присвоением ссылки на объект. Почему именно ссылки? Все просто: при помещении в переменную непосредственно ячейки или диапазона(Set var = Range(«A1») или Set rRange = Selection) нет никакого запоминания самой ячейки. В переменную помещается лишь ссылка на эту ячейку(можете считать, что это как ссылка в формулах) со всеми вытекающими: такое назначение не запоминает свойства ячейки до или после — в переменной хранится ссылка на конкретную ячейку и доступ есть исключительно к свойствам ячейки на текущий момент. Чтобы запомнить для этой ячейки значение, цвет или даже адрес (а так же и другие свойства) до её изменения и применить запомненное даже после изменения/перемещения самой ячейки — необходимо запоминать в переменные именно свойства ячейки:
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.excel-vba.ru" 'назначаем свойства из сохраненных в переменных 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.excel-vba.ru" End Sub
Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.
Для других же типов Set не нужен и в переменную значение заносится без этих нюансов.
Так же есть и иной вид «переменных» — константы. Это такая же переменная, только(как следует из её названия) — она не может быть изменена во время выполнения кода, т.к. является величиной постоянной и значение её назначается только один раз — перед выполнением кода.
Const sMyConst As String = "Имя моей программы"
Константам могут быть назначены данные тех же типов, что и для переменных, за исключением типа Object, т.к. Object это всегда ссылка на объект, который как правило обладает «динамическими»(т.е. обновляющимися) свойствами. А изменение для констант недопустимо.
Для дополнительной области видимости/жизни констант используется только Public. Если область видимости не указана, то константа будет доступна только из того модуля, в котором объявлена. Здесь обращаю внимание на то, что Dim уже не используется, т.к. Dim это идентификатор только для переменных. Пару важных отличий объявления констант от объявления переменных:
- при объявлении константы необходимо обязательно указывать явно, что это константа ключевым словом Const
- сразу в момент объявления необходимо назначить константе значение: = «Имя моей программы»
Во всем остальном объявление и применение констант идентично объявлению переменных. Коротко приведу пару примеров.
Если константа объявлена внутри процедуры:
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
Подробнее можно прочитать выше — как я уже писал для констант применяются те же правила, что и для переменных.
Также см.:
Variable not defined или что такое Option Explicit и зачем оно нужно?
Что такое модуль? Какие бывают модули?
Что такое макрос и где его искать?
Отлов ошибок и отладка кода VBA
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
На чтение 25 мин. Просмотров 12.4k.
Алан Перлис
Постоянная одного человека — переменная другого
Эта статья содержит полное руководство по работе с переменными и использованию VBA Dim.
Первый раздел содержит краткое руководство по использованию оператора
Dim, включая примеры и формат оператора Dim.
Остальная часть поста содержит наиболее полное руководство, которое вы
найдете в VBA Dim Statement.
Если вы заинтересованы в объявлении параметров, вы можете прочитать о
них здесь.
Содержание
- Краткое руководство по использованию VBA Dim Statement
- Полезные ссылки
- Что такое VBA Dim Statement?
- Формат VBA Dim Statement
- Как использовать Dim с несколькими переменными
- Где я должен поместить Dim Statement?
- Использование Dim в циклах
- Могу ли я использовать Dim для присвоения значения?
- Dim действительно требуется?
- Использование Dim с Basic Variables
- Использование Dim с Variants
- Использование Dim с Objects
- Использование Dim с Arrays
- Устранение неполадок ошибок Dim
- Локальные и глобальные переменные
- Заключение
Краткое руководство по использованию 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») |
* Примечание. Для раннего связывания необходимо добавить
справочный файл с помощью меню «Инструменты» -> «Ссылки». Смотрите здесь,
как добавить ссылку на Dictonary.
Полезные ссылки
- Объявление параметров в подпрограмме или функции
- Использование объектов в VBA
- Массивы VBA
- Коллекции VBA
- Словарь VBA
- VBA Workbook
- VBA Worksheet
Что такое VBA Dim Statement?
Ключевое слово Dim — это сокращение от Dimension. Он
используется для объявления переменных в VBA.
Объявление означает, что мы говорим VBA о переменной,
которую будем использовать позже.
Существует четыре типа Dim Statement. Все они очень похожи по синтаксису.
Вот они:
- Basic variable
- Variant
- Object
- Array
Ниже приводится краткое описание каждого типа
- Basic variable — этот тип переменной содержит одно значение. Это такие типы, как Long, String, Date, Double, Currency.
- Variant — VBA решает во время выполнения, какой тип будет использоваться. Вы должны избегать вариантов, где это возможно, но в некоторых случаях требуется их использование.
- Object — это переменная, которая может иметь несколько методов (то есть подпрограмм / функций) и несколько свойств (то есть значений). Есть 3 вида:
Объекты Excel, такие как объекты Workbook, Worksheet и Range.
Пользовательские объекты, созданные с использованием модулей классов.
Внешние библиотеки, такие как Словарь. - Array — это группа переменных или объектов.
В следующем разделе мы рассмотрим формат оператора VBA Dim с
некоторыми примерами каждого из них.
В последующих разделах мы рассмотрим каждый тип более
подробно.
Формат VBA Dim Statement
Формат выражения Dim показан ниже.
' 1. BASIC VARIABLE ' Объявление основной переменной Dim [Имя переменной] As [тип] ' Объявление фиксированной строки Dim [Имя переменной] As String * [размер] ' 2. VARIANT Dim [Имя переменной] As Variant Dim [Имя переменной] ' 3. OBJECT ' Объявление объекта Dim [Имя переменной] As [тип] ' Объявление и создание объекта Dim [Имя переменной] As New [тип] ' Объявление объекта с использованием позднего связывания Dim [Имя переменной] As Object ' 4. ARRAY ' Объявление статического массива Dim [Имя переменной](first To last) As [тип] ' Объявление динамического массива Dim [Имя переменной]() As [тип] Ниже приведены примеры использования различных форматов. Sub Primeri() ' 1. BASIC VARIABLE ' Объявление основной переменной Dim name As String Dim count As Long Dim amount As Currency Dim eventdate As Date ' Объявление фиксированной строки Dim userid As String * 8 ' 2. VARIANT Dim var As Variant Dim var ' 3. OBJECT ' Объявление объекта Dim sh As Worksheet Dim wk As Workbook Dim rg As Range ' Объявление и создание объекта Dim coll1 As New Collection Dim o1 As New Class1 ' Объявление объекта - создайте объект ниже, используя Set Dim coll2 As Collection Dim o2 As Class1 Set coll2 = New Collection Set o2 = New Class1 ' Объявление и присвоение с использованием позднего связывания Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") ' 4. ARRAY ' Объявление статического массива Dim arrScores(1 To 5) As Long Dim arrCountries(0 To 9) As String ' Объявление динамического массива - установите размер ниже, используя ReDim Dim arrMarks() As Long Dim arrNames() As String ReDim arrMarks(1 To 10) As Long ReDim arrNames(1 To 10) As String End Sub
Мы рассмотрим эти различные типы операторов Dim в следующих
разделах.
Как использовать Dim с несколькими переменными
Мы можем объявить несколько переменных в одном выражении Dim.
Dim name As String, age As Long, count As Long
Если мы опускаем тип, то VBA автоматически устанавливает тип как Variant. Мы увидим больше
о Variant позже.
' Сумма является вариантом Dim amount As Variant ' Сумма является вариантом Dim amount ' Адрес это вариант - имя это строка Dim name As String, address ' имя - это вариант, адрес – строка Dim name, address As String
Когда вы объявляете несколько переменных, вы должны указать тип каждой отдельно.
Dim wk As Workbook, marks As Count, name As String
Вы можете поместить столько переменных, сколько захотите, в
одном выражении Dim, но
для удобства чтения рекомендуется оставить его равным 3 или 4.
Где я должен поместить Dim Statement?
Оператор Dim может быть помещен в любое место кода. Тем не менее, он должен предшествовать любой строке, где используется переменная.
Если переменная используется перед оператором Dim, вы получите ошибку
«переменная не определена»
Когда дело доходит до позиционирования ваших Dim утверждений, вы можете сделать это двумя основными способами. Вы можете разместить все свои Dim заявления в верхней части процедуры.
Sub DimVverh() ' Размещение всех Dim statements наверху Dim count As Long, name As String, i As Long Dim wk As Workbook, sh As Worksheet, rg As Range Set wk = Workbooks.Open("C:ДокументыОтчет.xlsx") Set sh = wk.Worksheets(1) Set rg = sh.Range("A1:A10") For i = 1 To rg.Rows.count count = rg.Value Debug.Print count Next i End Sub
ИЛИ вы можете объявить переменные непосредственно перед их
использованием:
Sub DimIsp() Dim wk As Workbook Set wk = Workbooks.Open("C:ДокументыОтчет.xlsx") Dim sh As Worksheet Set sh = wk.Worksheets(1) Dim rg As Range Set rg = sh.Range("A1:A10") Dim i As Long, count As Long, name As String For i = 1 To rg.Rows.count count = rg.Value name = rg.Offset(0, 1).Value Debug.Print name, count Next i End Sub
Я лично предпочитаю последнее, так как оно делает код более
аккуратным, и его легче читать, обновлять и обнаруживать ошибки.
Использование Dim в циклах
Помещение оператора Dim в цикл не влияет на переменную.
Когда VBA запускает Sub (или Function), первым делом он
создает все переменные, которые были объявлены в выражениях Dim.
Следующие 2 фрагмента кода практически одинаковы. Во-первых,
переменная Count объявляется перед циклом. Во втором он объявлен в цикле.
Sub CountPeredCiklom() Dim count As Long Dim i As Long For i = 1 To 3 count = count + 1 Next i ' значение счета будет 3 Debug.Print count End Sub
Sub CountPosleCikla() Dim i As Long For i = 1 To 3 Dim count As Long count = count + 1 Next i ' значение счета будет 3 Debug.Print count End Sub
Код будет вести себя точно так же, потому что VBA создаст переменные при
входе в подпрограмму.
Могу ли я использовать Dim для присвоения значения?
В таких языках, как C ++, C # и Java, мы можем объявлять и назначать переменные в одной строке:
' C++ int i = 6 String name = "Иван"
Мы не можем сделать это в VBA. Мы можем использовать оператор двоеточия для размещения
объявлений и назначения строк в одной строке.
Dim count As Long: count = 6
Мы не объявляем и не присваиваем в одной строке VBA. Что мы
делаем, это помещаем эти две строки (ниже) в одну строку в редакторе. Что
касается VBA, это две отдельные строки, как здесь:
Dim count As Long count = 6
Здесь мы помещаем 3 строки кода в одну строку редактора,
используя двоеточие:
count = 1: count = 2: Set wk = ThisWorkbook
Нет никаких преимуществ или недостатков в назначении и
объявлении в одной строке редактора. Все сводится к личным предпочтениям.
Dim действительно требуется?
Ответ в том, что это не обязательно. VBA не требует от вас
использовать Dim Statement.
Однако не использовать оператор Dim — плохая практика и
может привести к множеству проблем.
Вы можете использовать переменную без предварительного
использования оператора Dim. В этом случае переменная автоматически будет типом
варианта.
Это может привести к таким проблемам, как
- Все переменные являются вариантами (проблемы с
этим см. В разделе «Варианты»). - Некоторые переменные ошибки останутся
незамеченными.
Из-за этих проблем рекомендуется сделать использование Dim
обязательным в нашем коде. Мы делаем это с помощью оператора Option Explicit.
Option Explicit
Мы можем сделать Dim
обязательным в модуле, набрав «Option Explicit» в верхней части модуля.
Мы можем сделать это автоматически в каждом новом модуле,
выбрав Tools-> Options из меню и отметив флажок «Требовать декларацию
переменной». Затем, когда вы вставите новый модуль, «Option Explicit» будет
автоматически добавлен в начало.
Давайте посмотрим на некоторые ошибки, которые могут
остаться незамеченными, если мы не будем использовать Dim.
Ошибки Переменной
В приведенном ниже коде мы используем переменную Total без использования оператора Dim.
Sub BezDim() Total = 6 Total = Total + 1 Debug.Print Total End Sub
Если мы случайно написали Total неправильно, VBA сочтет это
новой переменной.
В приведенном ниже коде мы неправильно написали переменную Total как Totall.
Sub BezDimOshibki() Total = 6 ' Первый Total - это ошибка Totall = Total + 1 ' напечатает 6 вместо 7 Debug.Print Total End Sub
VBA не обнаружит ошибок в коде, и будет напечатано неверное
значение.
Давайте добавим Option Explicit и попробуйте приведенный
выше код снова
Option Explicit Sub BezDimOshibki() Total = 6 ' Первый Total - это ошибка Totall = Total + 1 ' Напечатает 6 вместо 7 Debug.Print Total End Sub
Теперь, когда мы запустим код, мы получим ошибку «Переменная
не определена». Чтобы эта ошибка не появлялась, мы должны использовать Dim для каждой переменной,
которую мы хотим использовать.
Когда мы добавим оператор Dim для Total
и запустим код, мы получим ошибку, сообщающую, что опечатка Totall не была определена.
Это действительно полезно, так как помогает нам найти
ошибку, которая в противном случае осталась бы незамеченной.
Ошибка в ключевом слове
Вот второй пример, который более тонкий.
Когда следующий код выполняется, он должен изменить шрифт в
ячейке A1 на синий.
Однако, когда код запускается, ничего не происходит.
Sub ZadatCvet() Sheet1.Range("A1").Font.Color = rgblue End Sub
Ошибка здесь в том, что rgblue должен быть rgbBlue. Если вы
добавите Option Explicit в модуль, появится ошибка «переменная не определена».
Это значительно облегчает решение проблемы.
Эти два примера очень просты. Если у вас много кода, то
подобные ошибки могут стать кошмаром для отслеживания.
Использование Dim с Basic Variables
VBA имеет те же основные типы переменных, которые
используются в электронной таблице Excel.
Вы можете увидеть список всех типов переменных VBA здесь.
Тем не менее, большую часть времени вы будете использовать следующие:
Тип | Хранение | Диапазон | Описание |
Boolean | 2 байта | ИСТИНА или ЛОЖЬ | Эта переменная может быть ИСТИНА или ЛОЖЬ. |
Long | 4 байта | от -2,147,483,648 до 2,147,483,647 |
Long — это сокращение от Long Integer. Используйте это вместо типа Integer * |
Currency | 8 байт | от -1,79769313486231E308 до -4,94065645841247E-324 для отрицательных значений; от 4.94065645841247E-324 до 1.79769313486232E308 для положительных значений |
Аналогично Double, но имеет только 4 знака после запятой |
Double | 8 байт | от -922,337,203,685,477.5808 до 922,337,203,685,477.5807 |
|
Date | 8 байт | С 1 января 100 по 31 декабря 9999 |
|
String | меняется | От 0 до примерно 2 миллиардов |
Содержит текст |
* Первоначально мы использовали бы тип Long вместо Integer,
потому что Integer был 16-разрядным, и поэтому диапазон был от -32 768 до 32
767, что довольно мало для многих случаев использования целых чисел.
Однако в 32-битной (или выше) системе целое число автоматически
преобразуется в длинное. Поскольку Windows была 32-битной начиная с Windows 95
NT, нет смысла использовать Integer.
В двух словах, всегда используйте Long для целочисленного
типа в VBA.
Фиксированный тип строки
В VBA есть один необычный тип базовой переменной, с которым
вы, возможно, не знакомы.
Это фиксированный тип строки. Когда мы создаем нормальную строку в VBA, мы можем добавить текст, и VBA автоматически изменит размер строки для нас.
Sub TipStroki() Dim s As String ' s is "Иван Петров" s = "John Smith" ' s is "Игорь" s = "Tom" End Sub
Фиксированная строка никогда не изменяется. Эта строка
всегда будет иметь одинаковый размер независимо от того, что вы ей назначаете
вот несколько примеров:
Sub FiksStroka() Dim s As String * 4 ' s is "Иван" s = "Иван Перов" ' s = "Игорь " s = "Игорь" End Sub
Использование Dim с Variants
Когда мы объявляем переменную как вариант, VBA решает во время выполнения, какой
тип переменной должен быть.
Мы объявляем варианты следующим образом
' Оба варианта Dim count Dim count As Variant Это звучит как отличная идея в теории. Больше не нужно беспокоиться о типе переменной Sub IspVariants() Dim count As Variant count = 7 count = "Иван" count = #12/1/2018# End Sub
Однако использование вариантов является плохой практикой, и
вот почему:
- VBA
не будет замечать неправильных ошибок типа (т. Е. Несоответствие данных). - Вы не можете получить доступ к Intellisense.
- VBA
угадывает лучший тип, и это может быть не то, что вы хотите.
Тип ошибки
Ошибки твои друзья!
Они могут раздражать и расстраивать, когда они случаются, но
они предупреждают вас о будущих проблемах, которые не так легко найти.
Ошибка несоответствия типов предупреждает вас, когда используются неверные данные.
Например. Представьте, что у нас есть лист оценок учеников.
Если кто-то случайно (или намеренно) заменит метку на текст, данные будут
недействительными.
Если мы используем вариант для хранения меток, то ошибки не
возникнет
Sub MarksVariant() Dim marks As Variant Dim i As Long For i = 1 To 10 ' Прочитайте отметку mark = Sheet1.Range("A" & i).Value Next End Sub
Это не хорошо, потому что в ваших данных есть ошибка, а вы
не знаете об этом.
Если вы зададите переменную Long, VBA сообщит вам об ошибке
«Несоответствие типов», если значения являются текстовыми.
Sub MarksLong() Dim mark As Long Dim i As Long For i = 1 To 10 ' Прочитайте отметку mark = Sheet1.Range("A" & i).Value Next End Sub
Доступ к Intellisense
Intellisense — удивительная особенность VBA. Он дает вам
доступные параметры в зависимости от типа, который вы создали.
Представьте, что вы объявляете переменную листа, используя
Dim
Когда вы используете переменную wk с десятичной точкой, VBA
автоматически отобразит доступные опции для переменной.
Вы можете увидеть Intellisense на скриншоте ниже
Если вы используете Variant как тип, то Intellisense будет
недоступен
Это потому, что VBA не будет знать тип переменной до времени
выполнения.
Использование Dim с Objects
Если вы не знаете, что такое Objects, вы можете прочитать
мою статью об VBA Objects здесь.
Есть 3 типа объектов:
- Объекты Excel
- Объекты модуля класса
- Внешние объекты библиотеки
Примечание. Объект VBA Collection используется аналогично тому, как мы используем объект Class Module. Мы используем новое, чтобы создать его.
Давайте посмотрим на каждый из них по очереди.
Объекты Excel
Объекты Excel, такие как Рабочая книга, Рабочий лист,
Диапазон и т. Д., Не используют Новый, поскольку они автоматически создаются
Excel. Смотрите, «когда New не требуется».
При создании или открытии книги Excel автоматически создает
связанный объект.
Например, в приведенном ниже коде мы открываем рабочую
книгу. VBA создаст объект, а функция Open вернет книгу, которую мы можем
сохранить в переменной
Sub OtkrWorkbook() Dim wk As Workbook Set wk = Workbooks.Open("C:ДокументыОтчет.xlsx") End Sub
Если мы создадим новый лист, произойдет похожая вещь. VBA
автоматически создаст его и предоставит доступ к объекту.
Sub DobavSheet() Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets.Add End Sub
Нам не нужно использовать ключевое слово New для этих объектов Excel.
Мы просто присваиваем переменную функции, которая либо
создает новый объект, либо дает нам доступ к существующему.
Вот несколько примеров назначения переменных Workbook, Worksheet и range
Sub DimWorkbook() Dim wk As Workbook ' назначить wk новой книге Set wk = Workbooks.Add ' назначить wk первой открытой книге Set wk = Workbooks(1) ' назначить wk рабочей книге Отчет.xlsx Set wk = Workbooks("Отчет.xlsx") ' назначить wk активной книге Set wk = ActiveWorkbook End Sub
Sub DimWorksheet() Dim sh As Worksheet ' Назначить sh на новый лист Set sh = ThisWorkbook.Worksheets.Add ' Назначьте sh на крайний левый лист Set sh = ThisWorkbook.Worksheets(1) ' Назначьте sh на лист под названием «Клиенты» Set sh = ThisWorkbook.Worksheets("Клиенты") ' Присвойте sh активному листу Set sh = ActiveSheet End Sub
Sub DimRange() ' Получить рабочий лист клиента Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Клиенты") ' Объявите переменную диапазона Dim rg As Range ' Присвойте rg диапазону A1 Set rg = sh.Range("A1") ' Назначьте rg в диапазоне от B4 до F10 Set rg = sh.Range("B4:F10") ' Присвойте rg диапазону E1 Set rg = sh.Cells(1, 5) End Sub
Если вы хотите узнать больше об этих объектах, вы можете ознакомиться со следующими статьями: Workbook VBA, Worksheet VBA и Cell и Range VBA.
Использование Dim с Class Module Objects
В VBA мы используем Class Modules для создания наших собственных пользовательских объектов. Вы можете прочитать все о Class Modules здесь.
Если мы
создаем объект, нам нужно использовать ключевое слово New.
Мы можем сделать это в операторе Dim или в операторе Set.
Следующий код создает объект, используя ключевое слово New в выражении Dim:
' Объявить и создать Dim o As New class1 Dim coll As New Collection
Использование New в выражении Dim означает, что каждый раз
при запуске нашего кода будет создаваться ровно один объект.
Использование Set дает нам больше гибкости. Мы можем создать
много объектов из одной переменной. Мы также можем создать объект на основе
условия.
Этот следующий код показывает, как мы создаем объект Class Module, используя Set. (Чтобы создать модуль класса, перейдите в окно проекта, щелкните правой кнопкой мыши соответствующую книгу и выберите «Вставить модуль класса». Подробнее см. «Создание Simple Class Module».)
' Объявить только Dim o As Class1 ' Создать с помощью Set Set o = New Class1
Давайте посмотрим на пример использования Set. В приведенном ниже коде мы хотим
прочитать диапазон данных. Мы создаем объект только в том случае, если значение
больше 50.
Мы используем Set для создания объекта Class1. Это потому, что количество нужных нам объектов зависит от
количества значений более 50.
Sub IspSet() ' Объявите переменную объекта Class1 Dim o As Class1 ' Читать диапазон Dim i As Long For i = 1 To 10 If Sheet1.Range("A" & i).Value > 50 Then ' Создать объект, если условие выполнено Set o = New Class1 End If Next i End Sub
Я сохранил этот пример простым для ясности. В реальной версии этого кода мы бы заполнили объект Class Module данными и добавили его в структуру данных, такую как Collection или Dictionary.
Вот пример реальной версии, основанной на данных ниже:
' Class Module - clsStudent Public Name As String Public Subject As String ' Стандартный модуль Sub ChitatBalli() ' Создать коллекцию для хранения объектов Dim coll As New Collection ' Current Region получает соседние данные Dim rg As Range Set rg = Sheet1.Range("A1").CurrentRegion Dim i As Long, oStudent As clsStudent For i = 2 To rg.Rows.Count ' Проверьте значение If rg.Cells(i, 1).Value > 50 Then ' Создать новый объект Set oStudent = New clsStudent ' Читать данные на объект студента oStudent.Name = rg.Cells(i, 2).Value oStudent.Subject = rg.Cells(i, 3).Value ' добавить объект в коллекцию coll.Add oStudent End If Next i ' Распечатайте данные в Immediate Window, чтобы проверить их Dim oData As clsStudent For Each oData In coll Debug.Print oData.Name & " studies " & oData.Subject Next oData End Sub
Чтобы узнать больше о Set вы можете заглянуть сюда.
Объекты из внешней библиотеки
Действительно полезная часть VBA — это то, как у нас есть
доступ к внешним библиотекам. Это открывает целый новый мир тому, что мы можем
сделать.
Примерами являются библиотеки Access, Outlook и Word,
которые позволяют нам взаимодействовать с этими приложениями.
Мы можем использовать библиотеки для различных типов
структур данных, таких как Словарь, Массив, Стек и Очередь.
Существуют библиотеки для очистки веб-сайта (библиотека
объектов Microsoft HTML), использования регулярных выражений (регулярные
выражения Microsoft VBScript) и многих других задач.
Мы можем создать эти объекты двумя способами:
- Раннее связывание
- Позднее связывание
Давайте посмотрим на это по очереди.
Раннее связывание
Раннее связывание означает, что мы добавляем справочный
файл. Как только этот файл добавлен, мы можем рассматривать объект как объект
модуля класса.
Мы добавляем ссылку, используя Tools-> Reference, а затем
проверяем соответствующий файл в списке.
Например, чтобы использовать словарь, мы ставим флажок
«Microsoft Scripting Runtime»
Как только мы добавим ссылку, мы можем использовать словарь
как объект модуля класса
Sub RanSvyaz() ' Используйте только Dim Dim dict1 As New Dictionary ' Используйте Dim и Set Dim dict2 As Dictionary Set dict2 = New Dictionary End Sub
Преимущество раннего связывания заключается в том, что у нас
есть доступ к Intellisense. Недостатком является то, что это может вызвать
конфликтные проблемы на других компьютерах.
Лучше всего использовать раннюю привязку при написании кода,
а затем использовать позднюю привязку при распространении кода другим
пользователям.
Позднее связывание
Позднее связывание означает, что мы создаем объект во время
выполнения.
Мы объявляем переменную как тип «Объект». Затем мы
используем CreateObject для создания объекта.
Sub PozdSvyaz() Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") End Sub
Использование Dim с Arrays
В VBA есть два типа массивов:
- Статический — размер массива задается в
операторе Dim и не может изменяться. - Динамический — размер массива не указан в
выражении Dim. Это устанавливается позже с помощью оператора ReDim
' Статический массив ' Магазины 7 длинных - от 0 до 6 Dim arrLong(0 To 6) As Long ' Магазины 7 длинных - от 0 до 6 Dim arrLong(6) As String
Динамический массив дает нам гораздо больше гибкости. Мы
можем установить размер во время выполнения кода.
Мы объявляем динамический массив, используя инструкцию Dim,
и устанавливаем размер позже, используя ReDim.
' Динамический массив ' Объявите переменную Dim arrLong() As Long ' Установить размер ReDim arrLong(0 To 6) As Long
Использование ReDim
Большая разница между Dim и ReDim
заключается в том, что мы можем использовать переменную в выражении ReDim. В операторе Dim размер должен быть
постоянным значением.
Sub IspSet() ' Объявите переменную Dim arrLong() As Long ' Спросите пользователя о размере Dim size As Long size = InputBox("Пожалуйста, введите размер массива.", Default:=1) ' Установите размер на основе пользовательского ввода ReDim arrLong(0 To size) As Long End Sub
На самом деле мы можем использовать оператор Redim без
предварительного использования оператора Dim.
В первом примере вы можете видеть, что мы используем Dim:
Sub IspDimReDim() ' Использование Dim Dim arr() As String ReDim arr(1 To 5) As String arr(1) = "Яблоко" arr(5) = "Апельсин" End Sub
Во втором примере мы не используем Dim:
Sub IspTolkoReDim () ' Использование только ReDim ReDim arr(1 To 5) As String arr(1) = "Яблоко" arr(5) = "Апельсин" End Sub
Преимущество состоит в том, что вам не нужно тусклое
утверждение. Недостатком является то, что это может сбить с толку тех, кто
читает ваш код. В любом случае это не имеет большого значения.
Вы можете использовать ключевое слово Preserve с ReDim для сохранения существующих данных при изменении размера массива. Вы можете прочитать больше об этом здесь.
Вы можете найти все, что вам нужно знать о массивах в VBA здесь.
Устранение неполадок ошибок Dim
В таблице
ниже приведены ошибки, с которыми вы можете столкнуться при использовании Dim. См. Ошибки VBA для
объяснения различных типов ошибок.
Ошибка | Тип | Причина |
Массив уже рассчитан |
Компиляция | Использование Redim для статического массива. |
Ожидаемый: идентификатор |
Синтаксис | Использование зарезервированного слова в качестве имени переменной. |
Ожидаемый: новый тип имени |
Синтаксис | Тип отсутствует в выражении Dim. |
Переменная объекта или переменная блока не установлена |
Время выполнения | New не был использован для создания объекта. |
Переменная объекта или переменная блока не установлена |
Время выполнения | Set не использовался для назначения переменной объекта. |
Пользовательский тип не определен |
Компиляция | Тип не распознан. Это может произойти, если ссылочный файл не добавлен в меню «Инструменты-> Ссылка» или имя модуля класса написано неправильно. |
Недопустимый оператор вне блока Type |
Компиляция | Имя переменной отсутствует в выражении Dim |
Переменная не определена |
Компиляция | Переменная используется перед Dim-строкой. |
Локальные и глобальные переменные
Когда мы используем Dim в процедуре (то есть подпрограмме или функции), она считается
локальной. Это означает, что это доступно только с этой процедурой.
Глобальные переменные объявляются вне процедур. В
зависимости от типа, они могут быть доступны для всех процедур в одном и том же
модуле или для всех процедур во всех модулях в текущей рабочей книге.
В приведенном ниже коде мы объявили count как глобальную переменную:
' Глобальная Dim count As Long Sub UseCount1() count = 6 End Sub Sub UseCount2() count = 4 End Sub
Что произойдет, если у нас будет глобальная переменная и
локальная переменная с одинаковым именем?
На самом деле это не вызывает ошибку. VBA дает приоритет локальной декларации.
' Глобальная Dim count As Long Sub UseCount() ' Локальная Dim count As Long ' Относится к локальному счету count = 6 End Sub
Подобная ситуация может привести только к проблемам, так как
трудно отследить, какой счет используется.
Вообще глобальных переменных следует избегать, где это
возможно. Они делают код очень трудным для чтения, потому что их значения могут
быть изменены в любом месте кода. Это затрудняет обнаружение и устранение ошибок.
Важно знать и понимать глобальные переменные как вы,
поскольку вы можете встретить их в существующем коде.
Dim против Private
В VBA есть ключевое слово Private.
Если мы используем ключевое слово Private с переменной или
подфункцией / функцией, то этот элемент доступен только в текущем модуле.
Использование Dim и Private для переменной дает тот же
результат
' Доступно во всем этом модуле Private priCount As Long Dim dimCount As Long Sub UseCount() ' Доступно только в этом разделе Private priName As String Dim dimName As String End Sub
В VBA принято использовать Private для глобальных переменных
и Dim для локальных
' Доступно во всем этом модуле Private priCount As Long Sub UseCount() ' Только локальный Dim dimName As String End Sub
Local OnlyThere
в VBA есть 2 других
типа объявлений, которые называются Public и Global.
Ниже приводится краткое изложение всех 4 типов:
- Dim
— используется для объявления локальных переменных, т. Е. В процедурах. - Private
— используется для объявления глобальных переменных и процедур. Эти переменные
доступны только для текущего модуля. - Public
— используется для объявления глобальных переменных и процедур. Эти переменные
доступны во всех модулях. - Global
— старая и устаревшая версия Public.
Может использоваться только в стандартных модулях. Он существует только для обратной
совместимости.
Заключение
На этом мы заканчиваем статью о VBA Dim Statement. Если у вас есть
какие-либо вопросы или мысли, пожалуйста, дайте мне знать в комментариях ниже.
В этой статье вы узнаете, что такое константы и переменные в макросах, где они могут использоваться, и в чем заключается основное отличие между разными типами данных. Также будет раскрыто, зачем нужны константы, если можно просто прописать переменную и никогда ее не изменять.
Аналогично иным языкам программирования, хранение данных может осуществляться в переменных или константах (и те, и другие также нередко называются контейнерами данных). В этом и заключается основное отличие между этими понятиями. Первые могут изменяться в зависимости от того, что происходит в программе. В свою очередь, константы задаются один раз и не меняют своего значения.
Константы могут быть полезными, если необходимо одно и то же большое значение использовать несколько раз. Вместо копирования числа можно просто написать название константы. Например, вы можете использовать константу «Pi» для хранения числа Пи, которое является постоянным значением. Оно очень большое, и каждый раз писать его или искать и копировать довольно затруднительно. А так, достаточно написать два символа, и среда автоматически использует нужное число.
Пользователю Excel необходимо объявлять переменные, если ему надо время от времени менять значение, хранящееся в них. Например, можно задать переменную с названием sVAT_Rate, в которой будет храниться текущая ставка НДС на товар. Если она изменяется, можно быстро скорректировать ее. Особенно это полезно тем, кто ведет бизнес в Соединенных Штатах, где некоторые товары могут вообще не облагаться НДС (а также этот налог отличается в разных штатах).
Содержание
- Типы данных
- Объявление констант и переменных
- Оператор Option Explicit
- Область действия констант и переменных
- Зачем нужны константы и переменные
- Выводы
Типы данных
Каждый контейнер данных может относиться к одному из нескольких типов. Приводим таблицу, описывающую стандартные типы обрабатываемой информации. Их много, и новичку может показаться изначально, что они повторяют друг друга. Но это иллюзорное ощущение. Дальше вы узнаете, почему указание правильного типа данных так важно.
Не рекомендуется использовать тип данных, занимающий больше места в памяти, для небольших чисел. Например, для цифры 1 достаточно использовать тип Byte. Это положительно скажется на быстродействии исполняемого модуля, особенно на слабых компьютерах. Но важно не перегнуть палку и здесь. Если использовать слишком компактный тип данных, чрезмерно большое значение может в нем не поместиться.
Объявление констант и переменных
Использование контейнера данных без его предварительного объявления настоятельно не рекомендуется. Тогда может возникнуть ряд проблем, для избежания которых необходимо написать несколько небольших строчек кода с перечислением переменных или констант.
Чтобы объявить переменную, используется оператор Dim. Например, так:
Dim Variable_Name As Integer
Variable_Name – это название переменной. Далее пишется оператор As, указывающий на тип данных. Вместо строк «Variable_Name» и «Integer» можно вставить свое название и тип данных.
Константы тоже можно объявлять, но предварительно нужно указать их значение. Как один из вариантов, так:
Const iMaxCount = 5000
Справедливости ради, в некоторых случаях можно обойтись и без объявления переменной, но в таком случае им автоматически будет назначен тип Variant. Тем не менее, делать этого не рекомендуется по следующим причинам:
- Variant обрабатывается значительно медленнее, и если таких переменных много, обработка информации может существенно замедлиться на слабых компьютерах. Казалось бы, что те секунды решат? Но если приходится писать большое количество строк кода, а потом еще и запускать его на слабых компьютерах (которые до сих пор продаются, учитывая то, что современные офисные пакеты требуют много оперативной памяти), можно полностью остановить работу. Известны случаи, как непродуманное написание макросов приводило к зависанию смартбуков, которые имеют небольшое количество оперативной памяти и не рассчитаны на выполнение сложных задач.
- Допускается наличие опечаток в названиях, предотвращение которых возможно с помощью оператора Option Explicit, позволяющего найти необъявленную переменную, если такая обнаруживается. Это простой способ определения ошибок, поскольку малейшая опечатка приводит к тому, что интерпретатор не может идентифицировать переменную. А если включить режим объявления переменных, интерпретатор просто не даст запустить макрос, если обнаруживаются контейнеры данных, которые не были объявлены в самом начале модуля.
- Избежание ошибок, вызванных тем, что значения переменной не соответствуют типу данных. В норме, если присвоить текстовое значение целочисленной переменной, будет выдана ошибка. Да, с одной стороны, без объявления присваивается универсальный тип, но если заранее их объявить, то можно избежать случайных ошибок.
Поэтому, несмотря на все, настоятельно рекомендуется объявлять все переменные в макросах Excel.
При объявлении переменных нужно учитывать еще один момент. Можно при объявлении переменной не присваивать ей никаких значений, но в этом случае она обретает значение по умолчанию. Например:
- Строки делаются пустыми.
- Числа обретают значение 0.
- Переменные с типом Boolean изначально считаются ложными.
- По умолчанию выставляется дата 30 декабря 1899 года.
Например, не нужно присваивать целочисленной переменной значение 0, если ранее не было указано никакого значения. Она и так содержит это число.
Оператор Option Explicit
Этот оператор позволяет декларировать все переменные, которые используются в коде VBA и определять наличие каких-то незадекларированных контейнеров до того, как код будет запущен. Чтобы использовать эту возможность, достаточно просто написать строку кода Option Explicit в самом верху кода макроса.
Если вам нужно включать этот оператор в код в каждом случае, это можно сделать с помощью специальной настройки VBA редактора. Чтобы включить эту опцию, необходимо:
- Перейти в среде разработки по пути – Tools > Options.
- В открывшемся после этого окне следует открыть вкладку Editor.
- И наконец, поставить флажок возле пункта Require Variable Declaration.
По завершению этих действий нажать на кнопку «ОК».
Все, теперь при написании каждого нового макроса эта строчка будет вставляться в верхнюю часть кода автоматически.
Область действия констант и переменных
Каждая переменная или константа имеет лишь ограниченную область действия. Это зависит от того, где ее декларировать.
Предположим, у нас есть функция Total_Cost(), и в ней используется переменная sVAT_Rate. В зависимости от позиции в модуле, она будет иметь разную область действия:
Option Explicit
Dim sVAT_Rate As Single Function Total_Cost() As Double . . . End Function |
Если переменная объявляется вверху самого модуля, она распространяется на весь этот модуль. То есть, она может читаться каждой процедурой.
Причем, если одна из процедур изменила значение переменной, то следующая будет также читать это скорректированное значение. Но в других модулях эта переменная все равно не будет читаться. |
Option Explicit
Function Total_Cost() As Double Dim sVAT_Rate As Single . . . End Function |
В этом случае переменная объявляется внутри процедуры, и интерпретатор будет выдавать ошибку, если она будет использоваться в другой процедуре. |
Если необходимо, чтобы переменная читалась другими модулями, необходимо использовать вместо ключевого слова Dim ключевое слово Public. Точно так же, можно ограничить область распространения переменной только на текущий модуль с помощью оператора Public, который прописывается вместо слова Dim.
Задавать область действия констант можно аналогичным образом, но ключевое слово здесь прописывается вместе с оператором Const.
Вот таблица с наглядным примером, как это работает с константами и переменными.
Option Explicit
Public sVAT_Rate As Single Public Const iMax_Count = 5000 |
В этом примере вы можете увидеть, как ключевое слово Public применяется для объявления переменной, и что нужно прописывать в редакторе Visual Basic для объявления публичной константы. Область распространения этих контейнеров для значений касается всех модулей. |
Option Explicit
Private sVAT_Rate As Single Private Const iMax_Count = 5000 |
Здесь переменные и константы объявляются с помощью ключевого слова Private. Это означает, что их можно увидеть только в рамках текущего модуля, а процедуры в других модулях не смогут их использовать. |
Зачем нужны константы и переменные
Использование констант и переменных позволяет увеличить степень понятности кода. И если у новичков в целом не возникает вопросов, зачем нужны переменные, то касаемо необходимости констант существует множество неясностей. И этот вопрос кажется, на первый взгляд, вполне логичным. Ведь можно один раз объявить переменную и больше ее никогда не менять.
Ответ оказывается где-то в той же плоскости, что и касаемо использования типов данных, занимающих большое пространство в памяти. Если мы имеем дело с огромным количеством переменных, можно случайно уже существующий контейнер изменить. Если же пользователь прописывает, что определенное значение никогда не будет изменяться, то среда автоматически проконтролирует это.
Особенно это важно, когда макрос пишется несколькими программистами. Один может знать о том, что какая-то переменная не должна меняться. А другой – нет. Если же указывать оператор Const, иной разработчик будет знать, что данное значение не меняется.
Или же, если есть константа с одним именем, а переменная имеет другое, но похожее название. Разработчик может попросту перепутать их. Например, одна переменная, которую не нужно менять, называется Variable11, а другая, которую можно редактировать – Variable1. Человек может на автомате, когда пишет код, случайно пропустить лишнюю единицу и не заметить этого. В результате, будет изменен контейнер для значений, который не следовало бы трогать.
Или же сам разработчик может забыть, какие переменные ему можно трогать, а какие – нет. Это часто случается, когда код пишется несколько недель, и его размер становится большим. За это время очень легко забыть даже то, что означает та или иная переменная.
Да, можно в этой ситуации обойтись комментариями, но не проще ли указать слово Const?
Выводы
Переменные являются важнейшей составляющей программирования макросов, которые позволяют выполнять сложные операции, начиная вычислениями и заканчивая информированием пользователя об определенных событиях или указанием конкретных значений в ячейках электронной таблицы.
Константы нужно использовать, если разработчик точно знает, что содержимое этих контейнеров не будет меняться в дальнейшем. Рекомендуется не использовать переменные вместо них, поскольку можно случайно ошибиться.
Оцените качество статьи. Нам важно ваше мнение:
Что такое переменная?
Имя, которое задается области компьютерной памяти и используется для хранения данных, называется переменной. Переменные обеспечивают возможность временно сохранять данные в компьютерной программе и этими данными манипулировать. Переменные в операторах VBA, это практически тоже самое, что и переменные в алгебраических уравнениях. В переменных могут содержаться числа, текстовые данные или другая информация, которая во время написания оператора не известна, но будет доступна при его выполнении. При появлении имени переменной в операторе, VBA подставляет в этот оператор фактическое значение, которое хранится в текущий момент в области памяти.
Требования к именам переменных
При выборе имен для переменных необходимо руководствоваться следующими правилами:
— имена переменных должны начинаться с буквы;
— после первой буквы можно использовать любые сочетания букв, цифр и символов подчеркивания (_);
— в именах переменных не могут содержаться пробелы, точки и символы, используемые VBA для обозначения математических действий и операций сравнения;
— имя переменной не может превышать 255 символов;
— имена переменных не должны повторять ключевые слова VBA;
— имя переменной (идентификатор) должно быть уникальным в пределах его области действия.
Кроме того, имена переменных не различают состояние регистра. Имена FirstRow и firstrow представляют для VBA одно и то же. При выборе имен переменных следует делать их максимально информативными.
Неявное объявление переменных (implicit variable declaration)
Использование переменной в операторе VBAП является простейшим способом создания этой переменной. Такое создание переменной называется неявным объявлением переменной. Использование переменной в операторе, неявно указывает (объявляет) VBA о создании этой переменной. Когда переменная впервые появляется в операторе, VBA создает переменную, при этом для нее резервируется область памяти. Переменные, созданные неявным объявлением, всегда имеют тип данных Variant. Не смотря на удобство, неявное объявление переменных имеет определенные недостатки. Напрмер, вы можете дважды неявно объявить одну и ту же переменную, думая, что объявляете новую и при этом потерять ранее сохраненное значение. При неявном объявлении переменных могут возникать и другие проблемы, которые впоследствии очень трудно обнаружить. Кроме того, при таком объявлении замедляется скорость выполнения программного кода.
Явное объявление переменных (explicit variable declaration)
Visual Basic for Application предоставляет возможность выполнять явное объявление переменных. Для того чтобы явно объявить переменную используется VBA-оператор Dim (сокращение от слова Dimension). Все переменные, которые создаются с этой формой ключевого слова Dim, являются переменными типа Variant. Для явного объявления переменной используется следующий синтаксис:
Этот оператор указывает VBA создать переменную с именем MyVar.
Переменная объявляется только один раз в отдельной процедуре или модуле. Хорошим правилом считается все явные объявления переменных производить в одном месте в начале процедуры. Явное объявление переменных имеет ряд преимуществ перед неявным:
— ускоряется выполнение программного кода;
— уменьшение количества ошибок в результате неправильного написания имен переменных;
— код становится более читабельным и понятным;
— нормализация использования переменных с заглавными буквами в именах.
Задание типа данных переменной
Независимо от того, объявляются ли переменные явно или неявно, все они являются переменными типа Variant, если только не задается другой тип переменной в объявляющем ее операторе. Объявление переменной, при котором задается тип переменной, называется типизированным объявлением переменной. Типизированное объявление переменной имеет следующий синтаксис:
При типизированном объявлении переменной используется один из нескольких типов данных VBA.
При таком объявлении переменных имеет несколько преимуществ:
— ускоряется выполнение кода программ;
— повышается эффективность кода и сокращается объем памяти, требуемый для программы;
— легче читается и воспринимается программный код;
— легче обнаруживаются некоторые типы ошибок.
Использование специальных символов определения типа для объявления переменных
Существует еще один способ объявления переменных, при помощи специальных символов: !, @, #, $, %, &. Эти символы называют символами определения типа. В более ранних разновидностях Basic такой способ определения переменных был единственно возможным, сейчас же использование оператора Dim с ключевым словом As делает определение типа переменной проще и понятнее. Тем не менее, при неявном объявлении переменной можно задать ее тип, добавив специальный символ в конец имени переменной. При этом этот символ необходимо будет добавлять каждый раз, когда используется имя переменной, иначе будет возникать runtime-ошибка. В таблице приведено соответствие между символами определения и типами данных.
Таким образом, результат действия процедуры с явным объявлением переменной
Sub HelloExcel_1() Dim HelloMsg As String HelloMsg = "Hello, Excel!" MsgBox HelloMsg End Sub
будет таким-же как и результат действия с неявным объявлением переменной при помощи символа определения типа.
Sub HelloExcel_2() HelloMsg$ = "Hello, Excel!" MsgBox HelloMsg$ End Sub
Другие материалы по теме:
Переменные и константы в VBA
Смотрите также конкретным вопросом (что данных Long тип указать. Поверьте, и объявлять переменные по ссылке vbNewLine & TypeName(l), Запустите для проверки пользователю должно бытьНажмите
выражение: полезным ещё разSub константам. зависит от того,Если все переменныевместоВ VBA, как и нужно сделать/для чего)
DefCur — Тип столько было ошибок и их количество.RAN & vbNewLine & такой макрос показано сообщение обAlt+F8=SumMinus(10, 5, 2) взглянуть на особенностив VBA добавляетOption Explicit Public sVAT_Rate
Типы данных
где было сделано объявляются, то можноDouble в любом другом — возможно получится данных Currency из-за того, что Варианты переменных я
: Вот уж воистину TypeName(d)
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub tt() | ошибке и процедура | (нажмите клавишуРедактор VBA понимает, что и отличия этих | заданное целое число |
As Single Public | объявление переменной или | использовать оператор VBA). Однако, используя более | языке программирования, переменные |
всё решить более | DefSng — Тип | использовали Variant, а изучал, но как | — «Смотрю в |
End Sub | Dim w, e | должна быть тутAlt | перед ним процедура |
двух типов процедур. | (Integer) в каждую | Const iMax_Count = константы. Возьмём, к | — |
компактные типы данных, | и константы используются | «деликатно» данных Single | не конкретный тип. |
выбирать до конца | книгу, вижу …» | Но с Option As Boolean же завершена: | и, удерживая её |
Sub | Далее приведены краткие | ячейку в выделенном 5000 … примеру, переменнуюOption Explicit нужно внимательно следить для хранения каких-либоFreddyLumixDefDbl — Тип | Юрий М не понимаю. СчитатьТам и ссылочка |
Explicit будет ругаться. | w = 2 | Function VAT_Amount(sVAT_Rate As | нажатой, нажмите клавишу |
, когда встречает группу | обсуждения процедур VBA | диапазоне. Передать процедуреВ этом примере ключевоеsVAT_Rate(о нём расскажем за тем, чтобы | значений. Как и: «…или используйте Application.InputBox данных Double: Плохой совет ) по битам или |
есть Что такое | alex77755 | e = 2 Single) As SingleF8 команд, заключённую междуFunction это число можно слово, которая используется в далее), чтобы выявить | в коде не следует из названия, |
с соответствующим параметром.»DefDate — ТипВсе_просто байтам- тёмный лес. модуль? Какие бывают: Насколько мне известно[a1] = w VAT_Amount = 0). вот такими открывающими при помощи аргумента,Public функции все не объявленные было попыток уместить переменные могут изменяться,А вот этого, данных Date: Если хотите работать Вот если не модули?
Объявление переменных и констант
такой способ возможен[a2] = e If sVAT_RateВ появившемся списке макросов и закрывающим операторами:Sub вот так:использовано для объявленияTotal_Cost переменные.Таким образом исключается в них не
константы же хранят если честно, неDefStr — Тип
профессионально в VBA, трудно, то в
combat только в VB.NET.End Sub
Обратите внимание, что перед выберите тот, который
Sub … Endи показаны простыеSub AddToCells(i As переменной. В следующей таблице появление в программе
соразмерно большие значения. фиксированные значения. понял. Знаний еще данных String
то нужно приучать каком случае выбирать: Так у меняНи в VB6,и Вам сразу тем, как завершить хотите запустить. Sub примеры. Integer) … EndsVAT_Rate рассмотрены два варианта ошибки в результате
Примечание переводчика:Например, константа маловато….
DefObj — Тип себя объявлять все string, а в один код в ни в VBA
все станет ясно выполнение процедурыНажмите
Рассмотрим пример простой VBAРедактор VBA распознаёт процедуру Subи константы области действия переменной не верно записанногоГоворя о переменныхPiJack Famous данных Оbject
переменные. Для дисциплинирования каком Boolean, а форме, а другой он не катит.WowickFunctionВыполнить процедурыFunctionИмейте в виду, чтоiMax_CountsVAT_Rate
- имени переменной. Например, в VBA, стоитхранит значение 3,14159265…: тем более наDefVar — Тип можно нажать на в каком variant. на листе, переменнуюКстати в VB.NET: Неужели самому сложно–(Run)Sub, когда встречает группу наличие аргументов для. Областью действия объявленных, объявленной в двух используя в коде упомянуть ещё один Число «Пи» не форум данных Variant птичку в настройках,Спасибо я привязываю от тип данных относится проверить???VAT_AmountЧтобы выполнять процедуру, задача которой – команд, заключённую между процедур таким образом элементов различных позициях в переменную с именем очень важный момент. будет изменяться вА перед этимJack Famous где указывается, чтоvikttur формы, где должно ко всем переменным
- Написал вот такой, в код вставленаSub изменить форматирование выделенного вот такими открывающимFunction будет весь текущий модуле:sVAT_Rate Если мы объявляем ходе выполнения программы, почитать про диалоги: Alemox, так по в самом верху: В зависимости от присвоится к «rrr» в строке: макрос: встроенная VBA функциябыстро и легко, диапазона ячеек. В и закрывающим операторами:и проект.Option Explicit Dim sVAT_Rate, можно допустить опечатку переменную, но не но все же и их особенности вашей же ссылке модуля всегда будет данных, для которых либо значение 21200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim i, j, k200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub start()MsgBox можно назначить для ячейках устанавливается выравнивание
- Function … EndSubЭто значит, что As Single Function и, присваивая значение присваиваем ей какое-либо хранить такое значениеКак минимум, InputBox всё это есть) указываться option explicit. предназначены переменные. либо 25 для As IntegerDim i, k,, которая показывает пользователю неё комбинацию клавиш. по центру (и Functionв VBA неsVAT_Rate Total_Cost() As Double этой переменной, записать: значение, то она удобнее как константу. и Application.InputBox — крутая вещь, ноПримитивы объявлять большогоТекстовые - кода листа (РСИ),В VB.NET все n As Integer всплывающее окно с Для этого:
по вертикали, иКак упоминалось ранее, процедура является обязательным. Дляи … End Function «VATRate = 0,175». инициализируется значением поВ то же время разные вещи. К я пока «ручками»
Option Explicit
смысла нет, можноSringмодуль в общем переменный будут Integeri = 1.65 предупреждением.Нажмите по горизонтали) иFunction некоторых процедур аргументыiMax_CountЕсли переменная Ожидается, что с умолчанию: мы можем использовать тому же, там
каждую всё-таки задаю
все оставлять variant, логические - проекте есть ноВ VB6 иk = 2.65Урок подготовлен для ВасAlt+F8 размер шрифта изменяетсяв VBA (в не нужны.будут доступны в
sVAT_Rate
- этого момента, переменная• текстовые строки переменную есть другие параметры,Alemox
- и не сильноBoolean он не использует
- VBA k Integern = 7.65 командой сайта office-guru.ru.
на заданный пользователем: отличие отПроцедуры VBA могут иметь любом модуле проекта.объявлена в самом
Область действия переменных и констант
sVAT_Rate — инициализируются пустымиsVAT_Rate кроме названия (например: Jack Famous, Да заморачиваться (хотя лучше. Всяческие счетчики, количества эту переменнуюi, j -MsgBox i &Источник: http://www.excelfunctions.net/VBA-Functions-And-Subroutines.htmlВ появившемся списке макросовSub Format_Centered_And_Sized(Optional iFontSizeSub необязательные аргументы. ЭтоOption Explicit Private sVAT_Rate начале модуля, тодолжна содержать значение строками;для хранения ставкитип получаемых данных я увидел тоже объявлять — правило
(не дробные), номераили я вообще Variant » » & | Перевел: Антон Андронов выберите тот, которому As Integer =), возвращает значение. Для такие аргументы, которые As Single Private областью действия этой 0,175 – но,• числа — НДС на покупаемые— как раз
потом уже. Просто хорошего тона), с строк - не в туSkyPro k & «Автор: Антон Андронов хотите назначить сочетание 10) Selection.HorizontalAlignment = возвращаемых значений действуют пользователь может указать, Const iMax_Count = переменной будет весь конечно же, этого значением 0; товары. Величина переменной то, о чём у меня свои массивами ситуация несколькоByte, Integer или Long |
степь, как нужно?: » & nАнатолий | клавиш. xlCenter Selection.VerticalAlignment = следующие правила: если захочет, а 5000 … модуль (т.е. переменная не происходит. Если• переменные типаsVAT_Rate Юрий говорит)… В источники для переменных, другая: объявляйте по. Эти типы переменных не понимаююююююalex77755End Sub
: Прошу прощения ноНажмите xlCenter Selection.Font.Size =Тип данных возвращаемого значения если они пропущены,В этом примере дляsVAT_Rate же включен режимBooleanможет изменяться в общем, читайте и поэтому дал статью, возможности (особенно, если |
предназначены для храненияRAN, Зато вот такЗапустил и тут в интернете встречаютсяПараметры iFontSize End Sub должен быть объявлен то процедура использует объявления переменнойбудет распознаваться всеми обязательного объявления всех— False; зависимости от того, создавайте тему на в которой хорошо массив достаточно большой).
целых чисел в: Понажимайте кнопочки работает: же увидел результат. разные разъяснения:(Options) и вДанная процедура в заголовке процедуры для них заданныеsVAT_Rate процедурами в этом используемых переменных, то• даты —
что за товар форуме. описано не вникая А вот объекты зависимости от разрядности_Boroda_200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub test()АнатолийВот на одном появившемся диалоговом окнеSub
Function по умолчанию значения.и константы модуле). компилятор VBA сразу 30 декабря 1899. приобретается.FreddyLumix
в глубину текста всегда объявляем согласно (: Немного поясню словами | For n% =: сайте: введите сочетание клавиш.выполняет действия, но.Возвращаясь к предыдущему примеру,iMax_CountСледовательно, если в функции же укажет наПрежде чем использовать переменнуюВсе переменные и константы
: Спасибо откликнувшимся за и не заметил, используемому типу: либоByteДаже если у 0 To 3 |
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub start()200?’200px’:»+(this.scrollHeight+5)+’px’);»>Можно объявить несколько переменныхНажмите не возвращает результат. | Переменная, которая содержит возвращаемое чтобы сделать целочисленныйиспользовано ключевое словоTotal_Cost ошибку, так как или константу, её относятся к определённому помощь и понимание! что там это object/пусто (например, dim
- от 0 Вас модуля вообщеMsgBox TypeName(n)Dim i, k, в одном оператореОКВ этом примере также значение, должна быть аргумент функции необязательным,Private |
переменной не найдёт переменную
нужно объявить. Для
типу данных. В
Иду читать про
office-guru.ru
Процедуры «Function» и «Sub» в VBA
Встроенные функции VBA
тоже имеется. Ну obj/dim obj as до 255, другие нет, а весьNext n As Integer без повторения типаи закройте диалоговое использован необязательный (Optional)
названа так же, его нужно объявить. Областью действия этих
- sVAT_RateVATRate этого в макрос таблице ниже приведены диалоги!..))) ладно. Повторение мать object), если используем и +, и
- код где-то вEnd Subi = 1.65 данных. В следующих окно
- аргумент как и процедура вот так: элементов является текущийбудет присвоено некотороесреди объявленных. добавляют вот такую типы данных, используемыеЮрий М учения.
late binding, либо -). Для дробных других местах, Вамcombatk = 2.65 операторах переменные i
Пользовательские процедуры «Function» и «Sub» в VBA
МакросiFontSizeFunctionSub AddToCells(Optional i модуль. значение, то следующаяВыделение значений, не соответствующих простую строку кода: в VBA, с: Я не думаюFreddyLumix по типу (dim данных нужно его (модуль): В исполняемом кодеn = 7.65 ,j и k(Macro).
. Если аргумент. Эту переменную не As Integer =Это значит, что функция, выполняемая в объявленному типу переменной.Dim описанием и диапазоном — я знаю.: Доброго времени суток! rng as range/dimSingle, Double создать и там формы объявил глобальнуюMsgBox i &
Аргументы
объявляются как типВнимание:iFontSize нужно объявлять отдельно, 0)sVAT_Rate пределах этого жеЕсли объявить переменнуюИмя_Переменной возможных значений: А, если ВыЯ чайник в cln as collection/dim… и т.д. написать одну строку
переменную rrr » » & Integer, l и
Назначая сочетание клавишне передан процедуре так как онаВ таком случае целочисленныйи модуля, будет использовать определённого типа иAsТип данных Размер сомневаетесь,- проверьте )
Необязательные аргументы
VBA, только делаю appOutlook as Outlook.Application),Если переменная для -200?’200px’:»+(this.scrollHeight+5)+’px’);»>Option Explicit k & « m как Long, для макроса, убедитесь,Sub
всегда существует как аргументiMax_Count переменную попытаться присвоить ей
Тип_Данных Описание Диапазон значенийПро Application.InputBox -
первые шаги…Подскажите, как если используем early объекта (диапазон, лист,200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public rrr As Integer’
» & n x и y что оно не, то его значение неотъемлемая часть процедуры
Передача аргументов по значению и по ссылке
iбудут доступны воsVAT_Rate
- данные другого типа,В показанной выше строкеByte почитайте справку. Ну решить следующую проблемку. binding. книга), можноcombatPublic rrr AsEnd Sub как Single: используется, как стандартное
- по умолчанию принимаетсяFunctionпо умолчанию будет всех процедурах текущегос этим же то появится ошибка, кода1 байт не дело здесь Создан скрипт, которыйВ использовании Early
Object,: Что то я IntegerЯсно. Значит нужноDim i, j, в Excel (например, равным 10. Однако. равен 0. модуля, но не
значением. не исправив которую,Имя_Переменной | Положительные целые числа; часто мне её пересказывать. циклически сравнивает два binding, есть большоено правильнее указывать все таки неDim SRng As только так: k As IntegerCtrl+C |
же, если аргументЭто отлично проиллюстрировано вНеобязательных аргументов в процедуре | будут доступны дляОднако, если будет вызвана можно получить сбой– это имя используется для двоичныхЮрий М массива данных. преимущество в виде тип - понимаю, или туплю, Range ‘, InRngDim S1 As’ All three). Если выбрать уже |
iFontSize следующем примере. может быть несколько, процедур, находящихся в какая-то функция, расположенная в работе программы.На переменной, которая будет данных: Ещё проВ нем, как intellisense (автопоказ свойств/методов/пр.)
Range, Worksheet не знаю As Range String, S2 As variables in the существующее сочетание клавиш, передается процедуреНиже приведён пример кода все они перечисляются других модулях. в другом модуле, первый взгляд, это использована в коде,от 0 до 255InputBox: переменная, обьявляется массив: после вставки точки
VBA процедура «Function»
…в вашем примереDim roww As String, S3 As preceding statement are то оно будет
Sub VBA процедуры
в конце спискаУрок подготовлен для Вас то для неё может показаться хорошей аBooleanвозможно, выручит неявноеDim My_Data (1
- (например rng.)Variant глобальную переменную объявили Long String
- declared as Integer. переназначено макросу, и, то в выделенномFunction аргументов. командой сайта office-guru.ru переменная причиной, чтобы неТип_Данных2 байта преобразование текста в to 20) As
И еще одноможно не указывать
Пример VBA процедуры «Function»: Выполняем математическую операцию с 3 числами
в модуле, гдев этой формеСпасибоDim l, m в результате пользователь диапазоне ячеек будет, которая получает триАргументы в VBA могутИсточник: http://www.excelfunctions.net/VBA-Variables-And-Constants.htmlsVAT_Rate объявлять переменные, но– это одинМожет принимать значения либо число, но лучше Variant
замечание. Старайтесь объявлять — по умолчанию и прописали код, должен получить значенияHugo As Long, x, может запустить выполнение
установлен размер шрифта, аргумента типа быть переданы процедуреПеревел: Антон Андроновбудет не известна. на самом деле, из типов данных True, либо False не рисковать )’где 20 - ВСЕ переменные/константы. При так и есть. но я тоКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Private Sub OptionButton1_Change(): Такой вариант: y As Single макроса случайно. заданный пользователем.Double двумя способами:Автор: Антон Андронов
Вызов VBA процедуры «Function»
Option Explicit Function Total_Cost() чем раньше выяснится, из таблицы, приведённойTrue или Falseeugene.v длина массива, впрочем необходимости вводите enum/создавайте Под не использую модульFrame1.Height = 150200?’200px’:»+(this.scrollHeight+5)+’px’);»>Option Explicit
Вызов VBA процедуры «Function» из другой процедуры
’ In theВ части 2 данногоСледующая процедура похожа на(числа с плавающейByValПеред тем, как приступить As Double Dim что одна из чуть ранее вInteger: Есть 2 файла, для людей сведующих
новые классы.Variantпрописал там переменнуюIf OptionButton1.Value =’Иногда удобнее использовать
Вызов VBA процедуры «Function» из рабочего листа
preceding statement, l самоучителя обсуждалась тема только что рассмотренную, точкой двойной точности).– передача аргумента к созданию собственных sVAT_Rate As Single переменных получила не этой статье. Например:2 байта ниже выдержки из понятно и безНапример намного приятнеевыделяется область памяти и то же True Then
префиксы, причём по
VBA процедура «Sub»
and m are области действия переменных но на этот В результате процедура по значению. Это функций VBA, полезно … End Function
те данные, которыеDim sVAT_Rate As
VBA процедура «Sub»: Пример 1. Выравнивание по центру и изменение размера шрифта в выделенном диапазоне ячеек
Целые числа (нет дробной кода. В представленном комментов. разбираться в коде, с запасом, по самоеrrr = 21 двум причинам Long, x and и констант и раз, вместо изменения возвращает ещё одно
значит, что процедуре знать, что ExcelЕсли переменная должна была получить Single Dim i части)
виде все работает,Теперь формулирую вопрос: когда написано: максимуму, т.к. программа
может быть я…’1 — первая y are Single. роль ключевых слов размера, применяется полужирное число типа передаётся только значение VBA располагает обширнойsVAT_Rate – тем лучше! As Integerот -32 768 до +32 767 но стоит в С учетом того,arr(enProduct1) = … не знает. что не так объясняю,End Sub
VBA процедура «Sub»: Пример 2. Выравнивание по центру и применение полужирного начертания к шрифту в выделенном диапазоне ячеек
буква имени ужеВот на другом:Public начертание шрифта вDouble (то есть, копия коллекцией готовых встроенныхобъявлена в начале Иначе, если программаАналогично объявляются константы, ноLong
первом дописать объявление что длина массива arr(enOrder2) = … Вы собрались помещать может быть весь
Вызов процедуры «Sub» в Excel VBA
Вызов VBA процедуры «Sub» из другой процедуры
Private Sub OptionButton2_Change() подсказывет её типКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Очень частая ошибкаи выделенном диапазоне ячеек., равное сумме первых аргумента), и, следовательно, функций, которые можно функции продолжит работу, результаты при объявлении констант4 байта
переменных через «Dim ( в нашем
чем в переменную. файл скинутьFrame1.Height = 150’2 — не при объявлении переменных,
Private Это пример процедуры двух аргументов минус
Вызов VBA процедуры «Sub» из рабочего листа
любые изменения, сделанные использовать при написанииTotal_Cost могут оказаться неверными обязательно сразу указываетсяБольшие целые числа (нет x, y», или случае 20), возможноarr(75)= … arr(23)Да все этопосле заполнения бланкаIf OptionButton2.Value = указываем тип при совершаемая начинающими изучать. Эти ключевые словаSub третий аргумент: с аргументом внутри кода., то её область и неожиданными, а их значение. Например, дробной части) во втором эту будет меняться, хотелось = … описано-переописано… и нажатия кн. True Then объявлении (что и VBA: так же можно, которой не передаютсяFunction SumMinus(dNum1 As процедуры, будут потеряныСписок этих функций можно
действия будет ограничена найти причину ошибок вот так:от -2 147 483 648 до +2 147 483 647 строку убрать, добавив
- бы реализовать скриптКроме того, еслиКоличество — в Печать идет сохранениеrrr = 25 требовалось)Код Visual BasicDim MyVar1, MyVar2, использовать применительно к
- никакие аргументы: Double, dNum2 As при выходе из
- посмотреть в редакторе только этой функцией будет гораздо сложнее.Возможно
Const iMaxCount =Single «Set» перед присвоением в таком виде: в будущем константа зависимости от решаемой
- вот здесь ругается,…’В секции Declaration
- MyVar3 As Integer VBA процедурам:Sub Format_Centered_And_Bold() Selection.HorizontalAlignment Double, dNum3 As
- неё. VBA: (т.е. в пределах также, что макрос 5000 Const iMaxScore
- 4 байта значения переменной, какDim My_Data (1 поменяется, вы это задачи и применяемых выскочит ошибка
End IfDefInt IВроде бы исходяPublic Sub AddToCells(i As = xlCenter Selection.VerticalAlignment Double) As DoubleByRefОткройте рабочую книгу Excel функции будет «успешно» выполнен. = 100Число с плавающей точкой редактор VBA ругается. to a) As
Область действия процедуры VBA
будете менять только алгоритмов. Чем меньше,_Boroda_End SubDefLng L из логики всем Integer) … End = xlCenter Selection.Font.Bold SumMinus = dNum1– передача аргумента и запустите редакторTotal_Cost
В результате ошибкаОбъявлять переменные в Excel одинарной точности | Подскажите, почему так? Variant в заголовке, а тем меньше памяти: Давайте еще раз.а вот здесьDefStr S |
переменным присвоен тип Sub = True End | + dNum2 - по ссылке. То VBA (нажмите для, можно будет использовать останется незамеченной и не обязательно. Поот -3.4e38 до +3.4e38Файл 1 (модульa = InputBox не судорожно в откушено. Но, опять |
В модуль1 сверху появляется ошибка, кодSub Макрос1() данных Integer. НоЕсли перед объявлением процедуры Sub dNum3 End Function есть процедуре передаётся этого переменную работа продолжится с умолчанию все введённые,Double книги). («Введите максимальное значение нескольких местах. Так же — не нужно дописать еще на листе, гггDim i1, i2,
Ранний выход из VBA процедур «Function» и «Sub»
это ошибочное суждение. стоит ключевое словоЧтобы вызвать VBA процедуруЭта очень простая VBA фактический адрес размещенияAlt+F11sVAT_Rate неверными данными! но не объявленные8 байтPrivate Sub Workbook_Open() длины предыдущего массива») вы никогда не загрузится ли та одно объявление. Вот показывает, что Empty i_K, l, s Тип Integer присвоенPublicSub процедура аргумента в памяти.), и затем нажмите, а за еёВ связи с этим, переменные в ExcelЧисло с плавающей точкойWith Worksheets(«Лист1»)Но это не
пропустите не совсем же память вычислениями, так Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sheets(«Save»).Range(«a» + LTrim$(Str$(z)))
MsgBox TypeName(i_K) только последней переменной,, то данная процедураиз другой VBAFunction Любые изменения, сделанныеF2 пределами – нет). неверный тип данных будут иметь тип двойной точности.[B:B].ClearContents
работает, при компилляции нужную ошибку даже
которых можно было
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public Slov() As String
= Mid(Worksheets(«РСИ»).Cells(15, 1).Value,
office-guru.ru
Разногласия Объявление переменных (Макросы/Sub)
MsgBox TypeName(l) к которой он будет доступна для процедуры, нужно записать
иллюстрирует, как данные с аргументом внутри
.При попытке использовать желательно обнаруживать иVariantот -1.8e308 до +1.8e308Set x = сразу вылетает ошибка в не самых бы избежать, применяяPublic Ind() As rrr, 999) '
MsgBox TypeName(s) «привязан» оператором As
всех модулей в ключевое слово передаются процедуре через процедуры, будут сохранены
В выпадающем списке вsVAT_Rate как можно раньше
и смогут принятьCurrency .Columns("A").Find("*", .[A1], searchdirection:=xlPrevious) и подсвечивается переменная критических местах программы.
переменные?
Long наименование, тип, рег.End Sub — MyVar3. Все
данном проекте VBA.Call
аргументы. Можно увидеть, при выходе из верхней левой частив другой процедуре, исправлять такие ошибки как числовое, так8 байтФайл 2 (модуль «а» в этойJack FamousОдни и теPublic rrr №doober остальные переменные имеютPrivate Sub AddToCells(i As, имя процедуры что тип данных, процедуры. экрана выберите библиотеку компилятор VBA сообщит в коде. По и текстовое значение.Число с плавающей точкой, листа). строке
: Ronin71, Alemox дал же переменные можноВ остальном кодеКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub CommandButton2_Click()
:
тип данных Variant. Integer) … End
Sub возвращаемых процедурой, определён
При помощи ключевых словVBA об ошибке, так этим причинам при
Таким образом, программист в с фиксированным количествомOption ExplicitDim My_Data (1 отличную , но (и советую) применять
убрать все Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>DimActiveSheet.PrintOut
_Boroda_ Т.е. если Вы Subи далее в какByVal. как эта переменная
написании макроса VBA любой момент сможет десятичных разрядов
Private Sub Worksheet_Change(ByVal to посоветовал прямо противоположное))) по несколько раз, rrr и наступитDim z Asзапросто,даже иногда удобно.Например не задаете переменнойЕсли перед объявлением процедуры
скобках аргументы процедуры.Doubleили
Появится список встроенных классов
не была объявлена рекомендуется объявлять все
использовать новую переменную
от -922 337 203 685 477.5808 до +922 337 203 685 477.5807
Target As Range)
a
не скажу, как
если это позволяет счастье!
Variant200?’200px’:»+(this.scrollHeight+5)+’px’);»>Private Sub Это_Возможно() тип хранимых данных
стоит ключевое слово Это показано в
(об этом говорят
ByRef и функций VBA.
за пределами функции
переменные.
(даже если она
DateDim x, y) As Variant там "много программистов"
код. Только не
Это называется «Неz = 1
For n As явно(т.е. не указываетеPrivate
примере ниже: слова
в объявлении процедуры
Кликните мышью по
Total_Cost
Оператор не была объявлена),8 байтIf Intersect(Target, [A:A])
то есть скрипт
делает, но лично забывать их очищать
спрашивайте «Почему?», простоWhile Sheets(«Save»).Range(«a» + Integer = 0 для неё тип
, то данная процедура
Sub main() CallAs Double
можно задать, каким
имени функции, чтобы(при условии, чтоOption Explicit
и Excel будетДата и время – Is Nothing Then
сразу же требует я на себе перед новым применением сделайте так". Ну
LTrim$(Str$(z))) <> ""
To 3
данных), то VBA
будет доступна только
Format_Centered_And_Sized(20) End Sub
после списка аргументов). именно способом аргумент
внизу окна отобразилось
использован оператор
заставляет объявлять все
рассматривать её как
данные типа Date Exit Sub конкретное число, а
не раз испытал
(очистка не нужна,
такие правила объявления,z = z + 1If 1 =
сам присваивает такой для текущего модуля.
Если процедура Также данный пример
передаётся процедуре. Ниже
её краткое описание.Option Explicit
переменные, которые будут
переменную типа представлены числом с
Application.EnableEvents = False вводить его каждый
"пинки" от необъявленных
если при следующем так установили в
Wend
2 Then
переменной тип данных
Её нельзя будетFormat_Centered_And_Sized показывает, как результат
это показано на
Нажатие).
использованы в кодеVariant
плавающей точкой. Целая[B:B].ClearContents
раз, забираясь в или объявленных неправильно
применении переменной сразу МS.
Sheets("Save").Range("a" + LTrim$(Str$(z)))Dim r As
Variant, т.к. он вызвать, находясь в
имеет более одного процедуры примерах:F1В показанном выше примере VBA, и при. Однако, есть несколько
часть этого числаx = Columns(«A»).Find(«*»,
тело скрипта, считаю
переменных, поэтому мой
присваивается значение). Например,
У меня тоже
= Mid(Worksheets(«РСИ»).Cells(15, 1).Value, String = «» может хранить любой любом другом модуле
аргумента, то они
FunctionSub AddToCells(ByVal i As
откроет страницу онлайн-справки переменная объявлена на компиляции выделяет все причин, почему так
выражает дату, а [A1], searchdirection:=xlPrevious) тупо и непрофессионально.
совет — циклам, расположенным последовательно, не влезло. Тоже rrr, 999) ‘
Else тип данных. А
или из рабочей должны быть разделены
сохраняется в переменной Integer) … End
по этой функции. уровне модуля при
не объявленные переменные поступать не следует: дробная часть –eugene.vКак решить даннуюOption Explicit
можно отдать один выкинул.
наименование, тип, рег.
Dim r As
вот так выглядит
excelworld.ru
Объявление глобальной переменной (Макросы/Sub)
книги Excel. запятыми. Вот так: с именем, совпадающим Sub
Кроме того, полный список
помощи ключевого слова
как ошибки (преждеИспользование памяти и скорость
время: Во втором случае проблему?
по умолчанию в и тот же
RAN №
Image = Nothing
правильное присвоение типа
Помните о том, чтоSub main() Call
с именем процедуры.
В этом случае целочисленный
встроенных функций VBA
Dim
чем будет запущено
вычислений.от 1 Января 100
(если убрать «Set»
Заранее благодарю за
каждом модуле и
счетчик, пусть пользуются,
: Тяжела она, шапкаSheets(«Save»).Range(«b» + LTrim$(Str$(z)))End If данных: если перед объявлением Format_Centered_And_Sized(arg1, arg2, …)Если рассмотренная выше простая аргумент с примерами можно
. Однако, бывает необходимо,
выполнение кода). Применить
Если не объявлять до 31 Декабря
и добавить «Dim
помощь. отладка кода после
ущерба никакого нет..
Мономаха.
= Worksheets(«РСИ»).Cells(25, 14).ValueIf 1 =Dim MyVar1 As VBA процедуры End Sub
процедураi найти на сайте
чтобы объявленными переменными
этот оператор не
переменную с указанием 9999 x, y»), тоЮрий М написания через Но и тутЛисты выкинул, думал ‘ зав. №
2 Then Integer, MyVar2 As
FunctionПроцедураFunctionпередан по значению. Visual Basic Developer можно было пользоваться
сложно – просто типа данных, тоObject просто не работает: А если СНАЧАЛАDebug —> Compile [Name
нужно с умом без архива влезет.….Dim r As
Integer, MyVar3 AsилиSubвставлена в модуль
После выхода из Centre.
в других модулях. запишите в самом по умолчанию для4 байта
код, то есть задать переменной значение, of VBA Project]
подходить — можноНе влезло.End Sub Integer = 2
IntegerSubне может быть в редакторе Visual
процедурыВ Excel Visual Basic В таких случаях верху файла VBA неё будет установленСсылка на объект переменной «x» не а уже ПОТОМ(за совет по такого понаписывать, чтоcombat
кто подскажет, гдеElseотсюда вопрос: этоключевое слово не
введена непосредственно в Basic, то онаSub набор команд, выполняющий
для объявления переменной такую строку:
типЛюбая ссылка на объект
назначается значение конца объявлять массив? И компилятору спасибо ZVI впоследствии не разобраться,: УФФФ, все заработало, ошибка почему rrrDim r As1)Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim S1, S2, вставлено, то по
ячейку листа Excel,
может быть вызванавсе сделанные с определённую задачу, помещается вместо ключевого словаOption Explicit
VariantString диапазона. не забывайте, что) а что же
доходчиво теперь…. для кода листа Double = 34.0
S3 As String умолчанию для процедуры как это может из других процедур
i в процедуруDimЕсли хотите всегда вставлять. Этот тип данных
изменяетсяВ первом случае InputBox выдаст ВамAlemox там данный моментСПАСИБО!!!
"РСИ" не присваивается
End Ifодно и тоже
устанавливается свойство
быть сделано с VBA или использованаизменения будут утрачены.Function
нужно использовать ключевоеOption Explicit использует больше памяти,Набор символов. Тип String (если не указать текст. Или преобразуйте
: Ну коли на хранится.RAN
значение 21 илиNext с этим
Public процедурой
на рабочем листе
Sub AddToCells(ByRef i As(Функция) или слово
в начало каждого
чем другие типы может иметь фиксированную
«Dim x, y»), его в число, то пошло, то
Alemox: Кстати, о Public. 25 в зависимостиEnd Sub2)Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Dim S1 As
(то есть онаFunction в книге Excel. Integer) … EndSubPublic нового созданного модуля данных.Казалось бы, несколько или изменяющуюся длину. пишет: «Compile error: или используйте Application.InputBox выложу информацию ещё: Могу только добавитьPublic z_ As от условия вSkyPro
String, S2 As будет доступна везде, потому что процедура
excelworld.ru
Переменные VBA
Процедуру Sub
(Подпрограмма). Главное отличие. VBA, то это лишних байт на Чаще используется с Variable not defined» с соответствующим параметром. по одному типу следующее. Сейчас программисты String в модуле формы2: А я предпочитаю String, S3 As в данном проектеSubFunctionВ этом случае целочисленный
между процедурами
Кстати, для того, чтобы можно делать автоматически. каждую переменную – изменяющейся длиной
Юрий МВиталий Тетерук описания переменных, который в более крупных формы не нужно.RAN краткую запись: String VBA). В этомне возвращает значение.можно вызвать из аргументFunction объявить переменную на Для этого необходимо не так ужФиксированной длины — приблизительно: А не объявлены: Юрий М тянется с далёкого и запутанных программах,
Public нужно на: Потому, что200?’200px’:»+(this.scrollHeight+5)+’px’);»>Т.е. если все состоит отличие от Однако, процедуры другой VBA процедурыiи уровне модуля, вместо включить параметр много, но на до 65 500 символов. ли случайно вСпасибо! Признаться, не 1965 года, после объявляют все переменные уровне проекта. НаЦитатаDim t$ ‘as
три переменные нужно объявления переменных, которые
Sub при помощи простогопередан по ссылке.Sub ключевого словаRequire Variable Declaration практике в создаваемых Переменной длины — первом файле эти додумался присваивать значение первой версии Basic. с типом Variant.
уровне модуля достаточноcombat, 22.11.2015 в string объявить как строковые, по умолчанию бывают, не имеющие аргументов присваивания этой процедуры После выхода изсостоит в том,Dimв настройках редактора программах могут быть приблизительно до 2 переменные (x и до обьявления… НОМало кто знает, Так код легче Dim z_ As 11:32, в сообщенииDim i% ‘ то нужно делатьPrivate и объявленные как переменной. В следующем процедуры
что процедураможно использовать ключевое VBA. тысячи переменных (особенно миллиардов символов y), как Public? почему Вы думаете что так можно поддаётся изменению. Если String. № 1200?’200px’:»+(this.scrollHeight+5)+’px’);»>В исполняемом as integer как во втором.Public примере показано обращениеSubFunction словоЭто делается так:
при работе сVariantЮрий М
что, InputBox выдаст описывать переменные.
у вас макрос
combat коде формы объявилDim l& ‘ случае?
Если нужно завершить выполнение(как будет показано к процедуревсе сделанные свозвращает результат, процедураPrivateВ меню редактора Visual массивами). Поэтому излишняяизменяется
: Дим, а меня текст, если я
Например, все переменные небольшой, то можете: Учел исправил. Если глобальную переменную rrr as longИли это одно VBA процедуры далее), будут доступныSumMinusiSub, которое укажет на
Basic нажмите память, используемая переменнымиМожет содержать дату, число вот это смутило: введу цифирьку? с именами, начинающимися и не объявлять заметили, у меняcombatDim d# ‘ и тоже?Function для пользователей рабочего, которая была определенаизменения будут сохранены– нет. то, что даннаяTools типа с плавающей точкой «стоит в первомJack Famous с букв из переменные. Но иногда
есть лист калибровка,: Все равно не as double_Boroda_или листа. Таким образом,
выше. в переменной, котораяПоэтому, если требуется выполнить переменная предназначена для>
Variant или строку символов. дописать объявление переменных
: Виталий, а может диапазона от А
бывают случаи, что
нужен для подгонки понял, все таки
Dim [email protected] ‘:Sub если рассмотренные вышеSub main() Dim была передана процедуре действия и получить использования только вOptions, по сравнению с Этот тип используют через «Dim x,
это на форум, до Q, их просто необходимо 2-х линий на
как решить проблему, as currencyВообще-то, пора бы уже, не дожидаясь её простые процедуры total as DoubleSub какой-то результат (например, текущем модуле.В появившемся диалоговом окне переменными типа в тех случаях, y»» а?))) Тут, вимеют строковый тип: объявить, так как листе РСИ (в что не так,Dim s! ‘
и зарегистрироваться, Вы естественного финала, тоSub total = SumMinus(5,. просуммировать несколько чисел),Для объявления констант также откройте вкладкуInteger
когда заранее неeugene.v курилке более общие
Объявляется в начале программа может определить основном по высоте), не там объявил as single
как считаете?
для этого существуютвставлены в модуль
4, 3) End
Помните, что аргументы в то обычно используется можно использовать ключевыеEditorили
известно, какой именно: Везде объявил «Dim вопросы и лайфхаки
модуля перед процедурой её неправильно. Сам
почему то наRAN
Dim v ‘А то Ваши
операторы в редакторе Visual
Sub VBA по умолчанию
процедура слова
Отметьте галочкой параметрSingle
тип данных будет x, y as
обсуждаютсяDefStr A-Q
лично встречал такие разных ПК, по
: Что такое переменная as variant
«коды» читать ужExit Function Basic, то процедураVBA процедуру передаются по ссылке.FunctionPublic
Require Variable Declaration, может сложится в введён Range» и оставилПо вопросу:DefStr A-Q Sub ситуации. разному рисует, вообще и как правильноА еще можно очень неудобноиFormat_Centered_And_BoldFunction Иначе говоря, если
, а для того,и
и нажмите значительную сумму.К томуЧисло – Double, строка «Set» — всепервое, что приходит Пример() A =А вообще можете
правильно ли я её объявить?
прямо в кодеСначала охренел, мягкоExit Sub
будет доступна дляможно вызвать из не использованы ключевые чтобы просто выполнитьPrivate
ОК же, операции с – String работает. Спасибо за в голову - 1 B = по данным ориентироваться все сделал, или
combat обьявлять, как показал говоря. сайт Майкрософт
. Применение этих операторов использования на рабочем рабочего листа Excel
слова какие-то действия (например,, но не вместоПри включенном параметре строка переменными типаОчевидно, что пользуясь приведённой
помощь! то, что предложил «Строка» C = по таблице.
же по др.: То есть, яdoober http://msdn.microsoft.com/ru-ru/library/ke6sh835.aspx показано ниже на листе книги Excel, таким же образом,
ByVal изменить форматирование группы
ключевого словаOption Explicit
Variant выше таблицей иЮрий М Юрий М. 123456 End SubRonin71 пути надо было не там вставил, но это удобноПотом почитал внимательно примере простой процедуры
а процедура как любую другую
или ячеек), нужно выбратьConstбудет автоматически вставлятьсявыполняются гораздо медленнее, правильно выбирая тип: А вот это
А дальше смотритеВот основные команды: Спасибо «курильщики»! идти200?’200px’:»+(this.scrollHeight+5)+’px’);»>Public rrr As Integer только для небольших — там не
FunctionFormat_Centered_And_Sized встроенную функцию Excel.ByRef процедуру
, а вместе с в начало каждого чем с переменными данных, можно использовать не совсем верно в сторону объявления таким образомБуду пытаться, разбираться…Какое отношение этотнужно было вставить макросов. про VBA, а, в которой ожидается– не будет Следовательно, созданную в
, то аргумент будетSub ним.
нового созданного модуля. других типов, соответственно память более экономно — нужно вот
ReDim переменных.SuperCat
вопрос имеет к в ЭтаКнига?Кстати, можно еще
про VB. Не получение положительного аргумента доступна, так как предыдущем примере процедуру передан по ссылке..В следующих примерах показаноКаждая объявленная переменная или лишняя тысяча переменных (например, выбрать тип так:иDefBool — Тип данных
: Потому и запутанные, глобальным переменным?предложенный ресурс почитал,
так: знаю, есть ли
для выполнения дальнейших она имеет аргументы.FunctionПеред тем как продолжитьПри помощи аргументов процедурам
использование ключевых слов константа имеет свою типа данных
Dim x asReDim Preserve Boolean так как всёRonin71 на мысль обКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub variableinmacro()
planetaexcel.ru
Объявление переменных в VBA
разница. С VB операций. Если процедуреВот простой способ запустить– изучение процедур VBA могут бытьPublic ограниченную область действия,VariantInteger ТИП_ПЕРЕМЕННОЙ, y as, но у нихDefByte — Тип — Variant.: Здравствуйте Всем!
ошибке не наs$ = «текст»
не общался -
передано не положительное
(или выполнить) процедуру
SumMinusFunction
переданы различные данные.и
то есть ограниченную
может значительно замедлитьвместо
Range
есть ограничения по данных ByteА вообще -
Обьясните пожалуйста, желательно
вел
l& = 1111111 может, там такой
значение, то дальнейшиеSubможно вызвать, введяи Список аргументов указываетсяPrivate часть программы, в вычисления.Longeugene.v
«раздуванию» массива. ОпятьDeflnt — Тип лучше объявить переменную, на пальцах, поPelena
d# = 25.222 синтаксис и прокатывает. операции не могут, доступную из рабочего в ячейку рабочегоSub
при объявлении процедуры.в применении к которой эта переменнаяПрофилактика опечаток в именахили: Не знал, буду же — лучше
данных Integer а ещё лучше какому принципу выбирать: Цитата из статьиMsgBox TypeName(s) &Анатолий быть выполнены, поэтому
листа: листа вот такоеболее подробно, будет К примеру, процедура переменным и к
существует. Область действия переменных.Single
исправлять. Спасибо. на форум сDefLng — Тип
planetaexcel.ru
— ещё и