Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

Глава 8. Основы программирования на VBA

237

Sub C lo s e ln a c tiv e ()

 

 

Dim Book

as Workbook

 

For Each

Book In

Workbooks

 

I f

Book.Name

<> ActiveW orkbook.Nam e Then B ook.C lose

 

Next

Book

 

 

 

End Sub

 

 

 

 

Чаще всего конструкция For Each - Next применяется для циклического обхода

всех ячеек диапазона. В следующем примере конструкция For Each -

Next вызыва­

ется после того, как пользователь выбрал диапазон ячеек. В данном случае объект S e­ le c tio n выступает в качестве коллекции, которая состоит из объектов Range, по­ скольку каждая ячейка в выделенной области представляет собой объект Range. Проце­ дура проверяет каждую ячейку, а затем использует функцию VBA UCase для преобразования ее содержимого в символы верхнего регистра. (При этом числовые ячейки не изменяются.)

Sub MakeUpperCase()

 

Dim

C e ll

as Range

For

Each

C e ll

In

S e le c tio n

C e ll.V a lu e

=

U C a se (C e ll.V a lu e )

Next

C e ll

 

 

 

End Sub

 

 

 

 

В VBA существует способ выхода из цикла For-N ext до того, как будут проверены все элементы коллекции. Для этого используется оператор E x it For. В приведенном ни­ же примере выбирается первое отрицательное значение в первой строке активного листа.

Sub S e le c tN e g a tiv e ()

 

 

Dim

C e ll

As Range

