Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2313

.pdf
Скачиваний:
1
Добавлен:
15.11.2022
Размер:
1.4 Mб
Скачать

 

 

Окончание табл. 3.1

 

 

для положитель-

 

 

 

 

ных чисел

 

 

 

 

 

 

 

String

Используется

Длина строки от 0

 

$

 

для хранения

до 64 Кбайт

 

 

 

строковых

 

 

 

 

значений

 

 

 

 

 

 

 

 

Variant

Может ис-

Значения любого

 

 

 

пользоваться

из вышепе-

 

 

 

для хранения

речисленных ти-

 

 

 

всех вышепе-

пов плюс Null,

 

 

 

речисленных

Error, Empty,

 

 

 

типов

Nothing

 

 

 

 

 

 

 

Если такие типы данных, как integer или string, не требуют особых комментариев, поскольку они стандартны и просты, то типы данных Decimal, object и variant следует прокомментировать. Про тип данных object мы отдельно поговорим, сейчас же рассмотрим типы variant и Decimal.

Языки программирования можно делить на типизированные (C++, Pascal) и бестиповые (Lisp). В первом случае каждая переменная имеет фиксированный тип данных, который не может изменяться в ходе программы. В бестиповых же языках тип переменной не определяется и может изменяться во время выполнения программы. Тип данных variant - универсальный тип данных, позволяющий программисту не заботиться о том, какого типа будут переменные. Но данная возможность - палка о двух концах. С одной стороны, безусловное удобство: не надо думать при объявлении переменной, с другой - это может привести к ошибкам, которые трудно обнаружить. Более того, на обработку переменных данного типа тратится больше времени, да и память расходуется нерационально.

Мы советуем (особенно начинающим программистам) не злоупотреблять данным типом, хотя ряд приемов его исполь-

43

зования заметно упрощает программирование. Например, вы хотите, чтобы пользователь программы ввел целое число (после чего программа нарисует круг соответствующего радиуса), и ввели переменную ввода целого типа. Но что, если пользователь введет вместо целого числа вещественное или вообще строковое значение? Произойдет ошибка при попытке присвоения переменной значения не того типа. Вот тут-то и необходим тип variant. Если переменная для ввода будет объявлена как Variant - ничего страшного не случится: введенное значение будет благополучно присвоено этой переменной, а вы получите возможность проанализировать введенное значение и попросить пользователя повторить ввод, если введенное им значение не отвечает требуемым условиям.

Теперь сделаем ряд замечаний относительно типа Decimal. Этот тип является частным случаем variant, и все приведенные аргументы за и против также относятся и к нему.

3.2. Операции

Теперь перейдем к разговору о третьей составляющей нашего определения типа данных - об операциях. Операция - это действие, выполняемое над данными.

[Результат =] операнд <операция> операнд

Любая операция имеет результат, не важно, явно или неявно он описан. Операнд - это элемент данных, участвующий в операции. Для каждой операции определены типы данных операндов, для которых она имеет смысл и по которым определяется тип результата. Естествен вопрос: по какому именно правилу определяется тип результата, ведь в качестве операндов могут быть операнды разных типов? Для ответа на этот вопрос необходимо ввести определение приведения.

Приведение - это (автоматическое) преобразование значения одного типа в эквивалентное значение другого типа. Приведение типов представлено на рисунке.

44

 

 

Variant

 

 

 

 

 

 

 

 

 

 

 

Decimal

String

Object

Double

 

 

 

Currency

 

 

 

Date

 

 

 

Single

 

 

 

Long

 

 

 

Integer

 

 

 

Byte

 

 

 

Boolean

Приведение типов

Конечно, не всякое приведение возможно, т. е. не всегда можно сделать именно эквивалентное преобразование. Например, целое число 3 можно преобразовать в вещественное число 3,0 - и значение сохранится, но вещественное число 3,1415926 нельзя преобразовать в целое, не потеряв информацию.

Если присвоить значение "старшего" типа переменной "младшего" типа, например, присвоить значение типа Double переменной типа Integer, то такое действие будет выполнено, но при этом произойдет утрата информации (будет потеряна дробная часть числа).

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

Операции делятся на арифметические, логические, строковые и на операции отношения.

45

 

 

Таблица 3.2

 

Арифметические операции

 

Операция

Название

Приоритет

^

Возведение в степень

1

-

Отрицание (НЕ)

2

*

Умножение

3

/

Деление

3

\

