Объявляем переменные: Dim и Static

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

Рассмотрим пример. Объявление переменной с именем num_MyAge типа Byte выглядит так (листинг 5.3.):

Dim num_MyAge As Bytenum_MyAge = 23

Листинг 5.3. Объявление переменной и работа с ней

Этот код можно перевести так: "Объявить переменную типа Byte с именем num_MyAge и сделать ее доступной в модуле, в котором она объявлена". Второй строкой мы присваиваем переменной число 23.

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

Обратите внимание на то, что если вы присваиваете значение строковой переменной — передаваемое ей значение должно быть заключено в кавычки. При присваивании значений даты соответствующим переменным, эти значения должны быть заключены в значки #. Например, так (листинг 5.4.):

Dim str_MyName as StringDim date_MyBirthDate as Datestr_MyName = "Alexander"date_MyBirthDate = #January 1, 2007#

Листинг 5.4. Работа с переменными типа String и Date

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

Рассмотрим пример. Создайте новый документ Microsoft Word, добавьте в него две кнопки. В обработчике события Click одной из них с именем cmd_Dim, на которой будет написано Dim, напишите такой код (листинг 5.5.)

Dim num_Counter As Integernum_Counter = num_Counter + 1MsgBox (num_Counter)

Листинг 5.5. Обработчик события Click кнопки cmd_Dim

Сколько бы вы не нажимали на эту кнопку — всякий раз в окне сообщения будет выводиться единица. Ведь каждый раз, когда запускается обработчик, все происходит как бы в первый раз — информация об изменениях переменной не сохраняется при выходе из обработчика.

Вторую кнопку назовите cmd_Static, подпишите ее как Static, и в обработчик нажатия добавьте следующее (листинг 5.6.):

Static num_Counter As Integernum_Counter = num_Counter + 1MsgBox (num_Counter)

Листинг 5.6. Обработчик события Click кнопки cmd_Static

Единственное отличие этого текста от предыдущего — ключевое слово Static вместо Dim. Но благодаря такому объявлению, переменная хранит свое значение между запусками обработчика. Попробуйте несколько раз нажимать на кнопку Static — каждый раз вы будете видеть в окне сообщения число, увеличенное на 1.

Арифметические операторы и работа с числовыми переменными

Операторы — это команды, которые используются в VBA для работы с данными.. Большинство операторов VBA действуют точно так же, как знакомые всем арифметические операторы. В табл. 5.3. вы можете видеть описание арифметических операторов, применимых в VBA

Таблица 5.3. Арифметические операторы VBA
Оператор Описание
+ Сложение. Например, в результате вычисления выражения 4+3 получится 7.
Вычитание.
* Умножение
/ Деление
^ Возведение в степень, 5^2 равняется 25
\ Целочисленное деление. От результата деления отбрасывается дробная часть. Например, 10 \ 3 равняется 3.
mod Деление по модулю. Возвращает остаток от деления. Например, 10 mod 3 равняется 1

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

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

Конкатенация

Несколько ролей и у оператора +. Во-первых — это арифметический оператор сложения. А во-вторых — оператор конкатенации строк. Конкатенация — это нечто вроде "склеивания" строк. В качестве оператора конкатенации можно использовать и оператор &. Считается, что & использовать предпочтительнее так как он в любом случае обрабатывает операнды как строковые данные.

Рассмотрим пример, который охватывает арифметические операции и конкатенацию строк.

Напишем программу, которая запрашивает имя пользователя и два числа, после чего выводит такой текст в окне сообщения (если имя введено как "Александр", первое число 2, второе – 21): "Здравствуйте, Александр. Вы ввели числа 2 и 21, их сумма равняется 23."

Добавим кнопку в документ Microsoft Word, назовем ее cmd_Experiments, надпишем ее как Работа с операторами.

Теперь решим, какие переменные нам нужны.

Для имени пользователя это переменная типа String. Дадим ей имя str_UserName. Для чисел нам понадобится пара переменных одного из числовых типов.

Какие числа введет пользователь? Этого мы не знаем. Конечно, можно ограничить ввод проверками, но это дела будущих примеров. Предполагается, что пользователь может ввести практически любое число — целое или дробное, положительное или отрицательное. Поэтому воспользуемся типом Double. Назовем пару числовых переменных num_First и num_Second.

Создадим отдельную переменную того же типа Double для хранения суммы введенных значений – назовем ее num_Summ.

В условии нашей задачи присутствует требование вывести все введенные данные в строку, скомбинировав с определенными словами. Нам понадобится переменная типа String для хранения этой строки. Назовем ее str_Result.

Также добавим в обработчик нажатия кнопки команду Option Explicit — тогда система запретит использование необъявленных переменных.

Вы уже знакомы с функцией InputBox, которая выводит окно для ввода данных пользователем. Как вы могли убедиться, InputBox отлично справляется со вводом строковых значений. А как насчет чисел? Можем ли мы написать что-то вроде:

num_First = InputBox("Введите первое число")

Вполне можем.

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

Во-первых — помните, что все, что вы хотите вывести в виде неизменного текста, должно быть включено в кавычки, а имена переменных, наоборот, пишутся без кавычек. Во-вторых — используйте оператор & при "склеивании" отдельных частей строки или оператор + и функцию Str (о ней вы прочтете ниже), которая конвертирует числовые переменные в строки. Так вы будете гарантированы от неожиданностей и ошибок.

Например, пусть в переменной str_UserName хранится имя пользователя "Александр", а переменная str_Result должна содержать результат вывода. Напишем код, помещающий в str_Result строку "Привет, Александр":

str_Result = "Привет, " & str_UserName

Обратите внимание на то, как реагирует система на использование необъявленных переменных при добавленной в модуль команде Option Explicit (рис. 5.3.).

Объявляем переменные: Dim и Static - student2.ru

Рис. 5.3.Реакция системы на необъявленную переменную

Здесь вместо str_UserName мы ошибочно использовали str_UserNane. Но благодаря Option Explicit появление необъявленных переменных воспринимается как ошибка. При попытке запуска программы мы видим сообщение об ошибке: "Variable not defined" - "Переменная не определена".

Вернемся к нашей задаче. В итоге у нас получилось следующее (листинг 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)

Листинг 5.7. Обработчик события Click кнопки cmd_Experiments

Обратите внимание на то, что строку сборки строки вывода str_Result мы разбили на несколько частей оператором переноса строки.

5.8. Преобразование типов данных

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

Проведем эксперимент. Создадим форму, назовем ее frm_First, разместим на ней три текстовых поля — txt_First и txt_Second для ввода чисел, и txt_Summ для вывода суммы этих чисел. Добавим на форму кнопкуcmd_First с надписью Сумма и создадим для нее обработчик события Click (листинг 5.8.).

txt_Summ = txt_First + txt_Second

Листинг 5.8. Обработчик события Click кнопки cmd_First

На рис. 5.4. вы можете видеть форму после того, как мы ввели в первое и второе поля числа 1 и 2 и нажали на кнопку.

Объявляем переменные: Dim и Static - student2.ru

Рис. 5.4.Эксперимент: вместо сложения — конкатенация

Как видите, вместо сложения мы получили конкатенацию. Любые значения, вводимые в текстовые поля, по умолчанию рассматриваются как строковые. Чтобы все-таки получить сумму введенных чисел в поле "Сумма чисел", нам нужно превратить строки, пусть и содержащие числовые символы, в настоящие числа, преобразовать их из типа данных String в один из числовых типов. Для таких "превращений" существуют специальные функции преобразования типов.

Наши рекомендации