Аннотация: Лекция посвящена описанию основных конструкций и принципов VBA. Она является вводной лекцией по общим приемам программирования на VBA.
5.1. Синтаксические описания
Синтаксис языка программирования — это правила написания программ.
Рассмотрим пример — возьмем из справочной системы описание команды. Мы пока не будем вдаваться в смысл ключевых слов (перед нами — описание оператора цикла), приведенных здесь, остановимся на основных частях описания.
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]
В синтаксических описаниях VBA жирным шрифтом выделены ключевые слова языка, курсивом даны названия переменных и других элементов языка. В квадратных скобках располагаются необязательные элементы – то есть такие элементы, без описания которых можно обойтись. Например, в приведенном описании блоки [statements] будут содержать в себе «полезную нагрузку» цикла – операторы, которые будут выполняться многократно, однако цикл будет работать и без них.
Элементы, которые допускают альтернативный выбор, разделяются знаком » | «. Например, такая запись: » one | two » обозначает «one или two».
Ниже мы будем останавливаться на существенно важных особенностях тех или иных конструкций. Если вам понадобятся подробности — вы сможете найти их в справке к VBA.
Теперь рассмотрим понятие переменной — важнейшее понятие в любом языке программирования.
5.2. Переменные
05-01-Переменная.docm — пример к п. 5.2.
Переменная — это именованная область памяти, где могут храниться различные данные, которые можно изменять во время выполнения программы. Переменные — это одна из основ любой программы. В них можно сохранять введенную пользователем информацию, их можно использовать для накопления данных, обработанных в программе и так далее. Если бы не было переменных — программирования не существовало бы.
У переменной есть несколько важнейших характеристик. Первая — имя переменной. Используя имя, мы можем обращаться к переменной в программе. Вторая характеристика — это тип данных, которые могут храниться в переменной. Тип определяет характер данных, которые мы можем хранить в переменной. Например, это могут быть числовые данные (возраст пользователя) и строковые данные (имя пользователя).
О типах мы поговорим ниже, а пока займемся именами переменных. Давая переменным имена, следует придерживаться следующих правил.
- Имя переменной должно состоять из букв и цифр, причем оно должно начинаться с буквы.
- Имя не может быть длиннее 255 символов
- Имя не должно содержать специальных знаков ( #, $, % и т.д.) и пробелов.
- В качестве имен нельзя использовать зарезервированные слова VBA (например – if, dim, for и т.д.).
При именовании переменных старайтесь пользоваться латинскими буквами. Иначе возможны проблемы при работе ваших программ на различных версиях Office.
Например, такие имена переменных выглядят вполне корректно: str_Name, num_Age, str_Name1, num_Item2 и т.д. Обратите внимание на префиксы, которыми мы снабдили имена переменных. Это признак особого стиля именования переменных. Он очень напоминает стиль именования элементов управления, который мы рассматривали выше.
Напишем программу на VBA, иллюстрирующую простой пример работы с переменными. Сначала она должна задать пользователю вопрос: «Как вас зовут», а потом — вывести его имя в окне сообщения.
Для этого добавим в документ Microsoft Word кнопку с именем cmd_Variables и надписью «Имя пользователя«. Зададим ее обработчику Click следующий код (листинг 5.1.):
txt_Name = InputBox("Введите ваше имя") MsgBox (txt_Name)
Листинг
5.1.
Код обработчика Click кнопки cmd_Variables
Первая строка этого кода содержит новую для вас функцию InputBox. Она используется для вывода окна с сообщением и полем для ввода данных. Строка, которая передается функции в качестве параметра — это и есть сообщение, которое будет выведено в окне.
На рис. 5.1. вы можете видеть это окно.
Рис.
5.1.
Окно ввода данных
Выражение txt_Name = означает, что мы присваиваем переменной с именем txt_Name то, что пользователь введет в окне ввода данных, как бы говорим программе: «Сохрани в переменной txt_Name то, что пользователь введет в окне». Когда пользователь сообщает свое имя и нажимает OK —введенная им строка записывается в переменную txt_Name. Введем на приглашение программы имя «Александр», вы можете ввести любое другое имя.
Теперь мы можем выполнять много разных действий с этой переменной. В частности — использовать в качестве параметра, передаваемого функции MsgBox. В данном примере мы так и поступили — вызвали MsgBox, указав вместо выводимого текста имя переменной. В результате в окне сообщения вывелось имя пользователя, введенное на предыдущем этапе (рис. 5.2.).
Рис.
5.2.
Имя пользователя в окне сообщения
Обратите внимание на то, что мы не заключили имя переменной в кавычки. Иначе в окне сообщения вывелось бы лишь имя переменной ( txt_Name ), но не хранимый в ней текст.
5.3. Типы данных в VBA
Тип данных определяет важнейшие свойства переменной. А именно, следующее:
- что может храниться в переменной (текст, число, некоторые другие виды данных);
- размер памяти, необходимый для хранения переменной (измеряется в байтах);
- операции, которые можно производить с переменной (например, невозможно извлечь квадратный корень из слова «Привет» так как эта операция не определена для строковых данных);
Вы уже можете предположить как минимум два типа данных, которые могут хранить переменные — строковые и числовые. На самом деле список типов данных VBA гораздо обширнее.
В табл. 5.1. вы найдете информацию об основных типах данных VBA.
Тип данных | Размер, байт | Описание | Диапазон значений |
---|---|---|---|
Variant | 16 (числа) 22+длина строки (строки) |
Может хранить данные любых типов | |
Integer | 2 | Целое число | от -32768 до 32767 |
Long | 4 | Длинное целое | от -2147483648 до 2147483647 |
Single | 4 | Число с плавающей запятой | Для отрицательных: от -3.402823E38 до -1.401298E-45 Для положительных: от 1.401298E-45 до 3.402823E38 |
Double | 8 | Число с плавающей запятой двойной точности, для отрицательных значений и для положительных | Для отрицательных от -1.79769313486231E308 до -4.94065645841247E-324 Для положительных: от 4.94065645841247E-324 до 1.79769313486232E308 |
Byte | 1 | Байт | от 0 до 255 |
Currency | 8 | Денежный формат | от -922,337,203,685,477.5808 до 922,337,203,685,477.5807 |
Decimal | 14 | Масштабируемое целое | 29-значное число с 28 знаками справа от запятой |
Boolean | 2 | Логический | True или False |
Date | 8 | Дата и время | от 1 января 1900 г. до 31 декабря 9999 г. |
Object | 4 | Ссылка на объект | Различные виды объектов |
String | Зависит от длины строки | Строка |
Как видите, в VBA существует немало типов данных. Наверное, сейчас вам кажется, что их слишком много. Может показаться, что нет ничего удобнее типа данных Variant. Однако надо учесть, что за универсальность типа Variant приходится платить производительностью и системными ресурсами. Чем больше места требуется для хранения переменной — тем ниже скорость работы с ней.
Если вы хотите, чтобы ваши программы работали как можно быстрее — выбирайте типы данных, которые используют для хранения вашей информации минимум системных ресурсов. Если вы сомневаетесь, хватит ли размерности выбранного типа данных для решения ваших задач — возьмите более емкий тип.
Как правило, для работы с дробными числами и различных вычислений используют тип данных Double. Для переменных, которые используются в циклах, счетчиках — Integer или Long. В работе со строками используют String. Объектные переменные имеют самые разные типы, которые определяются объектами, для обращения к которым они создаются. В небольших проектах вполне оправдано использование переменных типа Variant – это не слишком замедлит работу. Однако, если размер проекта растет или вы нуждаетесь в ускорении ресурсоемких вычислений – подходите к выбору типов данных ответственно.
Если при объявлении переменной не указывать ее тип — он автоматически устанавливается в Variant. Объявляя переменную без указания типа, вы пользуетесь преимуществами работы с объявленными переменными, и, в то же время, можете гибко использовать переменную для хранения различных типов данных (например – чисел с плавающей запятой и целых чисел). Такой подход — объявление переменных без указания типа — допустим при создании небольших проектов, а так же — на начальном этапе работы над достаточно масштабными программами, когда вы не знаете точно, какой тип данных понадобится для той или иной переменной. В листингах, которые вы найдете ниже, мы явно задавали тип переменных лишь тогда, когда это либо требовалось по ходу выполнения примера (например – типы объектных переменных ), либо, когда это нужно для лучшего понимания материала (числовой тип для возраста, строковой — для имени и т.д.) В основном же мы использовали переменные типа Variant.
Выше мы уже говорили о венгерской нотации как о способе именования объектов. Те же правила действуют и для переменных. Префикс имени обычно говорит о типе переменной. В табл. 5.2. приведены некоторые префиксы.
Префикс имени переменной | Пояснения |
---|---|
s, str | Строковая переменная |
n, num |
Числовая переменная (существует множество числовых типов данных, название каждого из которых может быть использовано в качестве префикса, например, int для Integer, dbl для Double и т.д.) |
b, bool | Логическая переменная |
O, obj | Объектная переменная |
Для работы с переменными можно использовать два подхода. При первом мы выбираем имя переменной и используем ее в программе без каких-либо подготовительных действий. Именно так мы работали с переменной в примере к п. 5.2. Такая переменная приобретет тип Variant. Второй подход предусматривает объявление переменных перед использованием.
В данной статье мы познакомимся с типами данных VBA языка. При объявлении переменной можно и не указывать VBA типы данных, в таком случае ей автоматически будет присвоен тип Variant, в этом случае размер данных будет зависеть от хранимых в переменной значений, например, строковые данные, целые, вещественные числа и так далее.
Хотя язык VBA и VBScript происходят из одного семейства, для VBA мы можем явно указывать тип данных с помощью ключевого слова As, а в VBScript такой возможности нет. Так как поддерживаемые VBA типы данных идентичны как для Visual Basic for Applications так и для VBScript, то я решил не повторятся тут с их описанием, просто ознакомьтесь со статьей типы данных VBScript.
VBA позволяет представлять числовые значения в экспоненциальной форме, в некоторых случаях это экономит код. После символа E указывается степень десятичных знаков, например:
- -5.43E2 – тут мы записали число -543 в экспоненциальной форме.
- 3.4Е6 – число 3 400 000
- 5Е9 – число 5 000 000 000
Хорошо, теперь давайте рассмотрим на примерах применение типов данных.
Содержание
- VBA тип данных Date
- Целые типы Byte, Integer и Long
- Числа с плавающей точкой – Single и Double
- Числа с фиксированной точкой – Currency
- Текстовые строки – String
- Логический тип Boolean
- Variant
- Object
VBA тип данных Date
Данный подтип используется для хранения даты и времени, можно использовать как специальный формат, например:
- #30/12/1986# — указываем заданную дату
- #12/30/1996 12:24:00 PM# — указываем дату и время
Или же просто прописать целое число, в этом случаем произойдет автоматическое определение даты. Редактор Visual Basic автоматически может изменять или дополнять вводимые данные, так, если мы указали время (часы и минуты) без секунд, то, произойдет автоматическое добавление секунд.
Создайте новую форму с тремя метками (объект Label) и одной кнопкой (объект CommandButton), в редакторе кода пропишите:
Sub Get_Date() Dim dDate_1 As Date, dDate_2 As Date, dDate_3 As Date dDate_1 = 12345 dDate_2 = #12/30/1986 12:22:00 PM# dDate_3 = #10/5/1999# Label1.Caption = dDate_1 Label2.Caption = dDate_2 Label3.Caption = dDate_3 End Sub Private Sub CommandButton1_Click() Call Get_Date End Sub
Целые типы Byte, Integer и Long
Тут все предельно просто, Byte хранит целые значения от 0 до 255, Integer — от -32 768 до 32 767, а Long — от -2 147 483 648 до 2 147 483 647. Обратите внимание, что типы являются вложенными, то есть, Long охватывает Byte и Integer, Integer охватывает тип Long. Дело не только в диапазоне допустимых значений, но и в памяти, теоретически, данные типа Byte будут занимать 1 байт, Integer – 2 байта и Long – 4 байта памяти, но все зависит от платформы. Да и зацикливаться на этом не стоит, так как объем ОЗУ сейчас огромный, а мега программу вы и так не создадите, используя макросы.
Числа с плавающей точкой – Single и Double
Числа с плавающей точкой являются вещественными и могут содержать любое количество цифр до или после запятой.
Числа с фиксированной точкой – Currency
Это тоже вещественные значения, но, число цифр после запятой является фиксированным и составляет 4 знака.
Текстовые строки – String
В языке VBA текстовые строки заключаются в двойные кавычки. Обратите внимание, что тут нет разделения на “строка” – набор символов или “символ” – один символ. Для строк характерна возможность конкатенации (объединения) с помощью оператора &.
Логический тип Boolean
Тип данных VBA Boolean позволяет хранить логическое значение true или false. Стоит помнить, что при попытке отобразить логическое значение, хранящееся в переменной, оно автоматически преобразуется в строку и мы увидим true или false.
Variant
Variant – это универсальный тип, он автоматически назначается переменной, для которой не указан подтип данных, Variant как бы включает в себя все остальные подтипы. Фактически, Variant автоматически приводит присваиваемое значение к нужному типу, но использует больше всего памяти.
В большинстве случаев необходимости зацикливаться на типах данных нет, они являются в большей степени условностью, чем правилом, хотя…. в программировании все должно быть строго и по пунктам.
Object
Данный vba тип данных служит для создания ссылки на объект. С ним придется часто сталкиваться при работе с объектной моделью Microsoft Office, так как там содержится множество классов.
Помимо встроенных VBA типов данных, можно формировать и собственные, для этого служит ключевое слово Type, данный вопрос мы рассмотрим подробно в отдельной статье.
Что бы присвоить переменной 16-ричное значение, то перед ним нужно прописать &H, например, &HFF00. Как правило, 16-ричные значения используются, когда нужно задать код цвета.
In this blog post we explain data types in VBA and provide detailed definitions for when they should be used.
Firstly a word on VBA variable names; a variable may be named anything you wish as long as it conforms to VBA’s naming rules. Variable names must start with a letter, may contain number characters or underscores ( _ ) but that’s it! Punctuation marks are not allowed. Also unlike other languages VBA is case-insensitive! This is important to understand and is demonstrated below.
Finally, there are some keywords that cannot be used as variable names.
Sub Declarations() Dim a as String ‘ a valid variable name Dim b_ as String ‘ a valid variable name Dim _b as String ‘ variable names must start with a letter Dim 2b as String ‘ variable names must start with a letter Dim c1 as String ‘ a valid variable name Dim d12 as String ‘ a valid variable name Dim e_e1 as String ‘ a valid variable name Dim f! as String ‘ punctuation not allowed in variable names Dim g as String ‘ a valid variable name Dim G as String ‘ an invalid variable name. VBA is case- ‘ insensitive, variables also cannot be ‘ declared more than once in a code block Dim aVariableName as String ‘ a valid variable name Dim a_Variable_Name as String ‘ a valid variable name Dim HELLOWORLD as String ‘ a valid variable name Dim dim as String ‘ variable name is invalid as Dim is a keyword End Sub
Boolean – (Yes/No)
A variable of type Boolean is the simplest possible data type available in VBA. It can only be set to 0 or -1. These are often thought of as states and correspond to Access’s Yes/No fields. In VBA you can assign a Boolean variable to True (-1) or False (0) or the numbers indicated in the brackets.
Notice we used capitalised words for True and False, which is because they are VBA keywords and you cannot name a variable a Keyword.
Sub trueOrFalse() Dim foo As Boolean Dim bar As Boolean foo = True ' foo holds the value True bar = False ' bar holds the value False End Sub
Integer
At the beginning of the post we said that we have to tell the computer what type of data to expect before we can work on it. An Integer is another number data type, but its value must be between -32,768 and 32,767, and it must be a whole number, that is to say, it mustn’t contain decimal places. If you or your users try to save a decimal value (eg 2.5) to an integer variable, VBA will round the decimal value up or down to fit into an Integer data-type.
Sub IntegerDataType() Dim foo As Integer Dim bar As Integer Dim oof As Integer foo = 12345 ' foo is assigned the value 12,345 bar = 2.5 ' bar is assigned the value 3 as VBA rounds it up bar = 2.4 ' bar is assigned the value 3 as VBA rounds it down foo = 32768 ' causes an overflow error as 32,768 is too big End Sub
Long
Long is another number type and works just like Integer except it can hold a much larger range; Any number between -2,147,483,648 and +2,147,483,647.
Sub LongDataType() Dim foo As Long foo = 74345 ' foo is a variable assigned the value 74,345 End Sub
Single
Single is the smaller of the two “floating point” data types. Singles can represent any decimal number between -3.4028235E+38 through 1.401298E-45 for negative numbers and 1.401298E-45 through 3.4028235E+38 for positive numbers. Put more simply, the single data type has a decimal point in it.
Sub DoubleDataType() Dim foo As Single Dim bar As Single foo = 1.1 ' foo keeps the .1 decimal part bar = -20.2 ' bar also keep the decimal part foo = foo * bar ' foo equals -22.2200008392334 End Sub
Double
This is a “floating point” number as well and range in value from -1.79769313486231570E+308 through -4.94065645841246544E-324 for negative values and from 4.94065645841246544E-324 through 1.79769313486231570E+308 for positive values.
Sub DoubleDataType() Dim foo As Double Dim bar As Double foo = 1.1 ' foo keeps the .1 decimal part bar = -20.2 ' bar also keep the decimal part foo = foo * bar ' foo equals -22.2200008392334 End Sub
Currency
This data-type is a third “floating-point data” type in disguise. It’s a Single which has been engineered to represent behaviours typical of currencies. In particular it rounds off numbers to four decimal places. See the Figure below:
Sub CurrencyDataType() Dim bar As Single Dim foo As Currency bar = 1.1234567 ' this is the Single foo = bar ' add the Single to the Currency MsgBox bar ' bar contains 1.1234567 MsgBox foo ' foo contains 1.1235. Notice that the 4th digit ' has been rounded up to 5 End Sub
Date
The Date data type is used to perform operations that involve dates AND times. In VBA there are several functions that operate on date variables which perform date and time calculations. It is important to know that date and time operations can be quite complicated and to help ease your burden you can use VBA’s DateTime object which encapsulates a lot of the difficulty of working with dates and time and can make them a little less of a headache to deal with. Date data types are the most complicated of all the data types to work with.
Here are a few operations we can do with date data types.
Sub DateDataTypes() Dim bar As Date Dim foo As Date bar = #11/15/1978# ' bar set to this date but has no time foo = #12/10/2012 11:37:00 PM# ' foo is set to this date and time bar = #1:00:09 AM# ' bar is 1 hour and 9 seconds foo = #9:00:00 PM# ' foo is 9PM foo = foo + bar ' foo is now 22:00:09 MsgBox foo foo = foo - bar ' foo is back to 9PM MsgBox foo End Sub
String
A String is any set of characters that are surrounded by double-quotation marks. For example “dog” is a String that contains three characters. Strings are very important to us as they can contain human language, and in fact contain almost any data we want, even numbers and punctuation marks. Strings are very versatile and you will use them extensively in your code. Often when you ask your users for information you will first store their input in a String before actually using the data provided; in this way Strings are often thought of as a safe data type.
Below are some Figures of Strings in action.
Sub StringDataTypes() Dim bar As String Dim foo As String Dim foobar As String bar = "Hello" ' bar now contains "Hello" foo = "world!" ' foo contains "world!" foobar = bar & " " & foo ' foobar now contains "Hello world!" ' notice that foobar has a +" "+ this means a SPACE character has been ' inserted into the String, without it foobar would contain "Helloworld!" foobar = bar + " " + foo ' This Figure also shows that you can add ' Strings together (but you cannot subtract!) foo = "H" & "E" & "L" & "P" ' foo now contains "HELP" bar = foo & foo ' bar now contains "HELPHELP" End Sub
Confusion
As stated above, when you collect input from a user you will usually collect it into a String. But be careful not to confuse String with Number data types. For example:
Sub Confusion() Dim bar, foo As String Dim foobar As String foo = "12.5" ' user inputs "12.5" bar = "6.3" ' user inputs "6.3" foobar = foo * bar ' we multiple 12.5 and 6.3 Debug.Print foobar ' print the result - 0 ' It's ZERO! ' Remember foo and bar are STRING data types, 'so multiplying foo and bar as above is like 'saying "aaa" * "bbb" = 11 ? It doesn't make sense. 'But we collect data in a String because a String 'can accept all user input, even if they 12 put a 'punctuation mark in there. foo = "12.5.2" ' user made a mistake bar = "ifvgj212m" ' cat walks across the keyboard ' When collecting user input the data held in a String 'can be tested for accuracy and correctness before we 'load it into an Integer. If the user has not entered 'data correctly we ignore or display a useful message 'like "Error"... End Sub
Variant
A variant is a special type which can contain any of the data types mentioned above (along with some others).
When a value is assigned to the variant data type the variable mutates into the type of the data assigned to it, and in some cases VBA can “detect” the type of data being passed and automatically assign a “correct” data type. This is useful for collecting data from users and also for writing procedures and functions for which you want to be able to call with a variable of any type.
Sub VariantDataType() Dim bar As Variant Dim foo As Variant Dim foobar As Variant bar = 1 ' bar is now an Integer foo = "oi!" ' foo is now a String foobar = bar + 1.1 ' foobar is now a Double with the value of 2.1 MsgBox TypeName(bar) ' Integer MsgBox TypeName(foo) ' String MsgBox TypeName(foobar) ' Double End Sub
Related Posts
Variables Variables
Visual Basic for Applications может управлять различными типами данных. Как и в большинстве других систем программирования Visual Basic разделяет обрабатываемые данные на числа, текст, даты и другие типы. Ниже будут приведены описания основных типов данных VBA, а также будет показан объем памяти занимаемый каждым типом и диапазоны значений, которые эти типы могут сохранять.
Типы данных для хранения целых чисел
Для хранения целых чисел используется один из трех численных типов данных.
Byte
Байт — это единица измерения компьютерной и дисковой памяти, состоящая из восьми битов или двоичных разрядов. Обычно один алфавитный символ требует для хранения одного байта памяти.
Тип данных Byte используется для хранения положительных чисел от 0 до 255 и занимает 1 байт памяти.
Integer
Integer — это целое число, число, не имеющее дробной части. Целые числа не содержат десятичного знака, даже если дробная часть равна нулю.
Тип данных Integer используется для хранения чисел от -32768 до 32767 и требует 2-х байтов памяти.
Long
Long — длинное целое число.
Тип данных Long используется для хранения чисел от -2147483648 до 2147483647 и требует 4-х байтов памяти.
Типы данных для хранения дробных чисел
Для хранения чисел, имеющих дробную часть используются типы данных с плавающей и с фиксированной точкой. Числа с плавающей точкой получили свое название вследствие того, что десятичная точка «плавает» в зависимости от того, насколько большое или маленькое значение сохраняется в памяти. VBA имеет два различных типа данных с плавающей точкой и один с фиксированной.
Single
Числа, сохраняемые с использованием типа Single, называют числами одинарной точности.
Тип данных Single используется для хранения отрицательных чисел от -3,402823*1038 до -1,401298*10-45, положительных чисел от 1,401298*10-45 до 3,402823*1038 и требует 4-х байтов памяти.
Double
Числа, сохраняемые с использованием типа Double, называют числами двойной точности.
Тип данных Double используется для хранения отрицательных числел от -1,79769313486232*10308 до -4,94065645841247*10-324, положительных от 4,94065645841247*10-324 до 1,79769313486232*10308 и требует 8-и байтов памяти.
Currency
Тип данных Currency используется для хранения чисел от -922337203685477,5808 до 922337203685477,5807 и требует 8-и байтов памяти.
Этот тип данных используется для хранения чисел с фиксированной точкой, десятичная точка всегда находится в одном и том же положении, справа от десятичной точки всегда имеется только четыре цифры. Числа типа Currency не имеют ошибок округления, используются при «денежных» вычислениях.
Типы данных для хранения дат, текстовых строк и логических значений
Date
Тип данных Date использует 8 байтов памяти для хранения дат и времени.
String
Любые текстовые данные, содержащие буквы алфавита, цифры, знаки пунктуации и различные символы называются строками. Существуют строки переменной и фиксированной длины.
Тип данных String (переменной длины) используется для хранения текста с количеством символов от 0 до 2 миллиардов и требует памяти в размере 10 байт+один байт на один символ.
Тип данных String (фиксированной длины) используется для хранения текста с количеством от 1 до 654000 символов и требует памяти в размере один байт на один символ.
Boolean
Логические значения True и False называют булевыми значениями. Булевы значения получают как результат операций сравнения.
Тип данных Boolean может иметь одно из двух значений True или False и требует 2-х байтов памяти.
Типы данных Variant и Object
Variant
Тип данных Variant — это особый тип данных, который используется для всех переменных с необъявленным явно типом. Не смотря на то, что типы Variant удобны, они требуют большого объема памяти, а математические операции и операции сравнения над данными этого типа выполняются медленнее.
Тип данных Variant может хранить любой тип данных, за исключением типа Object. Диапазон для данных этого типа зависит от фактически сохраняемых данных и требует памяти в размере 16 байт + 1 байт на символ.
Object
Тип данных Object используется для доступа к любому объекту, распознаваемому VBA. Сохраняет адрес объекта и требует 4-х байтов памяти.
Переменные, типы данных и константы
Главное предназначение VB А — обработка данных. Некоторые данные сохраняются в объектах, например, диапазонах рабочих листов. Другие данные хранятся в созданных вами переменных.
Переменная представляет собой именованное место хранения данных в памяти компьютера.
Переменные могут содержать данные разных типов — от простых логических, или булевых, значений ( True или False ) до больших значений с двойной точностью (см. следующий раздел).
Значение присваивается переменной с помощью оператора равенства (подробнее об этом — далее в главе).
VBA поддерживает несколько ограничений в именовании переменных:
- Можно использовать в названиях символы букв, числа и некоторые знаки препинания, но первой в имени переменной всегда должна вводиться буква.
- VBA не различает регистры.
- Нельзя использовать в именах пробелы или точки.
- Чтобы сделать имена переменных удобочитаемыми, используют смешанный регистр (например, InterestKate , а не interestkate ) или вводят символ подчеркивания ( lnterest _ Rate ).
- Специальные символы объявления типов (#, $, %, & или !) не применяются в имени переменной.
- Названия переменных ограничены длиной 254 символов.
- Не допускается применять в качестве названий переменных или процедур зарезервированные слова, т.е. такие слова, которые используются VBA .
Определение типов данных
- Тип данных указывает, в каком виде данные хранятся в памяти: как целые значения, действительные числа, текст н т.п.
- VBA может автоматически типизировать данные, что приводит к медленному выполнению операций и не эффективному использованию памяти.
- При явном объявлении типа данных всех используемых переменных VBA может выполнять дополнительную проверку ошибок на этапе компиляции.
- При явном объявлении типа данных программа работает быстрее и занимает меньше места в оперативной памяти.
- Чтобы обеспечить обязательное объявление всех используемых переменных, необходимо включить строку
Option . Explicit
в качестве первой инструкции в модуле VBA .
В таблице перечислены поддерживаемые в VBA типы данных
Тип данных |
Резервируется байт |
Наименьшее значение |
Наибольшее значение |
Byte |
1 |
0 |
255 |
Boolean |
2 |
False (Ложь) |
True (Истина) |
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,94065645341247Е-324 |
4,94065645841247Е-324 |
1,79769313486232Е308 |
||
Currency |
8 |
-922337203685477,5808 |
922337203685477,5807 |
Decimal |
14 |
+/-79228162514264337593543950335 без десятичных знаков |
+/-7,9228162514264337593543950335 с 28-ью знаками после запятой |
Date |
8 |
1 января 100 года |
31 декабря 9999 года |
Object |
4 |
Любая ссылка на объект |
|
string (переменной длины) |
10 байт + длина строки |
0 |
приблизительно 2 млрд |
string (фиксированной длины) |
Длина строки |
1 |
65400 |
Variant (числа) |
16 |
Любое числовое значение в рамках диапазона типа данных Double |
|
Variant (символы) |
22 байта + длина строки |
0 |
приблизительно 2 млрд |
Пользовательский |
Зависит от типа |
Зависит от элемента |
- Чтобы в тексте программы распознать тип данных переменной или константы можно использовать стандартную приставку (префикс) в нижнем регистре в названии переменной в соответствии с приведенной таблицей.
Префикс |
Тип данных |
b |
Boolean |
i |
Integer |
l |
Long |
s |
Single |
d |
Double |
с |
Currency |
dt |
Date / Time |
str |
String |
obj |
Object |
v |
Variant |
u |
Пользовательский |
Объявление переменных
- Если для переменной, используемой в процедуре VBA , не объявлен тип данных, то, по умолчанию, будет задан тип данных Variant .
- Данные, которые хранятся в Variant , изменяют свой тип, в зависимости от того, какие операции над ними выполняются.
Пример 1 .
Sub VariantDemo ()
MyVar = «123»
MyVar = MyVar / 2
MyVar = «Ответ: » & MyVar
MsgBox MyVar
End Sub
- При обработке типа данных Variant могут возникнуть проблемы.
Пример 2 . Какое сообщение выдаст следующая процедура?
Sub VariantDemo 2()
MyVar = «123»
MyVar = MyVar + MyVar
MyVar = «Ответ: » & MyVar
MsgBox MyVar
End Sub
Функция определения типа данных
Для определения типа данных переменной используется функция VBA TypeName .
Пример 1.
Sub VariantDemo2()
MyVar = «123»
MsgBox TypeName(MyVar)
MyVar = MyVar / 2
MsgBox TypeName(MyVar)
MyVar = «Ответ: » & MyVar
MsgBox TypeName(MyVar)
MsgBox MyVar
End Sub
Тестирование явного объявления типов данных
Чтобы оценить важность определения типа данных, рассмотрим следующую процедуру, в которой выполняются циклические вычисления, а затем отображается общее время выполнения процедуры.
Sub TimeTestU
Dim x As Integer, у As Integer
Dim A As Integer, В As Integer, С As Integer
Dim i As Integer, j As Integer
Dim StartTime As Date, EndTime As Date
‘ Сохранение времени начала вычислений
StartTime = Timer
‘ Выполнение вычислений
х = 0
у = 0
For i = 1 То 5000
For j = 1 То 1000
А = х + у + i
В = у — х — i
С = х — у — i
Next j
Next i
‘ Получение времени окончания вычислений
EndTime = Timer
‘ Отображение общего времени
MsgBox Format(EndTime – StartTime)
End Sub
Задача.
Сравните время выполнения этой программы и время выполнения этой же программы при превращении операторов Dim в комментарии.
Область действия переменных
Область действия переменной определяет, в каких модулях и процедурах она может использоваться. Существуют следующие типы областей действия переменных.
Область действия |
Способ объявления переменной |
Отдельная процедура |
В процедуру включается оператор Dim или static |
Отдельный модуль |
Перед первой процедурой в модуле вводится оператор Dim или private |
Все модули |
Перед первой процедурой в модуле вводится оператор Public |
Локальные переменные
- Локальная переменная — это переменная, объявленная в процедуре.
- Локальные переменные могут использоваться только в процедуре, в которой они объявлены.
- После выполнения процедуры переменная становится невостребованной, поэтому Excel освобождает соответствующую область памяти.
- Если требуется сохранить значение переменной, объявите ее как static .
- Чтобы объявить локальную переменную — вставьте оператор Dim между операторами Sub и End Sub .
- Dim – сокращение от Dimension (Размерность). В старых версиях BASIC этот оператор использовался исключительно для объявления размерности массива.
- Другой способ указания типа данных для переменной : язык VBA позволяет присоединить символ к названию, чтобы указать ее тип данных.
Пример, можно объявить переменную MyVar как целое число, добавив к ее названию символ %: Dim MyVar % - Символы объявления типов данных представлены для большинства типов данных VBA (отсутствующие в таблице типы данных не имеют собственного символа объявления типа).
Тип данных |
Символ объявления типа |
Integer |
% |
Long |
& |
Single |
! |
Double |
# |
Currency |
@ |
String |
S |
• Локальные переменные позволяют экономно использовать память, так как VBA освобождает память, которую они используют, после окончания выполнения процедуры.
Переменные уровня модуля
Иногда необходимо, чтобы переменная была доступна во всех процедурах модуля. В таком случае объявите переменную перед первой процедурой модуля (за пределами процедур или функций).
В приведенном ниже примере оператор Dim — первая инструкция в модуле. Обе процедуры MySub и YourSub имеют доступ к переменной CurrentValue .
Dim CurrentValue As Integer
Sub MySub{)
‘ -[Здесь вводится текст процедуры] —
End SUb
Sub YourSub()
‘-[Здесь вводится текст процедуры] —
End Sub
Значение переменной уровня модуля не изменяется при окончании выполнения процедуры.
Переменные Public
Чтобы сделать переменную доступной во всех процедурах всех модулей VBA в проекте, необходимо объявить переменную на уровне модуля с помощью ключевого слова Public перед первой процедурой модуля, например, так:
Public CurrentRate as Long
Код объявления переменных Public должен вводиться в стандартном модуле VB А, а не в коде модуля листа или формы.
Переменные Static
Переменные Static — особый случай. Они объявляются на уровне процедуры и сохраняют свое значение после окончания процедуры.
Sub MySub()
Static Counter As Integer
‘-[Здесь вводится текст процедуры] –
End Sub
Работа с константами
Константа – именованное значение или строка, которая не меняется при выполнении программы.
Объявление констант
Константы объявляются с помощью оператора Const .
Примеры :
Const NumQuarters as Integer = 4
Const Rate = .0725, Period = 12
Const ModName as String = «Budget Macros»
Public Const AppName as String = «Budget Application»
Во втором примере тип данных не объявлен. Следовательно, указанные две константы имеют тип Variant .
Константы имеют область действия как и переменные.
Область действия |
Способ объявления константы |
Отдельная процедура |
В процедуре или функции |
Отдельный модуль |
Перед первой процедурой в модуле |
Все модули |
Перед первой процедурой в модуле с ключевым словом Public |
При попытке изменить значение константы в процедуре VBA вы получите ошибку.
Использование предопределенных констант
В Excel и VBA существует целый ряд предопределенных констант, которые можно использовать без объявления.
В следующей процедуре для изменения ориентации страницы активного листа на альбомную применена встроенная константа ( xlLandscape ):
Sub SetToLandscape()
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub
Константу xlLandscape можно обнаружить путем записи макроса.
Описание констант можно найти в справочной системе.
Если включен параметр AutoList Members , то можно получить помощь непосредственно при вводе кода. Во многих случаях VBA автоматически перечисляет все константы, присваиваемые определенному свойству.
Управление строками
В VBA представлено два типа строк.
- Строки фиксированной длины объявляются с определенным количеством символов. Максимальная длина строки составляет 65535 символов.
- Строки переменной длины теоретически могут вмещать до 2 млрд. символов.
Память для строки отводится из расчета 1 байт на каждый символ и для хранения заголовка строки.
В следующем примере переменная MyString объявляется как строка с максимальной длиной 50 символов. YourString тоже объявлена как строка, но она имеет переменную
длину:
Dim MyString As String * 50
Dim YourString As String
Работа с датами
Переменная, определенная как Date , занимает 8 байт памяти и может содержать даты в диапазоне от 1 января 100 года до 31 декабря 9999 года.
В VBA дата и время определяются как значения, заключенные между знаками # (см. далее).
Ошибка дат в Excel
В Excel используется неправильное предположение, что 1900 год – високосный.
В ячейке с формулой =ДАТА(1900;2;29) появится значение 29 февраля 1900 года.
Функция DateSerial (190 Q ,2,29) в VBA возвратит 1 марта 1900 года (!).
Операторы присвоения
Оператор присвоения — это инструкция VBA , выполняющая математическое вычисление и присваивающая результат переменной или объекту.
Выражение определяется как комбинация ключевых слов, операторов, переменных и констант. Эта комбинация возвращает в результате строку, число или объект. Выражение может осуществлять вычисление, обрабатывать символы или тестировать данные.
В VBA оператором присвоения выступает знак равенства (=).
Примеры использования операторов присвоения (выражения приводятся справа от знака равенства):
х = 1
X = X + 1
х = ( у * 2) ! ( г * 2) FileOpen = True FileOpen = Not FileOpen Range С «The Year»).Value = 2001
Выражения могут быть очень сложными. Чтобы сделать длинные выражения более удобными для восприятия, используйте символ продолжения строки (пробел с подчеркиванием).
Зачастую в выражениях применяются функции. Это могут быть встроенные функции VBA , функции рабочих листов Excel или специальные функции, разработанные в VBA .
Булевы операторы VBA
Таблица. Булевы операторы VBA
Оператор |
Действие |
not |
Логическое отрицание выражения |
And |
Логическая конъюнкция двух выражений |
Or |
Логическая дизъюнкция двух выражений |
xoR |
Логическое отрицание двух выражений |
Eqv |
Логическая эквивалентность двух выражений |
imp |
Логическая импликация двух выражений |
Примеры.
- Свойство DisplayGridLines принимает значение True или False . Следовательно, применение оператора Not изменяет True на False , a False — на True :
ActiveWindow . DisplayGridLines = _
Not ActiveWindow . DisplayGridLines - Представленное далее выражение осуществляет логическую операцию And . Оператор MsgBox отображает True , только если Лисг1 — активный лист и активная ячейка находится в строке 1. Если одно или оба этих условия неверны, оператор MsgBox отображает False :
MsgBox ActiveSheet . Name = «Лист1» And ActiveCell . Row = 1 - Следующее выражение осуществляет логическую операцию Or . Оператор MsgBox отображает True , если активен лист Лист1 или Лист2:
MsgBox ActiveSheet.Name = » Лист 1″ Or ActiveSheet.Name = » Лист 2″
Массивы
Массив — это именованная группа проиндексированных элементов одного типа. На конкретный элемент массива ссылаются, используя имя массива и индекс. Например, массив MonthNames из 12-ти строк (каждая переменная соответствует названию месяца). Можно обратиться к первому элементу массива как
MonthNames(0), ко второму — как MonthNames(1) и т.д., до MonthNames(11).
Одномерные массивы
Массив объявляется с помощью операторов Dim или Public . Можно определить количество элементов в массиве: введите первый индексный номер, ключевое слово То и последний индексный номер — вся конструкция будет заключена в скобки. Например, так можно объявить массив, содержащий ровно 100 целых чисел:
Dim MyArray(1 To 100) As Integer
Многомерные массивы
Массивы VBA могут иметь до 60-ти измерений. Показанный ниже оператор объявляет двухмерный 100-элементный массив целых чисел:
Dim MyArray(1 To 10, 1 То 10) As Integer
Так присваивается значение элементу предыдущего массива
МуАггау(1, 4) = 125
Трехмерный массив
Dim MyArray(1 To 5, 1 То 6, 1 То 7) As Integer
состоит из 420 чисел типа Double.
Динамические массивы
Динамический массив не имеет предопределенного количества элементов. Динамический массив объявляется с незаполненными значениями в скобках:
Dim MyArray () As Integer
Перед использованием динамического массива необходимо обратиться к оператору
ReDim , указывающему VBA , сколько элементов находится в массиве
или
ReDim Preserve , если решено сохранить текущую длину массива.
Оператор ReDim можно использовать сколько угодно раз, изменяя, если требуется, размер массива.
Переменные объектов
Переменная объекта — это переменная, представляющая целый объект, например, диапазон или рабочий лист. Переменные объектов имеют особое значение по двум причинам:
¦ значительно упрощают программу;
¦ ускоряют выполнение программы.
Переменные объектов, как и обычные переменные, объявляются с помощью оператора Dim или Public . Например, в следующем операторе переменная inputArea объявляется как объект Range : Public InputArea As Range
Чтобы узнать, каким образом переменные объектов упрощают программу, проанализируем процедуру, написанную без их использования:
Sub KoObjVar()
Worksheets(» Лист 1″).Range(«Al»).Value =124
Worksheets(» Лист 1″).Range(«Al»).Font.Bold = True
Worksheets(» Лист 1″).Range(«Al»).Font.Italic = True
End Sub
Эта процедура вводит значение в ячейку А1 листа Лист1 активной рабочей книги, а затем делает шрифт содержимого ячейки полужирным и курсивным. В примере введено довольно много кода для такой простой операции. Чтобы пощадить себя, сведите процедуру к использованию объектной переменной:
Sub ObjVar()
Dim MyCell As Range
Sec MyCell = Worksheets(» Лист 1″).Range(«Al»)
MyCell.Value =124
MyCell.Font.Bold = True
MyCell.Font.Italic = True
End Sub
После объявления переменной MyCell как объекта Range оператор Set присваивает ей сам объект. В результате в следующих операторах используется упрощенная ссылка MyCell вместо длинной Worksheets (» Лист1″) . Range(» Al «).
Пользовательские типы данных
VBA позволяет создавать специальные, или пользовательские, типы данных . Определенный пользователем тип данных может облегчить управление некоторыми типами данных. Например, если приложение обрабатывает сведения о клиенте, то можно создать пользовательский тип данных с названием
Customerlnfo:
Type Customerlnfo
Company As String * 25
Contact As String * 15
RegionCode As Integer
Sales As Long
End Type
Пользовательские типы данных определяются вверху модуля перед началом
Если пользовательский тип данных уже создан для объявления переменной этого типа примените оператор Dim . Обычно пользовательский тип данных определяется для массивов:
Dim Customers ( 1 To 100) As Customerlnfo
Все 100 элементов этого массива состоят из четырех компонентов (как указано в пользовательском типе данных— Customerlnfo ). Вы можете сослаться на конкретный компонент элемента :
Customers(5).Company = «Acme Tools»
Customers(1).Contact = «Tim Robertson»
Customers(1).RegionCode = 3
Customers(1).Sales = 150677
Чтобы скопировать информацию из Customers (1) в Customers ( 2 ), используется следующая инструкция:
Customers (2) = Customers (1)
Предыдущий пример эквивалентен приведенному далее блоку инструкций:
Customers(2).Company = Customers(1).Company
Customers(2).Contact = Customers(1).Contact
Customers(2}.RegionCode = Customers(1).RegionCode
Customers(2).Sales = Customers(1).Sales