Главная страница

Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования


Скачать 2.93 Mb.
НазваниеФедеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
АнкорПрограммирование VBA.pdf
Дата24.04.2017
Размер2.93 Mb.
Формат файлаpdf
Имя файлаПрограммирование VBA.pdf
ТипУчебное пособие
#4339
страница8 из 13
1   ...   5   6   7   8   9   10   11   12   13
Let] имя переменной или свойства = выражение
Элемент Let необязателен. Он унаследован от ранних версий Visual
Basic.
Выражение определяется как комбинация ключевых слов, операто- ров, переменных и констант. Эта комбинация возвращает в результате строку, число или объект. Выражение может осуществлять вычисление, обрабатывать символы или тестировать данные, присваивать значение переменной и ячейке рабочего листа или использоваться как значение свойства.
В VBA оператором присваивания выступает знак равенства (=).
Примеры х = 1 x = x + 1 х = (у * 2) / (г * 2)
Cells(1, 2).Value = "План выпуска"
FileOpen = True
FileOpen = Not FileOpen
Range ("The Year").Value = 2009
Зачастую в выражениях применяются функции. Это могут быть встроенные функции VBA, функции рабочих листов Excel или специальные функции, разработанные в VBA. Операции, выполняемые оператором присваивания, приведены в п.2.6.
2.12.2. Инструкция Set
Инструкция Set присваивает ссылку на объект переменной или свой- ству объекта. При этом переменной присваивается значение объектного выражения или значение, возвращаемое объектной функцией.
Формат инструкции Set:
Set объектная переменная = [ New] объектное выражение  Nothing
объектная_переменная – имя переменной или свойство,
New – необязательеый; задает создание нового экземпляра класса,
Объектное выражение – выражение, состоящее из имени объекта, переменной соответсвующего объектного типа, функции или метода,
Nothing – разрывает связь элемента объектная переменная с ка- ким-либо определенным объектом.
Пример
Set Диапазон = Range(“A1:А10”)
– переменной Диапазон присваивается диапазон A1:А10.

78
2.12.3. Циклы
Циклы предназначены для многократного выполнения группы инст- рукций. ВVBA для организации циклов используются инструкции For...
Next, White…Wend, Do …Loop и For Each…Next.
2.12.3.1. Инструкция For… Next
Эта инструкция повторяет выполнение группы инструкций указанное число раз.
Формат инструкции For… Next
For Счетчик = Начало То Конец [Step Шаг]
[Инструкции1]
[Exit For]
[Инструкции2]
Next [Счётчик]
Формат инструкции For… Next содержит следующие элементы:
Элемент инструкции
Описание элемента
Счетчик
Обязательный. Числовая переменная, используемая в каче- стве счётчика цикла
Начало
Обязательный. Начальное значение для Счетчик
Конец
Обязательный. Конечное значение для Счетчик
Шаг
Необязательный. Шаг изменения значения Счетчик после каждого цикла. По умолчанию используется значение 1
Инструкции
Необязательный. Один или более операторов, выполняемых определённое число раз
Пример1
В приведённой ниже процедуре TestFor подсчитывается сумма не- чётных чисел в заданном диапазоне, причём числа формируются в цикле с нарастанием на 1.
Option Explicit_________________________________________________
Sub TestFor()
'Подсчёт суммы нечётных чисел в заданном диапазоне
Dim i As Integer
Dim n As Integer
Dim Sum As Integer
Dim r As Integer n = InputBox("Ведите количество чисел", "Количество нечётных чисел") r = 0
For i = 1 To n Step 2 '(сумма нечётных чисел от 1 до n)
Sum = Sum + i r = r + 1

79
Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне от 1 до " & n & _" равна " & Sum, Buttons:=vbExclamation, _
Title:="Количество нечётных чисел"
End Sub
Ниже приведены диалоговые окна, появляющиеся при выполнении мак- роса TestFor.
Пример2
В приведённой ниже процедуре TestFor1 подсчитывается сумма нечётных чисел в диапазоне A1:J10 таблицы Excel.
В этой процедуре используются два цикла: внешний цикл с параметром цикла i и вложенный цикл с параметром цикла j.
Option Explicit_________________________________________________
Sub TestFor1()
'Подсчёт суммы нечётных чисел в заданном диапазоне
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim n As Integer
Dim Sum As Integer
Dim r As Integer n = InputBox("Ведите количество чисел в столбце", _
"Количество нечётных чисел") m = InputBox("Ведите количество чисел в строке", _
"Количество нечётных чисел") r = 0
For i = 1 To n Step 2 '(сумма нечётных чисел от 1 до n)