Деление нацело

4

Mod

Остаток от деления

5

+

Сложение

6

-

Вычитание

6

&

Объединение (конкатенация) строк

7

Таким образом, вначале выполняются арифметические операции согласно порядку в таблице, затем операции отношения, а после - логические. Есть способ повышения приоритетности у операции - это взятие ее операндов в скобки.

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

Таблица 3.3

 

Арифметические операции сравнения

=

Равно

<>

Не равно

<Меньше

<= Меньше или равно

>Больше

>= Больше или равно

Is Идентично (только для объектов, вместе с зарезервированным словом Null используется для проверки, является ли значение пустым)

46

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

 

 

 

 

 

 

 

 

 

 

 

Таблица 3.4

 

 

 

 

 

 

Логические операции

 

 

 

 

Операция

 

 

 

 

Название

 

 

 

 

 

not a

 

 

Отрицание

 

 

 

 

 

 

 

 

a and b

 

 

Логическое И (конъюнкция)

 

 

 

 

a or b

 

 

Логическое ИЛИ (дизъюнкция)

 

 

 

 

a xor b

 

 

Исключающее ИЛИ

 

 

 

 

 

a eqv b

 

 

Эквивалентность

 

 

 

 

 

a imp b

 

 

Импликация

 

 

 

 

 

 

Семантика логических операций задается таблицей ис-

 

тинности.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 3.5

 

 

 

 

 

 

Таблица истинности

 

 

 

а

 

b

 

not a

 

a and

a or b

 

а xor

 

a eqv

a imp

 

 

 

 

 

 

 

b

 

 

b

 

b

b

 

True

 

True

 

False

 

True

True

 

False

 

True

True

 

True

 

False

 

False

 

False

True

 

True

 

False

False

 

False

 

True

 

True

 

False

True

 

True

 

False

True

 

False

 

False

 

True

 

False

False

 

False

 

True

True

 

Для данных типа string предусмотрены две операции, суть которых одна - объединение (конкатенация) нескольких строк в одну. Но если в первом случае в качестве операндов могут быть выражения любого типа (при данной операции они просто преобразуются в строковые), то во втором оба операнда должны иметь тип string.

47

Таблица 3.6

 

 

Строковые операции

Операция

 

Результат

а

& b

 

"ab"

"а"

+ "b"

 

"ab"

3.3. Объявление переменных

Необходимо приступать к работе с данными, т. е. к программированию. По существу эта работа делится на две - на объявление переменных и составление процедур обработки этих переменных.

Итак, переменная - это элемент данных в программе, которому присвоено имя. Значение переменной может задаваться и изменяться программой (переменная - не константа), но - в соответствии с определенным типом данной переменной, который задается при ее объявлении. При объявлении задается имя (начинается с буквы, до 256 символов, без пробелов и специальных знаков, не совпадает с ключевыми словами) - для идентификации переменной в программе, затем объявляется ее тип (для определения возможных значений переменной и способов ее обработки), а также определяется область видимости данной переменной.

VBA поддерживает два вида объявления переменной - явное и неявное. Явное объявление простых переменных имеет следующий синтаксис:

{Dim | Private | Public | Static} _

имяПеременной [As типДанных]

[, имяПеременной [Аs типДанных] ] ...

Рассмотрим первую часть объявления - объявление области видимости переменной при помощи соответствующих операторов.

Переменные, объявленные только в процедуре, действуют в пределах процедуры. Объявление переменной на уровне модуля делает ее доступной для всех процедур модуля. При

48

этом допускается переопределение имени переменной во вложенных процедурах. Для использования переменной во всех вложенных процедурах и модулях она объявляется глобальной на уровне внешнего модуля.

Исключением из правил является объявление переменных типа Decimal. Для того чтобы объявить переменную данного типа, необходимо использование функции CDec.

Следующая часть объявления - это имя переменной. Последняя часть, необходимая при явном объявлении переменной, - указание ее типа с помощью ключевого слова AS , после которого идет ключевое слово, определяющее тип данных, например integer.

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

Итак, мы рассмотрели явный способ объявления переменной. Перейдем к рассмотрению неявного.

Во-первых, при составлении имен можно непосредственно в имени переменной указать ее тип, добавив в конец имени специальный символ.

