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

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2707
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Синтаксические конструкции языка VBA 275

\Целочисленное деление

Mod

Деление по модулю (остаток от целочисленного деления)

Одноместные операции возведения в степень и перемены знака выполняются раньше всех остальных, операции *, /, \, Mod выполняются раньше + и –. Операции, имеющие одинаковый приоритет, выполняются слева направо. Последовательность выполнения операций можно явно задать при помощи скобок.

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

Логические операции выполняются над логическими (булевыми) значениями. Кроме этого, логические операции могут выполняться над целыми числами — в этом случае речь будет идти о выполнении логической операции над соответствующими двоичными разрядами операндов.

В табл. П.2 приведен набор логических операций, допустимых в VBA-программах:

ТАБЛИЦА П.2. ЛОГИЧЕСКИЕ ОПЕРАЦИИ VBA

Операция

Описание

 

 

Not

Логическое отрицание

And

Логическое "И"

Or

Логическое "ИЛИ"

Xor

Исключительное "ИЛИ"

Imp

Импликация

Eqv

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

Операции сравнения

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

или False.

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

При сравнении плавающего значения с плавающим двойной точности последнее будет округлено.

В табл. П.3 приведен набор операций сравнения, допустимых в VBA-программах:

ТАБЛИЦА П.3. ОПЕРАЦИИ СРАВНЕНИЯ VBA

Операция

Описание

 

 

<

Меньше

<=

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

>

Больше

>=

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

=

Равно

<>

Не равно

Is

Идентичность объектов или соответствие типу

Like

Соответствие маске

Операция Is

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

вторым операндом является идентификатор типа, то операция Is возвращает значение True в том

276 Приложение. VBA, как язык программирования: данные, синтаксис и функции

случае, когда объект, на который ссылается объектная переменная (первый операнд) принадлежит к указанному типу (второй операнд).

Например, следующий макрос может определить, существует ли в рабочей книге лист с именем “Лист1”:

Dim MyObject As Object

...

Set MyObject = Sheets("Лист1")

If MyObject Is Nothing Then

MsgBox("В данной книге нет такого листа")

End If

Операция Like

Результат операции Like — логическое значение, показывающее, соответствует строка заданной маске, или нет. В табл. П.4 приведен набор маскирующих символов, допустимых в VBAпрограммах.

ТАБЛИЦА П.4. ОПЕРАЦИИ СРАВНЕНИЯ VBA

Маскирующий

Назначение

символ

 

 

 

?

Произвольный символ в данной позиции

*

Произвольное число произвольных символов, начинающихся в данной

 

позиции

#

Произвольная цифра в данной позиции

[…]

Один из символов, содержащихся в списке

[!…]

Любой символ, кроме содержащихся символов в списке

Директивы Option Compare Binary и Option Compare Text

При помощи директивы Option Compare Binary можно задать режим бинарного сравнения операндов, то есть сравнения на основе совпадения числовых значений байтов. Режим текстового сравнения задается при помощи директивы Option Compare Text. При этом различие между заглавными и строчными литерами не принимается во внимание.

Примеры использования операции Like

Dim MySearchValue As String Dim MyResult As Boolean

...

MySearchValue = "Иванов, год 1990"

Попробуем теперь сравнить строку, содержащуюся в переменной MySearchValue с различными масками, используя операцию Like и помещая результат сравнения в логическую перемен-

ную MyResult:

MyResult = MySearchValue Like "Ив???в, *"

В переменной MyResult содержится значение True.

MyResult = MySearchValue Like "*1991"

В переменной MyResult содержится значение False.

MyResult = MySearchValue Like "*, год 199#"

Синтаксические конструкции языка VBA 277

В переменной MyResult содержится значение True.

MyResult = MySearchValue Like "И[вбд]ано[вк], *"

В переменной MyResult содержится значение True.

MyResult = MySearchValue Like "Ив[ае]н[ою]к, *"

