
Информатика_1 / Информатика / VBA Excel 2007
.pdfПример: Если скидка 5 % применяется только к суммам больше 1000, то в VBA это запишется следующим образом:
If Сумма > 1000 Then Скидка = 0.05
При блочной структуре:
If Сумма > 1000 Then
Скидка = 0.05
Else
Скидка = 0 End If
Если дерево условий более сложное, используется оператор If – Then – ElseIf, позволяющий проверять множественные условия.
If Условие1 Then
Инструкции1] ElseIf Условие2 Then
[Инструкции2]
[Else
[Инструкции _else]
End if]
Первым проверяется Условие1. Если оно имеет значение True, то выполняются Инструкции1, и выполнение программы продолжается со строки, следующей за ключевым словом End If. В противном случае проверяется Условие2, и т.д., пока не встретится либо условие, имеющее значение True, либо ключевое слово Else.
Пример. В зависимости от вводимого числа выдается сообщение о принадлежности числа:
Либо интервалу [0, 1]
Либо интервалу (1, 2]
Либо о не принадлежности числа этим двум интер-
валам
X = InputBox(“Введите число”)
If (0<=x) and (x<=1) then
MsgBox “Число из интервала [0, 1]”
ElseIf (1<x) And (x<=2) Then
21
MsgBox “Число из интервала (1, 2]”
Else
MsgBox “Число либо отрицательное, либо больше 2]”
End If
Оператор выбора. Если нужно проверить несколько условий, то оператор If – Then может стать слишком сложным. В этом случае применяется оператор выбора, он выполняет одну из нескольких групп инструкций, в зависимости от значения выражения.
Синтаксис:
Select Case Выражение
[Case СписокВыражений-1 [Инструкции-1]]
…
[Case
[Инструкции-n]] [Case Else
[Инструкции_Else]]
End Select
СписокВыражений – это список с разделителями, состоящий из одной или нескольких форм следующего вида:
Выражение, Выражение To Выражение, Is ОператорСравнения Выражение, где Выражение – любое числовое или строковое выражение. Ключевое слово To задает диапазон значений. При использовании ключевого слова To перед ним должно находиться меньшее значение. Ключевое слово Is с оператором сравнения задает диапазон значений. Если ключевое слово Is не указано, оно вставляется по умолчанию.
Инструкции – это одна или несколько инструкций, выполняемых в том случае, если выражение совпадает с любым компонентом списка от СписокВыражений-1 до СписокВы- ражений-n
Инструкции_Else – одна или нескольких инструкций, выполняемых в том случае, если выражение не совпадает ни
22
с одним из предложений Case. Пример.
Число = InputBox(“Введите целое число”)
Select Case Число Case 1
MsgBox “Число равно 1”
Case 2, 3
MsgBox “Число равно 2 или 3”
Case 4 To 6
MsgBox “Число от 4 до 6”
Case Is >= 7
MsgBox “Число не менее 7”
End Select
Операторы повторения (цикла):
Оператор For - Next
Повторяет выполнение группы инструкций указанное число раз. Синтаксис:
For Счетчик = Начало To Конец [Step Шаг] [Инструкции]
[Exit For]
[Инструкции] Next [Счетчик]
Счетчик изменяется от Начала до Конца с указанным шагом. Если Шаг не указан, он полагается равным 1. Альтернативный способ выхода из цикла предоставляет инструкция
Exit For.
Пример. Суммирование элементов выделенного диапа-
зона.
With Selection
n = .Rows.Count
m = .Columns.Count End With
S = 0
For i = 1 To n For j = 1 To m
23
S = S + Selection.Cells(I,j).Value Next j
Next i
With Selection.End(xlDown)
.Offset(1, 0).Value = “Сумма”
.Offset(1, 1).Value = S End With
В ячейку под первым столбцом выделенного диапазона выводится надпись «Сумма», а найденное значение выводится в соседнюю с ней справа ячейку.
Оператор For Each
Повторяет выполнение группы инструкций для каждого элемента массива или семейства.
Синтаксис:
For Each Элемент In Группа
[Инструкции]
[Exit For]
[Инструкции] Next [Элемент]
Примеры.
1. Суммирование элементов выделенного диапазона.
S = 0
For Each c In Selection.Cells S = S + c.Value
Next c
MsgBox s
2. Из рабочей книги удаляется рабочий лист Тест, если такой лист в ней есть.
For Each Лист In Worksheets
If Лист.Name = “Тест” Then
Лист.Delete
End If
Next Лист
3. Ячейки диапазона А1:С4 с положительными значениями окрашиваются в синий цвет, а с неположительным – в
24
красный.
For Each Ячейка In Range(“A1:C4”).Cells
With Ячейка
If .Value <= 0 Then
.Interior.ColorIndex = 3
Else
.Interior.ColorIndex = 5 End If
End With Next Ячейка
Оператор While – Wend
Выполняет последовательность инструкций, пока заданное условие имеет значение True.
Синтаксис:
While Условие [Инструкции]
Wend
Пример. Из последовательности случайных чисел выделяется значение 7.
LotteryEntry = 0
While LotteryEntry <> 7
LotteryEntry = Int(10*Rnd())
Beep
Wend
MsgBox “Ваш номер равен ” & LotteryEntry
Оператор Do – Loop
Выполняет последовательность инструкций, пока заданное условие имеет значение True (случай While) или пока оно не примет значение True (случай Until).
Синтаксис:
Do [{While | Until} Условие] [Инструкции]
[Exit Do]
[Инструкции]
Loop
25
Или
Do [{While | Until} Условие]
[Инструкции]
[Exit Do]
[Инструкции]
Loop [{While | Until} Условие]
В любом месте управляющей структуры Do - Loop может быть размещено любое число инструкций Exit Do, обеспечивающих альтернативные возможности выхода из цикла
Do - Loop
Примеры.
1. Из последовательности случайных чисел выделяется значение 7 (различные варианты использования цикла Do – Loop).
LotteryEntry = 0
Do Until LotteryEntry = 7 LotteryEntry = Int(10*Rnd()) Beep
Loop
MsgBox “Ваш номер равен ” & LotteryEntry
LotteryEntry = 0 Do
LotteryEntry = Int(10*Rnd())
Beep
Loop Until LotteryEntry = 7
MsgBox “Ваш номер равен ” & LotteryEntry
LotteryEntry = 0
Do While LotteryEntry <> 7 LotteryEntry = Int(10*Rnd())
Beep Loop
MsgBox “Ваш номер равен ” & LotteryEntry
26
LotteryEntry = 0 Do
LotteryEntry = Int(10*Rnd()) Beep
Loop While LotteryEntry <> 7
MsgBox “Ваш номер равен ” & LotteryEntry
2. Суммирование вводимых чисел Завершение – ввод любого строкового выражения (пример альтернативного выхода из цикла).
S = 0 Do
X = InputBox(“Введите число”)
If Not IsNumeric (X) Then Exit Do S = S + X
Loop
2.5. Процедура
Процедура является самостоятельной частью кода, которая может иметь параметры, изменять их значения и выполнять последовательность инструкций.
Синтаксис процедуры Sub:
[Private | Public] [Static] Sub Имя
[(СписокПараметров)]
[Инструкции]
[Exit Sub]
[Инструкции]
End Sub
Параметр |
Описание |
Public |
Процедура Sub доступна для всех других про- |
|
цедур во всех модулях |
Private |
Процедура Sub доступна для других процедур |
|
только того модуля, в котором она описана |
Static |
Локальные переменные процедуры Sub сохра- |
|
няются в промежутках времени между вызо- |
|
вами этой процедуры |
27
Параметр |
Описание |
|
|
|
|
Имя |
Имя процедуры Sub, удовлетворяющее стан- |
|
|
дартным правилам именования переменных |
|
СписокПарамет- |
Список параметров, значения которых пере- |
|
ров |
даются в процедуру или возвращаются из про- |
|
цедуры при ее вызове. Разделитель – запятая. |
||
|
||
Инструкции |
Любая группа инструкций. |
Инструкция Exit Sub приводит к немедленному выходу из процедуры.
Синтаксис СпискаПараметров:
[Optional] [ByVal | ByRef] [ParamArray]
ИмяПеременной [()] [As Тип] [= ПоУмолчанию]
Параметр |
Описание |
|
|
Optional |
Ключевое слово, указывающее, что параметр не |
|
является обязательным. При использовании этого |
|
параметра, все последующие параметры из списка |
|
тоже должны быть необязательными. Все они |
|
должны иметь тип Variant. Не допускается ис- |
|
пользование Optional для любого из параметров, |
|
если используется ключевое слово ParamArray |
ByVal |
Указывает, что параметр передается по значе- |
|
нию |
ByRef |
Указывает, что параметр передается по ссылке |
|
(используется по умолчанию) |
ParamArray |
Позволяет задавать произвольное количество |
|
параметров. Не может быть использовано со сло- |
|
вами ByVal, ByRef, Optional |
ИмяПеремен- |
Имя переменной, удовлетворяющее стандарт- |
ной |
ным правилам именования переменных |
|
|
Тип |
Допустимы типы: Byte, Boolean, Integer, Long, |
|
Currency, Single, Date, String< Variant. При отсут- |
|
ствии ключевого слова Optional, могут быть ука- |
|
заны также объектный тип и тип, определяемый |
|
пользователем. |
ПоУмолчанию |
Используется только вместе с параметром Op- |
|
tional. Если указан тип Object, единственным зна- |
|
чением по умолчанию может быть значение Noth- |
|
ing |
28
Синтаксис процедуры Function:
[Private|Public] [Static] Function Имя
[(СписокПараметров)] [As Тип] [Инструкции]
[Имя = Выражение]
[Exit Function]
[Инструкции] [Имя = Выражение]
End Function
Синтаксис процедуры Function содержит те же элементы, что и процедура Sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Это также самостоятельная процедура, которая может получать значения параметров, выполнять последовательность инструкций и изменять значения параметров. Но процедура Function может применяться в правой части выражения, как и любая другая встроенная функция. Она вызывается в выражении по своему имени, за которым следует список параметров (в скобках).
Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присваивания может находиться в любом месте процедуры.
Примеры.
1. Цикл по ячейкам диапазона. Иногда необходимо выполнить некоторую последовательность действий для каждой из ячеек диапазона. Для этого требуется способ перехода или ссылки на каждую ячейку диапазона и обычно используется оператор For Each…Next, который обрабатывает ячейки диапазона как элементы коллекции.
В следующей процедуре ячейки форматируются в зависимости от значения.
Sub ВыделениеЦветом() Dim R As Objekt
For Each R In Range(“ВводимыеДанные”)
If R.Value > 800 Then
29
R.Font.Color = RGB(0, 0, 255) R.Font.Bold = False R.Font.Italic = False
ElseIf R.Value < 500 Then R.Font.Color = RGB(255, 0, 0) R.Font.Bold = False R.Font.Italic = True
Else
R.Font.Color = RGB(0, 128, 0) R.Font.Bold = True R.Font.Italic = True
End If Next R
End Sub
2. Если в программе изменяется диапазон, вставляются или удаляются строки, то цикл For Each…Next может работать некорректно, так как коллекция определяется в начале цикла. Может произойти переход на ячейку вне диапазона, а ячейка из диапазона может быть пропущена. В таком случае используют структуру Do…Loop. Преимущество такого способа – возможность проверки логического условия каждый раз при прохождении цикла, чтобы убедиться, что конец диапазона не достигнут.
В следующей процедуре из таблицы удаляются проданные товары. Просматривается столбец G, который содержит 1, если товар закончился и 0, если товар есть. Процесс продолжается до тех пор, пока не будет найдена пустая ячейка, свидетельствующая о том, что найден конец таблицы.
Sub УдалениеПроданных()
Dim Текущая As Objekt, Следующая As
Objekt
ActiveWorkBook.Seets(“Товары”).Select
Set Текущая = ActiveSheet.Range.(“G2”)
Do While Not IsEmpty(Текущая)
Set Следующая = Текущая.Offset(1, 0)
30