Range( " 1

:1 " )

For

Each

C e ll In

I f

C e ll.V a lu e

< 0 Then

 

 

 

C e ll . S e le c t

 

 

 

 

E x it For

 

 

End

I f

 

 

 

Next

C e ll

 

 

 

End Sub

 

 

 

 

 

В рассматриваемом примере используется конструкция If-T h e n для проверки зна­ чения каждой ячейки. Если ячейка содержит отрицательную величину, она выбирается, причем завершение цикла происходит после выполнения оператора E x it For.

Контроль за выполнением кода

Некоторые процедуры VBA начинают выполняться с первых строк кода. Этот про­ цесс происходит построчно до самого конца процедуры (например, так всегда работают макросы, записанные при выполнении действий). Однако иногда необходимо контроли­ ровать последовательность операций, пропуская отдельные операторы, повторно выпол­ няя некоторые команды и проверяя условия для определения следующего действия, вы­ полняемого процедурой.

В предыдущем разделе описана конструкция For Each-N ext, которая является циклической структурой. В настоящем разделе речь пойдет о дополнительных способах контроля за выполнением процедур, написанных на VBA:

оператор GoTo;

конструкция I f - Then;

238

Часть III. Visual Basic for Applications

конструкция S e le c t Case;

цикл F o r - N e x t;

цикл Do

W h ile ;

цикл Do

U n t il .

Оператор GO T O

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

В приведенной ниже процедуре применена функция VBA In p u tB o x для получения имени пользователя. Если имя пользователя отличается от Ховард, то процедура пере­ ходит к метке WrongName, на чем заканчивает свою работу. В противном случае проце­ дура выполняет дополнительные операции. Оператор E x it Sub заканчивает выполне­ ние процедуры.

Sub

GoToDemo()

 

 

 

 

 

UserName =

In p u tB o x ( "Введите

свое

и м я :")

 

I f UserName

<> "Ховард" Then

GoTo

WrongName

 

MsgBox

("П ривет,

Х о в а р д ...")

 

 

 

1 - [Здесь вводится дополнительный

код] -

 

E x it Sub

 

 

 

 

WrongName:

 

 

 

 

 

 

MsgBox

"Извините,

эту процедуру может запускать только Ховард."

End

Sub

 

 

 

 

 

Представленная процедура работает, но оператор GoTo, как правило, используется, если другого способа выполнить действие просто не существует. Единственной ситуаци­ ей, когда оператор GoTo в VBA действительно необходим, является перехват ошибок (см. главу 9).

Вряд ли представленный выше пример следует рассматривать в качестве эффектив­ ной меры защиты!

Конструкция I£-Then

Вероятно, конструкция If-T h e n чаще остальных используется для группирования инструкций VBA. Эта популярная конструкция наделяет приложения способностью при­ нимать решения. Такая способность является ключевой при создании эффективных про­ грамм. Удачное приложение Excel, по сути, сводится к принятию правильного решения

и выполнению соответствующих действий.

 

Стандартный синтаксис конструкции If - T h e n

таков:

I f усл о в и е Then инст рукции_ист ина [E lse

инст рукции_лож ь]

Конструкция I f - T h e n используется для выполнения одного или более операторов при справедливости заданного условия. Оператор E ls e необязателен. Он позволяет вы­ полнять одну или более инструкций в случае несправедливости условия.

Глава 8. Основы программирования на VBA

239

В описанной ниже процедуре применена структура If-T h e n без оператора E lse . Пример связан с управлением временными данными. VBA использует систему дат ивремени, похожую на задействованную в Excel. Время дня выражается дробным чис­ лом, например полдень представлен как 0 .5 . Функция VBA Time возвращает значение, представляющее время в формате системных часов. В следующем примере сообщение отображается, если текущее время меньше полудня. Если текущее системное время больше или равно 0 . 5, то процедура заканчивается, и ничего не происходит.

Sub G reetM elO

I f Time < 0 .5 Then MsgBox "Доброе утро "

End Sub

Можно переписать этот код, воспользовавшись несколькими операторами, как пока­ зано ниже.

Sub G reetM elaO

I f

Time <

0 .5 Then

 

MsgBox

"Доброе утро"

End

I f

 

End Sub

Обратите внимание, что оператору I f соответствует оператор End I f . В этом при­ мере вызывается на выполнение только один оператор, если условие равно True. Между операторами I f и End I f можно поместить любое количество операторов.

Если нужно отобразить другое приветствие, когда наступает вторая половина дня, добавьте еще один оператор I f - Then, как показано ниже.

Sub GreetMe2 ()

 

 

 

 

I f

Time

<

0 .5

Then

MsgBox

"Доброе

утро"

I f

Time

>=

0 .5

Then

MsgBox

"Добрый

день"

End Sub

Обратите внимание, что для второй конструкции If-T h e n использован оператор >= (больше или равно). Таким образом учитывается случай, когда время на часах точно равно 12.00.

Другой подход — использовать оператор E lse конструкции If-T h en .

Sub GreetM e3()

 

I f Time <

0 .5 Then

MsgBox "Доброе утро" E lse _

MsgBox

"Добрый

день"

End Sub

 

 

Обратите внимание, что был использован символ продолжения строки; If- T h e n - Else является фактически одним оператором.

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

Sub GreetMe3a()

 

I f Time <

0 .5 Then

 

MsgBox

"Доброе

утро"

' Здесь

вводятся другие операторы

' Else

"Добрый

день "

MsgBox

1 Здесь вводятся другие операторы End I f

End Sub

240

Часть III. Visual Basic for Applications

Если вам необходимо расширить процедуру до обработки трех условий (например, утро, день и вечер), то можете использовать либо три оператора If-T h en , либо вложен­ ную структуру I f -T h en -E lse . Первый вариант значительно проще.

Sub

G reetM e4()

 

 

 

 

 

I f

Time

<

0 .5 Then

MsgBox "Доброе утро"

 

I f

Time

>=

0

.5

And

Time < 0.75 Then

MsgBox "Добрый день"

End

I f

Time

>=

0

.75

Then MsgBox "Добрый

вечер"

Sub

 

 

 

 

 

 

Значение 0 . 75 представляет время 18:00— три четверти суток и тот момент, когда день переходит в вечер.

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

I f условие Then

[и н ст рукци и_и ст ин а ]

[E ls e If у с л о в и е -п Then

[а л ь терна т ивны е_инст рукции] ]

[E lse

[операт оры _по_ум олчанию ] ]

End I f

Этот же синтаксис можно использовать для введения кода процедуры GreetMe5.

Sub

G reetM e5()

 

 

I f

Time <

0 .5 Then

 

 

 

MsgBox

"Доброе

утро"

 

E ls e lf Time >= 0 .5

And Time < 0.75 Then

 

 

MsgBox

"Добрый

день"

 

E lse

 

 

 

 

MsgBox

"Добрый

вечер"

 

End

I f

 

 

End

Sub

 

 

Если в представленном синтаксисе условие выполняется, то выполняются соответст­ вующие операторы, после чего конструкция If-T h e n заканчивается. Другими словами, при этом не оцениваются дополнительные условия. Такой синтаксис наиболее эффекти­ вен, однако многим эта программа может показаться сложной для понимания.

Далее представлен еще один способ реализовать рассматриваемый пример. В нем ис­ пользуются вложенные конструкции If - T h e n - E ls e (без E ls e lf ) . Данная процедура также эффективна, и ее легко понять. Обратите внимание, что для каждого оператора If существует свой оператор End I f .

Sub G reetM e6()

 

 

 

I f Time <

0 .5

Then

 

MsgBox

"Доброе утро"

E lse

 

 

 

 

I f Time >=

0 .5 And Time < 0.75 Then

MsgBox

"Добрый

день"

E lse

 

 

 

 

I f

Time

>=

0.75

Then

 

MsgBox

"Добрый вечер"

T ru e .

Глава 8. Основы программирования на VBA

241

End I f

End I f

End I f

End Sub

Ниже продемонстрирован еще один пример, использующий простую форму конст­ рукции If - T h e n . Процедура запрашивает у пользователя значение переменной Q uan­ t i t y и отображает скидку на основе полученного значения. Если в окне In p u tB o x пользователь щелкнет на кнопке Отмена, то переменная Q u a n tity приравняется к пус­ той строке, в результате чего процедура будет завершена. Следует отметить, что эта про­ цедура не выполняет других проверок (например, мы не проверяем в данном случае вве­ денное числовое значение на отрицательность).

Sub D is c o u n tlO

 

 

 

 

 

 

 

Dim

Q u a n tity

As

V a ria n t

 

 

 

 

Dim D is c o u n t

As

Double

 

 

 

 

 

Q u a n tity = In p u tB o x ( "Введите значение:

")

 

I f

Q u a n tity

= ""

Then

E x it

Sub

 

 

 

I f

Q u a n tity

>=

0

Then

D is c o u n t =

0 .1

 

I f

Q u a n tity

>=

25

Then

D is c o u n t

=0.15

I f

Q u a n tity

>=

50

Then

D is c o u n t

=0.2

I f

Q u a n tity

>=

75

Then

D is c o u n t

=0.25

MsgBox "С кидка:

" & D is c o u n t

End Sub

 

Обратите внимание,

что каждый оператор I f - T h e n в представленной процедуре

всегда выполняется, а значение D is c o u n t может изменяться. Однако в результате все­ гдаотображается нужное значение.

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

Sub D iscount2 ()

 

 

 

 

 

 

Dim Q u a n tity

As

V a ria n t

 

Dim D isco u n t

As

Double

 

Q u a n tity = In p u tB o x ( "Укажите

количество: 11)

I f

Q u a n tity

=

""

Then

E x it Sub

I f

Q u a n tity

>=

0 And

Q u a n tity

< 25 Then

 

D isco u n t

=

0 .1

 

 

 

E ls e lf Q u a n tity

<

50

Then

 

 

D isco u n t

=

0.15

 

 

 

E ls e lf Q u a n tity

<

75

Then

 

 

D isco u n t

=

0.2

 

 

 

Else

 

 

 

 

 

 

 

D iscou nt

=

0.25

 

 

 

End I f

 

 

 

 

 

 

MsgBox "С кидка:

"

& D is c o u n t

 

End Sub

 

 

 

 

 

 

Вложенные структуры I f - T h e n достаточно громоздкие. Поэтому рекомендуется ис­ пользовать их только для принятия простых бинарных решений. Если же необходимо выбрать между тремя и более вариантами, то целесообразно обратиться к конструкции Select Case, которая рассматривается далее.