В переменной MyResult содержится значение False.

Операции со строками

Объединение строковых значений можно выполнить при помощи знаков “+” или “&”. Оба способа идентичны по сути выполняемого действия, однако, отличаются по некоторым сопутствующим обстоятельствам, которые могут сопровождать их использование.

Рассмотрим следующий код:

Dim MyString As String

MyString = “Раз, ”

MyString = MyString + “два, ”

MyString = MyString & “три.”

MsgBox MyString

Нетрудно убедиться, что в переменной MyString содержится значение “Раз, два, три.” Обычно не рекомендуют использовать символ “+” по той причине, что этим же символом обо-

значается операция арифметического сложения. Если использовать данные типа Variant и не указывать явно тип переменных, которыми предполагается оперировать, то привычка использовать знак “+” для объединения строк может сыграть с программистом злую шутку. Например, думая, что объединяются строки “1” и “1”, на самом деле получится арифметическая сумма — число 2 вместо строки “11”.

Однако символ “&”, который обычно рекомендуют использовать вместо символа “+” для объединения строк, также не лишен некоторого коварства. Дело в том, что ради совместимости со старыми вариантами языка BASIC, в Visual Basic поддерживается “древний” способ сокращенного указания типа переменных. В частности, символ “&” в конце имени переменной соответствует ти-

пу Long. Если пропустить пробел перед “&”, то конструкция будет воспринята компилятором, как объявление целочисленной переменной.

см. также в этой главе раздел “Long”.

Управляющие конструкции языка

Под управляющими конструкциями понимают обычно операторы (инструкции) и встроенные функции языка, при помощи которых осуществляется управление ходом выполнения программы. Сюда относят циклы разного рода, условные и безусловные переходы, а также конструкции ветвления (условные операторы), благодаря которым управление получает тот или иной фрагмент исходного кода.

Переход по метке

Оператор GoTo

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

278 Приложение. VBA, как язык программирования: данные, синтаксис и функции

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

...

On Error GoTo MyError1

...

...

Exit Sub

MyError1:

MsgBox "Произошла ошибка 1"

End Sub

Оператор GoSub…Return

Другой вариант безусловного перехода представлен оператором GoSub. Этот оператор также передает управление на заданную метку, однако, затем, когда в выполняемом коде встретится оператор Return, управление вернется к строке кода, следующей за GoSub. Такой механизм используют для вызова подпрограмм. Например:

...

GoSub MySubSub1

...

GoSub MySubSub2

...

...

Exit Sub

MySubSub1:

MsgBox "Вызвана подпрограмма MySubSub1"

Return

MySubSub2:

MsgBox "Вызвана подпрограмма MySubSub2"

Return

End Sub

Операторы цикла

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

Öèêë While …Wend

Заключенная между строками While и Wend группа операторов выполняется циклически до тех пор, пока выражение в строке While возвращает значение True. Если условие не выполняется уже при входе в цикл, тело цикла не будет выполнено, а управление программой будет передано оператору, следующему за оператором Wend. Вот как, например, можно было бы организовать “сканирование” диапазона 20...100 в обратном направлении, от 100 к 20:

Dim Counter As Integer

...

Counter = 100 While Counter >= 20

...

Counter = Counter - 1

Wend

Синтаксические конструкции языка VBA 279

Этот цикл будет выполнен 81 раз.

Öèêë Do … Loop

Это наиболее универсальный вариант цикла, подходящий для решения любых циклических задач. Циклическая конструкция Do…Loop существует в двух вариантах, отличающихся способом задания условия выхода из цикла. Условие While (вариант Do While...) означает “выполнять, пока...”. Условие Until (вариант Do Until...) означает “выполнять, пока не...”.

Заключенная между строками Do и Loop группа операторов выполняется циклически, пока условие While сохраняет значение True, или пока условие Until не примет значение True. Например:

Do While ...

...

If ... Then

