Синтаксис языка программирования — это правила написания программ.
Рассмотрим пример — возьмем из справочной системы описание команды. Мы пока не будем вдаваться в смысл ключевых слов (перед нами — описание
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]
В синтаксических описаниях VBA жирным шрифтом выделены ключевые слова языка, курсивом даны названия [statements] будут содержать в себе "полезную нагрузку" цикла –
Элементы, которые допускают альтернативный выбор, разделяются знаком " | ". Например, такая запись: " one | two " обозначает "one или two".
Ниже мы будем останавливаться на существенно важных особенностях тех или иных конструкций. Если вам понадобятся подробности — вы сможете найти их в справке к VBA.
Теперь рассмотрим понятие
05-01-Переменная.docm — пример к п. 5.2.
У
О типах мы поговорим ниже, а пока займемся именами
#, $, % и т.д.) и пробелов.if, dim, for и т.д.).При именовании
Например, такие имена 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. вы можете видеть это окно.
(рис 5.1) Окно ввода данных Выражение txt_Name = означает, что мы присваиваем txt_Name то, что пользователь введет в окне ввода данных, как бы говорим программе: "Сохрани в txt_Name то, что пользователь введет в окне". Когда пользователь сообщает свое имя и нажимает OK —введенная им строка записывается в txt_Name. Введем на приглашение программы имя "Александр", вы можете ввести любое другое имя.
Теперь мы можем выполнять много разных действий с этой MsgBox. В данном примере мы так и поступили — вызвали MsgBox, указав вместо выводимого текста имя
(рис 5.2) Имя пользователя в окне сообщения Обратите внимание на то, что мы не заключили имя txt_Name ), но не хранимый в ней текст.
Тип данных определяет важнейшие свойства
Вы уже можете предположить как минимум два
В табл. 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 |
|
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.
Выше мы уже говорили о венгерской нотации как о способе именования объектов. Те же правила действуют и для
| Префикс имени переменной | Пояснения |
|---|---|
s, str |
Строковая переменная |
n, num
|
Числовая переменная (существует множество числовых типов данных, название каждого из которых может быть использовано в качестве префикса, например, int для Integer, dbl для Double и т.д.) |
b, bool |
|
O, obj |
Для работы с Variant. Второй подход предусматривает объявление
Как вы уже знаете, в VBA
Необъявленные
txt_CompanyName = "Типография" MsgBox (txt_CompanyName)
Как вы думаете, что получится при его исполнении? Очевидно, должно вывестись окно сообщения с текстом "Типография". Но это далеко не факт. По внешнему виду
Если бы редактор кода не давал нам пользоваться необъявленными Option . Второй — включить запрещение работы с необъявленными Tools • Options (Инструменты • Опции) и в появившемся диалоговом окне на вкладке Editor (Редактор) включите параметр Require (Требовать объявление
05-02-Dim и Static.docm — пример к п. 5.5.
Лучше всего объявлять
Рассмотрим пример. Объявление num_MyAge типа Byte выглядит так (листинг 5.3.):
Dim num_MyAge As Byte num_MyAge = 23
Этот код можно перевести так: "Объявить Byte с именем num_MyAge и сделать ее доступной в модуле, в котором она объявлена". Второй строкой мы присваиваем
Доступность Dim. Оно означает, что мы сможем пользоваться объявленной
Обратите внимание на то, что если вы присваиваете значение строковой #. Например, так (листинг 5.4.):
Dim str_MyName as String Dim date_MyBirthDate as Date str_MyName = "Alexander" date_MyBirthDate = #January 1, 2007#
Помимо ключевого слова Dim могут использоваться и другие слова. В частности, нам будет полезна команда Static — Dim. Такую
Рассмотрим пример. Создайте новый документ Microsoft Word, добавьте в него две кнопки. В обработчике события Click одной из них с именем cmd_Dim, на которой будет написано Dim, напишите такой код (листинг 5.5.)
Dim num_Counter As Integer num_Counter = num_Counter + 1 MsgBox (num_Counter)
Здесь мы сначала объявляем Integer, потом присваиваем этой
Сколько бы вы не нажимали на эту кнопку — всякий раз в окне сообщения будет выводиться единица. Ведь каждый раз, когда запускается обработчик, все происходит как бы в первый раз — информация об изменениях
Вторую кнопку назовите cmd_Static, подпишите ее как Static, и в обработчик нажатия добавьте следующее (листинг 5.6.):
Static num_Counter As Integer num_Counter = num_Counter + 1 MsgBox (num_Counter)
Единственное отличие этого текста от предыдущего — ключевое слово Static вместо Dim. Но благодаря такому объявлению, Static — каждый раз вы будете видеть в окне сообщения число, увеличенное на 1.
05-03-Операторы, конкатенация.docm — пример к пп. 5.6.-5.7.
Операторы — это команды, которые используются в VBA для работы с данными. Если вы программировали когда-нибудь, например, на Basic'e или на каком-нибудь другом языке, вам уже знакомы основные
| Оператор | Описание |
|---|---|
+ |
Сложение. Например, в результате вычисления выражения 4+3 получится 7. |
– |
Вычитание. |
* |
Умножение |
/ |
Деление |
^ |
Возведение в степень, 5^2 равняется 25 |
\ |
Целочисленное деление. От результата деления отбрасывается дробная часть. Например, 10 \ 3 равняется 3. |
mod |
Деление по модулю. Возвращает остаток от деления. Например, 10 mod 3 равняется 1 |
В VBA применяется тот же порядок обработки выражений, который принят в математике. Например, результат вычисления 2*3+7 равняется 13-ти. Так же, в математических выражениях могут использоваться круглые скобки. Однако, круглые скобки могут встретиться вам не только в математических выражениях. Скобки, как вы могли заметить из примеров, которые мы рассматривали выше, часто употребляются при вызове функций VBA, при работе с объектами и т.д.
Если снова вернуться к математике, нельзя не заметить, что редкая математическая запись обходится без знака =. Этот знак используется в VBA в нескольких ролях.
Во-первых, это оператор присваивания. Вы уже сталкивались с ним, когда присваивали какие-то значения свойствам элементов управления или num_a = 10 + 2 означает: "Присвоить num_a результат сложения чисел 10 и 2 " или, проще, "а равно 10+2". Вторая роль = заключается в том, что он используется в командах сравнения выражений — о них мы поговорим в следующей главе.
Несколько ролей и у +. Во-первых — это арифметический оператор сложения. А во-вторых — оператор конкатенации строк. Конкатенация — это нечто вроде "склеивания" строк. В качестве . Считается, что использовать предпочтительнее так как он в любом случае обрабатывает операнды как строковые данные.
Давайте рассмотрим пример, который охватывает арифметические операции и конкатенацию строк.
Напишем программу, которая запрашивает имя пользователя и два числа, после чего выводит такой текст в окне сообщения (если имя введено как "Александр", первое число 2, второе – 21): "Здравствуйте, Александр. Вы ввели числа 2 и 21, их сумма равняется 23."
Добавим кнопку в документ Microsoft Word, назовем ее cmd_Experiments, надпишем ее как Работа с
Теперь решим, какие
Для имени пользователя это String. Дадим ей имя str_UserName. Для чисел нам понадобится пара
Какие числа введет пользователь? Этого мы не знаем. Конечно, можно ограничить ввод проверками, но это дела будущих примеров. Предполагается, что пользователь может ввести практически любое число — целое или дробное, положительное или отрицательное. Поэтому воспользуемся типом Double. Назовем пару числовых num_First и num_Second.
Создадим отдельную Double для хранения суммы введенных значений – назовем ее num_Summ.
В условии нашей задачи присутствует требование вывести все введенные данные в строку, скомбинировав с определенными словами. Нам понадобится String для хранения этой строки. Назовем ее str_Result.
Также добавим в обработчик нажатия кнопки команду Option — тогда система запретит использование необъявленных
Вы уже знакомы с функцией InputBox, которая выводит окно для ввода данных пользователем. Как вы могли убедиться, InputBox отлично справляется со вводом строковых значений. А как насчет чисел? Можем ли мы написать что-то вроде:
num_First = InputBox("Введите первое число")
Вполне можем.
Пожалуй, сейчас для вас самое сложное — это построить строку вывода, однако пользуйтесь следующими правилами и вы всегда будете правильно и быстро строить подобные строки.
Во-первых — помните, что все, что вы хотите вывести в виде неизменного текста, должно быть включено в кавычки, а имена при "склеивании" отдельных частей строки или оператор + и функцию Str (о ней вы прочтете ниже), которая конвертирует числовые
Например, пусть в str_UserName хранится имя пользователя "Александр", а str_Result должна содержать результат вывода. Напишем код, помещающий в str_Result строку "Привет, Александр":
str_Result = "Привет, " str_UserName
Видите? Ничего сложного, правда?
Обратите внимание на то, как реагирует система на использование необъявленных Option (рис. 5.3.).
(рис 5.3) Реакция системы на необъявленную переменную Здесь вместо str_UserName мы ошибочно использовали str_UserNane. Но благодаря Option появление необъявленных
Однако вернемся к нашей задаче. Мы определились с особенностями работы наиболее сложных ее частей, в итоге у нас получилось следующее (листинг 5.7.):
Dim str_UserName As String
Dim str_Result As String
Dim num_First As Double
Dim num_Second As Double
Dim num_Summ As Double
str_UserName = InputBox("Введите ваше имя")
num_First = InputBox("Введите первое число")
num_Second = InputBox("Введите второе число")
num_Summ = num_First + num_Second
str_Result = "Здравствуйте, " str_UserName _
". Вы ввели числа " num_First " и " num_Second _
". Их сумма равняется " num_Summ
MsgBox (str_Result)
Обратите внимание на то, что строку сборки строки вывода str_Result мы разбили на несколько частей
05-04-Эксперимент с типами данных.docm — пример к п. 5.8.
Нередко возникают ситуации, когда данные одного типа надо преобразовать в данные другого. Ярче всего это проявляется тогда, когда нужно преобразовать число, представленное в виде строки и хранящееся в строковой
Давайте проведем эксперимент. Создадим форму, назовем ее frm_First, разместим на ней три текстовых поля — txt_First и txt_Second для ввода чисел, и txt_Summ для вывода суммы этих чисел. Добавим на форму кнопку cmd_First с надписью Сумма и создадим для нее обработчик события Click (листинг 5.8.).
txt_Summ = txt_First + txt_Second
На рис. 5.4. вы можете видеть форму после того, как мы ввели в первое и второе поля числа 1 и 2 и нажали на кнопку.
(рис 5.4) Эксперимент: вместо сложения — конкатенация Как видите, вместо сложения мы получили конкатенацию. Любые значения, вводимые в текстовые поля, по умолчанию рассматриваются как строковые. Чтобы все-таки получить сумму введенных чисел в поле "Сумма чисел", нам нужно превратить строки, пусть и содержащие числовые символы, в настоящие числа, преобразовать их из String в один из числовых типов.
Для таких "превращений" существуют специальные функции
Функция Val применяется для конверсии строковых String в тип Double.
Чтобы наш пример заработал, код обработчика нажатия кнопки можно переписать так (листинг 5.9.):
txt_Summ = Val(txt_First) + Val(txt_Second)
Давайте рассмотрим еще несколько примеров использования этой функции.
Val (" 12345привет") возвратит число 12345.
Val читает предлагаемую ей строку слева направо, игнорируя пробелы. Она считывает все числовые знаки до первого символьного знака и преобразует считанное в число. В качестве дробных символов функция понимает лишь точки.
Val ("1 2 3") возвратит число 123
Val ("1 2 и 3") возвратит число 12.
Иногда нужно провести обратное преобразование — превратить число в строку.
Функция Str конвертирует данные различных числовых типов в тип String.
Особенность функции заключается в том, что первый символ полученного строкового значения зарезервирован для знака числа. Если в строку конвертируется число отрицательное — первый символ полученной строки — знак -. Если конвертируется положительное число, первым символом полученной строки будет пробел, а дальше будут идти числовые символы.
Например, функция Str (12) возвратит строку " 12 ". Мы рассмотрим пример с использованием функции Str немного ниже, когда будем говорить о работе со строками.
Существуют и другие функции, предназначенные для конверсии типов данных. Их названия состоят из сокращенного слова "Convert" и сокращенного же названия CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CSng, CStr, CVar. Скажем, функция CInt конвертирует данные в формат Integer. Учитывая особенности этого
05-05-Проверка типов данных.docm — пример к п. 5.11.
Если вам нужно узнать TypeName.
Добавим в документ Microsoft Word кнопку, назовем ее cmd_DataType, надпишем как Проверка типа и внесем в ее обработчик Click такой код (листинг 5.10.):
Dim num_MyAge as Byte num_MyAge = 24 MsgBox (TypeName(num_MyAge))
На (рис. 5.5.) вы можете видеть результат выполнения этого кода.
(рис 5.5) Результат вывода типа данныхЧтобы проверить, являются ли данные, хранимые в Variant, числом, можно воспользоваться функцией IsNumeric.
Для точного определения Variant, вы можете воспользоваться функцией VarType.
В этой лекции мы подробно обсудили особенности использования различных типов данных в VBA, работу с
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.