Таким образом, объявление типа: Dim numb%, создает переменную с именем numb типа integer. Эти символы не являются обязательной частью имени: если в программе встречаются имена numb% и numb, то они ссылаются на одну и ту же целочисленную переменную. Но нельзя в теле одной процедуры использовать имена переменных, отличающиеся лишь специальным символом определения типа. Например, не допускается одновременное использование переменных numb %

и numb$.

Во-вторых, можно вообще не использовать операторы объявления, а, при необходимости, прямо на месте неявно вводить переменную, чего не советуем делать, исходя из соображений надежности программирования.

49

3.4. Константы

Константа - это элемент данных, не меняющий своего значения в процессе выполнения программы.

Синтаксис объявления констант практически ничем не отличается от объявления переменных:

[Public | Private] Const имяКонстанты _ [As типДанных] = <выражение>

Ключевые слова Public и Private имеют такой же смысл, что и в случае с переменными. Отсутствие данных операторов и описание константы внутри процедуры объявляет ее как локальную; их использование, наоборот, объявляет ее как открытую или закрытую глобальную константу. Задание имени и типа данных аналогичны случаю с переменными.

Выражение - это любое значение или формула, возвращающая значение, используемое в качестве константы. Например:

Const AA = 5000

Или в виде формулы:

Const BB = AA * 0.1

В VBA кроме констант, описываемых пользователем, существуют предопределенные встроенные константы. При именовании встроенных констант используется стандартное соглашение, позволяющее определить, к объектам какого приложения относится эта константа. Например, встроенные константы, относящиеся к Word, начинаются с букв wd, Excel - ex, PowerPoint - pp, Access - ac, VBA - vb. Например, в случае Call MsgBox("Использование констант", vbInformation) используется константа vbInformation, с помощью которой в диалоговом окне выводится значок "Информация".

3.5. Массивы

Перейдем к рассмотрению более сложных типов данных - структурных типов данных, простейший из них - массивы.

50

Массив - это совокупность однотипных индексированных переменных. Обращение же к элементам массива происходит путем указания имени данного массива и порядкового номера требуемого элемента.

Dim authorNames(...) As String

'Для каждого элемента массива authorNames проверить, 'начинатся ли authorNames(индекс) с "А"

Количество же индексов массива в VBA может достигать 60, но это своего рода излишество: как правило, используются массивы с одним, двумя и тремя индексами. О количестве индексов массива говорят как о размерности массива. Массивы с одним индексом называют одномерными, с двумя - двумерными и т. д.

Как и любой элемент данных, массив необходимо объявлять. Ниже приведен синтаксис объявления:

{Dim | Private | Public | Static} _

имяМассива1 (<размер1>_

[, <размер2>] . . . ) [As типДанных] _ [, имяМассива2 (<размер1>_

[, <размер2>] ...) [Аs типДанных]} ...

Размер массива может задаваться тремя способами:

1.Объявление только верхней границы, при этом нижняя граница по умолчанию принимает значение, равное 0. Синтаксис подобного объявления прост:

( верхняяГраница )

2.Объявляется нижняя и верхняя граница изменения ин-

декса:

(нижняяГраница То верхняяГраница)

3.Размер массива вообще не объявляется, размерность массива неизвестна:

()

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

51

элементы массива будут иметь тип Variant. Также при необходимости после запятой вы можете объявить еще один массив и т. д.

Приведем ряд примеров, поясняющих использование синтаксических конструкций. В первом примере объявляется одномерный массив типа variant с использованием ключевого слова Dim, причем индексация производится от -14 до 0. Данная индексация имеет смысл, например, когда вы имеете дело с данными, зависящими от некоего временного интервала. Допустим, количество книг, проданных за предыдущие две недели. В таком случае cntBookSales (-2) будет соответствовать количеству книг, проданных позавчера.

Во втором примере показано объявление двумерного массива магазинов с использованием константных аргументов и инициализация элемента (7, 2).

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

Sub examplel

Dim cntBookSales (-14 To 0) cntBookSales (-2) =10

End Sub

{Второй способ } Sub Example2

Const AUTHORS As Integer = 100, FIELDS As Integer =2 Dim authorList (1 To AUTHORS, 1 To FIELDS) As String authorList(7, 2) = "Усаров"

End Sub

В приведенных примерах речь все время шла о массивах фиксированной размера, количество элементов в которых явно указано во время описания в операторе Dim. Такие массивы называются статическими. Теперь рассмотрим случай, когда количество элементов массива изначально не известно.

Для решения подобных проблем VBA предлагает использование динамических массивов, т. е. массивов, размеры и

52

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]