Exit Do

End If

...

Loop

В любом месте цикла можно использовать оператор Exit Do для досрочного выхода их цикла при выполнении какого-то дополнительного условия.

Проверку выполнения условия можно поместить в начало или в конец цикла. В этом случае допустимы следующие варианты Do While [условие] ... Loop, Do Until [условие]

... Loop, Do ... Loop While [условие] и Do ... Loop Until [условие]. На-

пример:

Do

...

If ... Then

Exit Do

End If

...

Loop Until ...

Вот как, например, цикл Do Until используют для чтения из текстового файла с подсчетом числа прочитанных строк (условие Until EOF означает “пока не конец файла”):

Dim DatRec(1500) As String Dim I As Integer

I = 1

Open "C:\MyText.txt" For Input As #1

...

Do Until EOF(1)

Input #1, DatRec(I) I = I + 1

Loop

Close #1

Öèêë For …Next

Количество проходов цикла определяется начальным и конечным значениями счетчика, а также значением шага. Если шаг цикла не указан, то он будет принят равным 1. Следующий цикл будет выполнен 100 раз, причем счетчик цикла (переменная I) на каждом проходе будет увеличивать свое значение на 1:

280 Приложение. VBA, как язык программирования: данные, синтаксис и функции

For I=1 To 100

...

Next I

Следующий цикл будет выполнен 10 раз, причем счетчик цикла (переменная I) на каждом проходе будет увеличивать свое значение на 10:

For I=10 To 100 Step 10

...

Next I

Отсчет можно производить и в обратном направлении, для этого значение шага должно быть отрицательным:

For I=100 To 10 Step -10

...

Next I

Öèêë For Each …Next

При помощи конструкции For...Each можно организовать перебор всех объектов, принадлежащих к некоторому семейству. На каждом проходе переменная цикла будет содержать в себе очередной объект семейства. Доступ к свойствам и методам объекта при этом становится возможным через имя переменной цикла. Если объявлена объектная переменная MyWord:

Dim MyWord As Object

то перебор всех слов в текущем документе можно организовать следующим образом:

For Each MyWord In ActiveDocument.Words

...

Next MyWord

Принятие решений: операторы ветвления (условные конструкции)

Для принятия решений в процессе выполнения программы используют разнообразные условные конструкции. Подобно циклам, многие из них взаимозаменяемы, — в сущности, любые виды принятия решений (так же, как и любые циклические конструкции) можно реализовать при помощи простейшего оператора If ... Then ... Else ... End If. Но зачастую выбор подходящей конструкции значительно упрощает работу программиста. Такие конструкции называют иногда операторами ветвления, поскольку они обозначают разветвляющиеся пути выполнения программы.

Функция Switch

Функция-переключатель Switch служит для присваивания одного из значений при выполнении одного из условий. Функция Switch возвращает первое значение, если истинным окажется первое условие, второе значение, если истинным окажется второе условие и т.д. Проверка условий выполняется слева направо. Например:

Dim MyNum As Integer

Dim MyText As String

MyNum = ...

MyText = Switch(MyNum <= 11, "Маловато будет!", _

MyNum > 11, "O.K.",…)

Синтаксические конструкции языка VBA 281

MsgBox MyText

Если ни одно из условий в списке не выполнилось, функция возвращает значение Null. Неза-

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

Функция Choose

Эта функция во всем похожа на Switch — отличие заключается в том, что выражениепереключатель указывается один раз в начале списка вариантов. Функция возвращает то значение из списка, порядковый номер которого соответствует значению выражения-переключателя. Например:

Dim KodKlienta As Integer

Dim Klient As String

KodKlienta = 2

Klient = Choose(KodKlienta, "Иванов", "Петров", "Сидоров")

В строковой переменной Klient в результате будет содержаться значение “Петров”.

Если значение выражения-переключателя не соответствует числу элементов в списке, функция вернет значение Null.

