Основы VBA: синтаксис, переменные, типы данных
Аннотация: Лекция посвящена описанию основных конструкций и принципов 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. Переменные
Переменная — это именованная область памяти, где могут храниться различные данные, которые можно изменять во время выполнения программы . Переменные — это одна из основ любой программы. В них можно сохранять введенную пользователем информацию, их можно использовать для накопления данных, обработанных в программе и так далее. Если бы не было переменных — программирования не существовало бы.
У переменной есть несколько важнейших характеристик. Первая — имя переменной . Используя имя, мы можем обращаться к переменной в программе. Вторая характеристика — это тип данных , которые могут храниться в переменной . Тип определяет характер данных, которые мы можем хранить в переменной . Например, это могут быть числовые данные (возраст пользователя) и строковые данные ( имя пользователя ).
О типах мы поговорим ниже, а пока займемся именами переменных . Давая переменным имена, следует придерживаться следующих правил.
- Имя переменной должно состоять из букв и цифр, причем оно должно начинаться с буквы.
- Имя не может быть длиннее 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)
Первая строка этого кода содержит новую для вас функцию InputBox . Она используется для вывода окна с сообщением и полем для ввода данных. Строка, которая передается функции в качестве параметра — это и есть сообщение, которое будет выведено в окне.
На рис. 5.1. вы можете видеть это окно.
Выражение txt_Name = означает, что мы присваиваем переменной с именем txt_Name то, что пользователь введет в окне ввода данных, как бы говорим программе: «Сохрани в переменной txt_Name то, что пользователь введет в окне». Когда пользователь сообщает свое имя и нажимает OK —введенная им строка записывается в переменную txt_Name . Введем на приглашение программы имя «Александр», вы можете ввести любое другое имя.
Теперь мы можем выполнять много разных действий с этой переменной . В частности — использовать в качестве параметра, передаваемого функции MsgBox . В данном примере мы так и поступили — вызвали MsgBox , указав вместо выводимого текста имя переменной . В результате в окне сообщения вывелось имя пользователя , введенное на предыдущем этапе (рис. 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 . Второй подход предусматривает объявление переменных перед использованием.
Сводка типов данных (Visual Basic)
В следующей таблице показаны Visual Basic типы данных, их вспомогательные типы среды CLR, их номинальное выделение хранилища и диапазоны значений.
† В научной нотации «E» относится к силе 10. Поэтому 3.56E+2 означает 3.56 x 102 или 356, а 3.56E-2 означает 3.56 / 102 или 0,0356.
Для строк, содержащих текст, используйте StrConv функцию для преобразования из одного текстового формата в другой.
Помимо указания типа данных в операторе объявления, можно принудительно задать тип данных некоторых программных элементов с помощью символа типа. См. символы типов.
Затраты памяти
При объявлении элементарной типы данных небезопасно предположить, что потребление памяти совпадает с его номинальным выделением хранилища. Это связано со следующими соображениями:
- служба хранилища назначение. Среда CLR может назначать хранилище на основе текущих характеристик платформы, на которой выполняется приложение. Если память почти заполнена, она может упаковать объявленные элементы как можно ближе друг к другу. В других случаях он может выровнять адреса памяти с естественными границами оборудования для оптимизации производительности.
- Ширина платформы. служба хранилища назначение на 64-разрядной платформе отличается от назначения на 32-разрядной платформе.
Составные типы данных
Те же рекомендации применяются к каждому элементу составного типа данных, например структуре или массиву. Нельзя полагаться на простое добавление номинального распределения хранилища членов типа. Кроме того, существуют и другие аспекты, такие как:
- Накладные расходы. Некоторые составные типы имеют дополнительные требования к памяти. Например, массив использует дополнительную память для самого массива, а также для каждого измерения. На 32-разрядной платформе эта нагрузка в настоящее время составляет 12 байт плюс 8 байт для каждого измерения. На 64-разрядной платформе это требование удвоится.
- служба хранилища макет. Вы не можете безопасно предположить, что порядок хранения в памяти совпадает с порядком объявления. Вы даже не можете делать предположения о выравнивании байтов, таких как 2-байтовая или 4-байтовая граница. Если вы определяете класс или структуру и хотите управлять макетом хранилища его элементов, можно применить StructLayoutAttribute атрибут к классу или структуре.
Затраты на объекты
Ссылка Object на любой простой или составной тип данных использует 4 байта в дополнение к данным, содержащимся в типе данных.