80
For j = 1 To m Step 1
Sum = Sum + Cells(i, j) r = r + 1
Next j
Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне" _
& Chr(13) + Chr(10) _
& " от 1 до " & n * m & " равна " & Sum, Buttons:=vbExclamation
End Sub
В процедуре TestFor2 реализован алгоритм ввода данных с клавиа- туры в ячейки рабочего листа; заполнение производится последовательно столбец за столбцом двумя циклами.
Sub TestFor2()
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim n As Integer m = InputBox("Ведите количество чисел в столбце", _
"Количество нечётных чисел") n = InputBox("Ведите количество чисел в строке", _
"Количество нечётных чисел")
For i = 1 To n Step 1 '(сумма нечётных чисел от 1 до n)
For j = 1 To m Step 1
Cells(j, i) = InputBox("Ведите значение в ячейку " & Chr(64 + i) & j, _
"Ввод данных в таблицу")
Next j
Next i
End Sub
В процедуре TestFor2 функция Chr(64 + i) возвращает (выдаёт значе- ние) строку, содержащую символ, код которого указан в качестве аргумен- та. Код 65 соответствует латинской букве A, 66 – букве B и т.д. Ниже пока- зано диалоговое окно, соответствующее функции InputBox во вложенном цикле цикле процедуры TestFor2.
2.12.3.2. Инструкция While…Wend
Инструкция While…Wend выполняет некоторую последовательность инструкций до тех пор, пока заданное условие имеет значение True (Истина).
Формат инструкции While…Wend

81
While Условие
[Инструкции]
Wend
Формат инструкции While…Wend содержит следующие элементы:
Элемент инструкции
Описание элемента
Условие
Обязательный. Числовое или строковое выражение, резуль- татом вычисления которого являются значения True или
False
Инструкции
Необязательный. Одна или более инструкций, выполняе- мых, если условие равно значению True
Если Условие имеет значение True, то выполняется весь набор ин- струкций, расположенных до инструкции Wend. После этого управление возвращается инструкции While и опять проверяется условие. Если Ус-
ловие имеет значение True, то снова выполняются все инструкции до
Wend, В противном случае выполнение программы передается на ин- струкцию, следующую за инструкцией Wend.
Циклы While...Wend могут иметь любую глубину вложенности. При этом каждая инструкция Wend соответствует предшествующей инструк- ции While.
Пример
Подсчёт суммы четных чисел от 0 до 10.
Sub TWW()
Dim k As Integer
Dim i As Integer
While k < 10 k = k + i i = i + 2
Wend
MsgBox "i=" & i & " k=" & k
End Sub
Ниже приведён результат выполнения процедуры TWW.
2.12.3.3. Инструкция Do... Loop
Для выполнения инструкциb For необходимо задать параметры.
Эти параметры могут вычисляться или задаваться во время выполнения программы, как в последней процедуре, которые точно определяют, сколько раз должен выполняться инструкция цикла. Иногда это свойство