Функция IIf

Возвращает одно из двух значений в зависимости от логического значения, которое примет выражение-условие. Например:

Dim MyNum As Integer

Dim MyText As String

MyNum = ...

MyText = IIf(MyNum <= 11, "Маловато будет!", "O.K.")

MsgBox MyText

Конструкция If …Then …Else …End If

Эта конструкция обеспечивает выполнение одного или нескольких операторов в зависимости от истинности или ложности заданного условия. Роль условия должно играть выражение, возвращающее логическое (булево) значение True или False. Существует два варианта синтаксиса условного оператора If. Вот как выглядит вариант записи в одну строку не требующий завершения этой конструкции словом End If:

If ... Then ... Else ...

Если в “ветвях” Then или Else должны выполняться несколько операторов, то конструкция разворачивается в несколько строк:

If ... Then

...

Else

...

End If

Если условие в строке If выполняется или же там содержится логическое значение True (например, переменная типа Boolean), то будет выполняться ветвь Then, в противном случае выполняется ветвь Else (которая может отсутствовать в обоих вариантах синтаксиса). Например:

282 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Dim MyNum As Integer

MyNum = ...

If MyNum <= 11 Then

MsgBox "Маловато будет!"

Else

MsgBox "О.К."

End If

Конструкция Select Case …End Select

Конструкция Select Case “принимает решение” на основе значения выраженияпереключателя и передает управление одной из групп операторов.

Список значений для каждого из вариантов можно задать несколькими способами.

При помощи символов операций сравнения “>”, “<”, “<>”, “<=” и т.д.

В виде интервала “НачальноеЗначение” To “КонечноеЗначение”.

Простым перечислением: “Значение1”, “Значение2”, “Значение3”.

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

После этого управление получит строка, следующая после строки End Select.

Если ни в одна из Case-строк не “сработает”, возникнет ошибка выполнения. Чтобы этого избежать, следует использовать строку Case Else, где указываются операторы, подлежащие выполнению во всех остальных случаях. Например:

Dim MyNum As Integer

Dim MyText As String

MyNum = ...

Select Case MyNum

Case < 11

MyText = “Маловато будет!”

Case 18

MyText = “Ровно восемнадцать”

Case 19 To 25

MyText = “От 19 до 25”

Case 30, 40, 50, 60

MyText = “Круглые числа!”

Case >100

MyText = “Больше ста!”

Case Else

MyText = “Не знаю, что тут сказать...”

End Select

MsgBox MyText

Операторы и встроенные функции языка VBA

Очень часто разница между оператором (инструкцией) языка и встроенной функцией малозаметна. В самом деле, например, оператор MsgBox и функция MsgBox решают одну и ту же задачу

— вывод сообщения на экран и часто нет необходимости задумываться, о чем именно идет речь: о

Операторы и встроенные функции языка VBA 283

функции или об операторе. Просто одно и то же зарезервированное (ключевое) слово MsgBox используется двумя способами: его можно записать, как оператор с параметрами или же, как возвращающую значение функцию с параметрами, заключенными в скобки.

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

Интерфейс с пользователем

Простейшие задачи пользовательского интерфейса заключаются в выводе сообщений пользователю и в получении реакции пользователя в каком-нибудь определенном виде — будь то строка, введенная с клавиатуры или же выбор одной из кнопок в окне сообщения.

Вывод сообщений (функция MsgBox)

Функция MsgBox может использоваться как функция, возвращающая значение (при этом она возвращает целое число, сигнализирующее о том, какую из кнопок в окне сообщения выбрал пользователь), или же, как обычный оператор, или процедура с параметром — текстом сообщения.

Первый параметр. Текст сообщения задается первым параметром. Сообщением может быть строка длиной до тысячи символов. Эта строка может состоять из нескольких физических строк. Для этого в нее следует включить символы возврата каретки и перевода строки — Chr(10) и Chr(13), соответственно, или предопределенную константу vbCr.