82
инструкции For является ограничительным, и в этом случае VBA предла- гает другую инструкцию – Do... Loop, которая также может организовать повторяющиеся вычисления, но момент прекращения вычислений здесь определяется с помощью логических условий.
Существует два типа инструкции Do: Do While и Do Until. Первый из них повторяет выполнение блока инструкции до тех пор, пока заданное логическое условие истинно. Второй инструкция, Do Until, выполняет циклические вычисления до тех пор, пока изначально ложное логическое условие не станет истинным. Формат этих инструкций следующий:
Формат1
Do [{While | Until} условие]
[инструкции]
[Exit Do]
[инструкции]
Loop
Формат2
Do
[инструкции]
[Exit Do]
[инструкции]
Loop [{While | Until} условие]
Формат инструкции Do … Loop содержит следующие элементы:
Элемент инструкции
Описание элемента
Условие
Необязательный. Численное или строковое выражение, имеющее значение True или False
Инструкции
Одна или более инструкций, которые повторяются, если ус- ловие равно значению True, или до тех пор, пока оно не станет равным True
В теле инструкции (цикла) может быть любое количество инструкций
Exit Do, которые являются дополнительными средствами для окончания цикла (выхода из инструкции Do … Loop). Инструкция Exit Do часто ис- пользуется внутри Do … Loop с применением инструкции If…Then , кото- рый проверяет некоторое дополнительное условие для выхода из цикла.
Различие между этими двумя форматами состоит в следующем. В соответствии с форматом 1 логическое условие помещается в начало цик- ла. В этом случае, если логическое условие не выполняется, то инструк- ции цикла не выполняются ни разу. Во втором формате логическое усло- вие помещено в конце цикла. Поэтому инструкции цикла в любом случае будут выполнены хотя бы один раз. Инструкция Exit Do используется для экстренного выхода из цикла; обычно для этого применяются условные инструкции If и Select Case
Пример
В процедуре DWU пользователю предлагается ввести свое имя или выйти из программы. Здесь значение vbYesNo функции MsgBox при- сваивается переменной iResponse, которое анализируется инструкцией

83
If…Then…Else, и в случае равенства его внутренней константе vbYes
(нажата кнопка Ok в диалоговом окне функции MsgBox) и переменная sName имеет пустое значение, выдаётся сообщение "
Вы не ввели имя ", и происходит выход из процедуры по инструкции Exit Sub. (Инструкция
If…Then…Else будет рассмотрена позже). Если же имя введено (даже пробел!), то произойдёт выход из цикла по условию sName <> "", и вы- водится диалоговое окно с введённым именем.
Sub DWU()
Dim sName As String
Dim iResponse As Integer sName = ""
Do While sName = "" sName = InputBox("Введите свое имя: ")
If sName = "" Then iResponse = MsgBox("Вы хотите выйти из программы?", vbYesNo)
If iResponse = vbYes Then
MsgBox "Вы не ввели имя "
Exit Sub
End If
End If
Loop
MsgBox "Вы ввели имя " & sName
End Sub
При запуске процедуры DWU выводится окно, и если имя введено, то выводится окно с сообщением введённого имени.
Если же имя не введено и нажата кнопка OK или Cancel, то выводится диалоговое окно

84
и при нажатии кнопки “Да” выводится диалоговое окно
В отличие от цикла Do While цикл Do Until выполняется до тех пор, пока выражение условия имеет значение False.
Пример
Sub DUN()
Dim j As Integer
Range("K1") = 0 j = 0
Do Until Range("K1") > 8
Range("K1") = Range("K1") + j j = j + 1
Loop
End SubTextBox1.Text = Sum
В результате выполнения этого примера в ячейке K1 активного листа бу- дет выведено вычисленное значение, равное 10.
2.12.3.4. Инструкция For Each…Next
Инструкция For Each применяется для выполнения одного и того же набора операторов для элемента массива или коллекции. Инструкция For
Each имеет следующий формат:
For Each элемент In группа
[Инструкции]
[Exit For]
[Инструкции]
Next
Формат инструкции Do … Loop содержит следующие элементы:
Элемент инструкции
Описание элемента
Элемент
Обязательный. Переменная, используемая для итерации по элементам коллекции или массива. Может быть только
Variant-переменной.
Группа
Обязательный. Имя коллекции объектов или массива.
Инструкции
Необязательный. Один или более операторов, которые вы- полняются для каждого элемента в Группа
Блок For Each… выполняется, если в Группа имеется, по крайней мере, один элемент. Все инструкции цикла выполняются для каждого эле- мента Группа. После этого управление передаётся инструкции, следую- щей за ключевым словом Next.

85
Цикл For Each...Next похож на For...Next за исключением того, что он повторно выполняет одну и ту же группу операторов для каждого элемента набора объектов или массива. Это особенно полезно в том случае, когда не известно число элементов в наборе или когда их количество может из- мениться, пока работает процедура.
В приведённой ниже процедуре ForEach используется динамический массив Мас, размерность которого L определяется как целая часть произ- ведения значения случайной функции Rnd в инструкции ReDim. Опреде- ление целой части производится при помощи встроенной функции VBA
Int. Если количество элементов массива равно 0, то об этом выдаётся со- общение и происходит выход из процедуры.
По инструкции For i = 1 To L производится присвоение значений эле- ментам массива Мас случайными числами и вывод их на экран.
По инструкции For Each… осуществляется присвоение значений ячейкам A1:AL ячейкам активного рабочего листа A1: AL случайных чисел.
Option Base 1
Option Explicit
––––––––––––––––––––––––––––––––––––––––––––––––––––––
Sub ForEach()
Dim Мас() As Single
Dim L As Integer, i As Integer, k As Integer
Dim n As Variant
L = Int(Rnd * 10)
If L = 0 Then
MsgBox "Количество элементов массива равно " & L
Exit Sub
End If
MsgBox "Количество элементов массива равно " & L
ReDim Мас(L) ' Устанавливается размер динамического массива
For i = 1 To L
Мас(i) = Rnd
MsgBox "Мас(" & i & ")=" & Мас(i)
Next i k = 0
For Each n In Мас k = k + 1
Cells(1, k) = n
Next n
End Sub
В процедуре РабочиеЛисты, приведенной ниже, применена конст- рукция For Each - Next коллекции Sheets активной рабочей книги.
Sub РабочиеЛисты()
Dim ЛИСТ As Worksheet
Dim s As String

86
s=" "
For Each ЛИСТ In ActiveWorkbook.Worksheets s = s & " " & Item.Name
Next ЛИСТ
MsgBox "Рабочие Листы:" & vbCrLf & s
End Sub
При выполнении этой процедуры функция MsgBox отображает строку, со- стоящую из свойств Name (Имя листа) каждого рабочего листа:
2.12.4. Инструкции перехода
Инструкции перехода часто используются в языках программирова- ния. В них проверяется соответствие каким-то условиям и в зависимости от этого выполнение программы направляется по одной или другой ветви, или осуществляется безусловный переход в определённое место про- граммы. В VBA предусмотрено две инструкции условного перехода:
If… Then... Else
Select Case и инструкция безусловного перехода GoTo. К этой группе инструкций так- же относятся:
 инструкции On Error GoTo метка, On Error Resume Next и On Er-
ror GoTo 0, служащие для перехода к обработчику ошибок;
 инструкция Resume, возобновляющая выполнение процедуры по- сле того, как заканчивает работу процедура обработки ошибок;
 инструкция GoSub…Return, которая передаёт и возвращает управление выполнением процедуры подпрограмме внутри проце- дуры;
 инструкции On…GoSub и On…GoTo, предназначенные для пере- дачи управления выполнением программы на одну из нескольких определённых строк программы в зависимости от значения неко- торого параметра;
 инструкции Exit Do, Exit For, Exit Function и Exit Sub, используе- мые для прерывания выполнения блока Do…Loop, For…Next,
Function и Sub.
2.12.4.1. Инструкция условного перехода If…Then…Else
Инструкция If...Then...Else задает выполнение определенных групп инструкций в зависимости от значения выражения. Она может иметь од- нострочный и два блоковых формата.

87
Однострочный формат:
If условие Then инструкции
Первый блоковый формат:
If условие Then [инструкции] [Else инструкции]
[Else
[инструкции_Else]]
End If
Второй блоковый формат:
If условие Then
[инструкции]
[ElseIf условие Then
[инструкции_elseIf]]…
[Else
[инструкции_else]]
End If
При этом ElseIf …Тhen может повторяться несколько раз.
В основу этой инструкции положен следующий принцип: если условие вы- полняется, то выполняются инструкция, находящиеся после Then.
Формат инструкции If...Then...Else содержит следующие элементы:
Элемент инструкции
Описание элемента
Условие
Обязательный. Одно или более выражений следующих двух типов: численное или строковое выражение, которое приво- дится к значениям True или False.
Инструкции
Необязательный в блочной форме, но обязательный в од- нострочной форме, которая не имеет ветви Else. Один или несколько операторов; выполняются, если Условие имеет значение True.
Однострочная форма допускает выполнение нескольких инструкций в ре- зультате проверки одного условия
1   ...   5   6   7   8   9   10   11   12   13


написать администратору сайта