Второй параметр. Если указывается второй (необязательный) параметр, то он должен представлять собой сумму предопределенных констант Visual Basic, которые указывают набор кнопок в окне сообщения, значок в окне сообщения, а также другие параметры окна. В табл. П.5 приведены константы Visual Basic, сумма которых задает характеристики окна сообщения.

ТАБЛИЦА П.5. КОНСТАНТЫ VISUAL BASIC, ОПРЕДЕЛЯЮЩИЕ НАБОР КНОПОК В ОКНЕ СООБЩЕНИЯ MSGBOX

Константа

Назначение

 

 

VbOKCancel

В окне сообщения присутствуют кнопки OK и Отмена (Cancel).

VbAbortRetryIgnore

В окне сообщения присутствуют кнопки Прервать (Abort), Повто-

 

рить (Retry) и Пропустить (Ignore).

VbYesNoCancel

В окне сообщения присутствуют кнопки Да (Yes), Нет (No) и Отмена

 

(Cancel).

VbYesNo

В окне сообщения присутствуют кнопки Да (Yes) и Нет (No).

VbRetryCancel

В окне сообщения присутствуют кнопки Повторить (Retry) и Отмена

 

(Cancel).

VbCritical

В окне сообщения присутствует значок “Критическое сообщение”.

VbQuestion

В окне сообщения присутствует значок “Предупреждающий запрос”.

VbExclamation

В окне сообщения присутствует значок “Предупреждение”.

VbInformation

В окне сообщения присутствует значок “Информационное сообще-

 

ние”.

VbApplicationModal

Окно сообщения обладает модальностью на уровне приложения: что-

 

бы продолжить работу с текущим приложением, необходимо ответить

 

на данное сообщение.

VbSystemModal

Окно сообщения обладает модальностью на уровне системы: все при-

 

ложения будут недоступны до тех пор, пока пользователь не ответит

284 Приложение. VBA, как язык программирования: данные, синтаксис и функции

на данное сообщение.

Третий параметр (необязательный) определяет заголовок окна сообщения. Если его опустить, то заголовок окна сообщения будет содержать название приложения, в среде которого выполняется VBA-код.

Например, следующий код выведет на экран окно сообщения с заданным текстом, значком “Информационное сообщение” и заголовком “Клиенты” (рис. П.2). Кнопка OK присутствует в окне по умолчанию:

MsgBox "Нет такого клиента", vbInformation, "Клиенты"

Рис. П.2. Простейшее окно сообщения

Рис. П.3. Параметры окна сообщения задают

 

наличие двух кнопок и значка

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

Dim MyMes As String

Dim UserAnswer As Integer

MyMes = "Поиск в таблице закончен." + vbCr MyMes = MyMes + "Продолжить поиск сначала?"

UserAnswer = _

MsgBox(MyMes, vbQuestion+vbYesNo+vbSystemModal, "Клиенты")

If UserAnswer = vbYes Then

MsgBox "Продолжаем поиск..."

Else

MsgBox "Поиск завершен."

End If

Модальность системного уровня — режим отображения окна, при котором пользователь не сможет перейти к другому приложению и не сможет сделать вообще ничего, пока не ответит на вопрос. В окне присутствуют кнопки Äà и Íåò, а также значок “Предупреждающий запрос”. Текст

сообщения создается в переменной MyMes, при этом он разбивается на две строки при помощи константы vbCr. Результат изображен на рис. П.3.

Ввод данных (функция InputBox)

Функция InputBox служит для ввода строковых значений. При этом в окне содержится текст

приглашения, подобный тексту сообщения функции MsgBox, а в поле ввода может содержаться “строка по умолчанию” — строка, которую пользователь может удалить (первой будет нажата клавиша, соответствующая одному из печатаемых символов) или отредактировать (первой будет нажата одна из клавиш редактирования).

Соседние файлы в папке Книги