Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Информатике на Машфаке и ТЭА.doc
Скачиваний:
110
Добавлен:
29.02.2016
Размер:
3.28 Mб
Скачать

10.9 Оформление программного кода

Комментарии

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

Размещение оператора на нескольких строках

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

При этом надо помнить, что:

  • Нельзя разбивать переносом строковые константы

  • Допустимо не более семи продолжений одной и той же строки

  • Сама строка не может состоять более, чем из 1024 символов

Размещение нескольких операторов на одной строке

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

X=2 : d=7

11 Операторы vba

Оператор – это языковая конструкция, представляющая описание команды или комплекса команд по обработке и преобразованию данных.

11.1 Оператор присваивания

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

Синтаксис оператора присваивания:

<идентификатор>=<выражение>

Например

X=2

Y=”Привет”

Стоимость=x*kol

TextBox1.Visible=True;

CommandButton1.Caption=”Вычислить”

Работа: вычисляется значение <выражения> присваивается полученное значение <идентификатору>

Пример.

Вычислить значение функции f(x,y)=|x|+sin2(y+5).

Public Sub prog1()

Dim x As Double, y As Double Dim f As Double

x=CDbl(InputBox("Введите х"))

y=CDbl(InputBox("Введите y"))

f = Abs(x) + Sin(y + 5) ^ 2

MsgBox "Результат = " & f

End Sub

Заголовок процедуры prog1 (начало программы)

Описание переменных: переменные x,y,fвещественного типа (Double)

Ввод значений х и у. Функция InputBoxвыводит на экран окно с полем ввода и сообщением «Введите х» и возвращает значение типа строка (String). Для преобразования вводимого значения к вещественному типу –Double- используется функцияCDbl.

Вычисление значения переменной f: функцияAbs(аргумент) возвращает модуль аргумента,Sin(аргумент) – синус аргумента, ^ - степень числа.

Процедура MsgBoxвыводит на экран окно сообщений с текстом «Результат = 12» (еслиf=12).

Конец программы.

Организация ввода-вывода данных

Ввод и вывод данных в VBA может выполняться несколькими способами: с листа Excel, с помощью диалоговых окон, с помощью пользовательской формы.

Для ввода данных с листа или вывода на лист используется объект Worksheets и его методы Range или Cells.

Метод Range использует в качестве аргументов одну или две ссылки на ячейки, и возвращают объект Range. Ссылки на ячейки должны быть оформлены в стиле А1 (колонка-буква, строка-число). Ссылка на единичную ячейку, использованная в качестве аргумента, возвращает объект Range для единичной ячейки. Две ссылки на единичные ячейки возвращают объект Range для прямоугольной области, заключенной между этими двумя ячейками:

X = Worksheets(“Лист1”).Range(“B1”).Value

Присваиваем переменной Х значение ячейки B1 листа Лист1.

Worksheets(“Лист1”).Range(“B1”).Value = Х

Выводим в ячейку B1 листа Лист1 значение переменной Х

Worksheets(“Лист1”).Range(“C1,D6”).Value = 2

Выводим в ячейки C1 и D6 листа Лист1 число 2

Worksheets(“Лист1”).Range(“В7:С9”).Value = 3

Выводим в диапазон ячеек “В7:С9” листа Лист1 число 3

Public Sub Ввод_Вывод()

x = Worksheets("Лист1").Range("F1").Value

Worksheets(1).Range("F2").Value = x

x = Worksheets("Лист1").Range("g1")

Worksheets(1).Range("g2") = x

Worksheets("Лист1").Range("A1:B2").Value = 1

Worksheets(1).Range("c1, d6") = 5

End Sub

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

A=Worksheets(1).Cells(1,2).Value

Переменной А присвоено значение из ячейки первой строки и второго столбца первого листа.

Worksheets(1).Cells(2,2).Value= Х

В ячейку второй строки и второго столбца заносится значение переменной Х

Ячейка А2 как объект описывается Range ("A2") или cells (1,2).

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

Окно ввода

Функция InputBox выводит на экран диалоговое окно, содержащее сообщение, поле ввода и две кнопки OK и Cancel.

Устанавливает режим ожидания ввода текста пользователем или нажатия кнопки, а затем:

    • При нажатии на кнопку OK, возвращает значение типа string, содержащее текст, введенный в поле ввода.

    • При нажатии кнопки Cancel возвращается пустая строка.

Синтаксис:

InputBox (prompt [, title] [, default])

Аргументы:

  • prompt — обязательный параметр. Любое строковое выражение, отображаемое как сообщение в диалоговом окне. Строковое значение prompt может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (Сhr(13)), символа перевода строки (chr (10)) или комбинацию этих символов (Chr( 13) & Chr (10))

  • title — Необязательный параметр. Строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения

  • default — Необязательный параметр. Строковое выражение, Отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода изображается пустым

Пример.

Имя =InputBox(“Введите Ваше имя”, “Пример окна ввода”)

На экране появится окно.

Рисунок 2 – Пример окна ввода

Переменной Имя будет присвоено значение типа String, введенное пользователем.

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

X=CDbl(InputBox(“Введите значение Х”, “Пример окна ввода”, “1,678”))

В результате выполнения этой операции на экране появится окно ввода.

Рисунок 3 – Пример окна ввода

Введенное пользователем значение будет преобразовано к типу Double и присвоено переменной Х. Если пользователь не будет вводить значение, а просто нажмет кнопку OK, переменной Х будет присвоено значение по умолчанию 1.678.

Окно вывода

Процедура MsgBox выводит на экран диалоговое окно, содержащее сообщение.

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

Синтаксис:

MsgBox (prompt [, buttons] [, title] )

Аргументы:

  • prompt — Обязательный параметр. Строковое выражение, отображаемое как сообщение в диалоговом окне

  • buttons — Необязательный параметр. Числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию этого аргумента равняется 0. Значения констант, определяющих число и тип кнопок используемого значка, приведены в табл.11

  • title — Необязательный параметр. Строковое выражение, отображаемое в строке , заголовка диалогового окна. Если этот аргумент опущен, в строку заголовка помещается имя приложения

Таблица 11 – Значение констант, определяющее тип и число кнопок, тип значка

Имя Константы

Числовое

значение

Отображаются кнопки

VbOkOnly

0

VbOkCancel

1

VbAbortRetryIgnore

2

VbYesNoCancel

3

VbYesNo

4

VbRetryCancel

5

VbCritical

16

VbQuestion

32

VbExclamation

48

VbInformation

64

VbDefaultButtob1

0

Первая кнопка по умолчанию

VbDefaultButtob2

256

Вторая кнопка по умолчанию

VbDefaultButtob3

512

Третья кнопка по умолчанию

VbDefaultButtob4

768

Четвертая кнопка по умолчанию

VbSystemModal

4096

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

Значения 0-5 параметра кнопки могут быть просуммированы со значениями 16-64 и 256-4096. В этом случае первые значения определяют состав кнопок диалогового окна, вторы – вид отображаемого в окне значка, а третьи – выбор кнопки по умолчанию.

Например, если в качестве значения параметра указать выражение 3+64+512, то в диалоговом окне будут отображены кнопки Да, Нет, Отмена, значок информирующего значения и по умолчанию будет выбрана кнопка Отмена.

Public Sub qq()

MsgBox "Нажмите любую кнопку", _

vbYesNoCancel + vbInformation + vbDefaultButton3, _

"Контрольный пример"

MsgBox "Нажмите любую кнопку", _

3 + 64 + 512, _

"Контрольный пример"

MsgBox "Нажмите любую кнопку", _

579, _

"Контрольный пример"

End Sub

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

Таблица 12

Константа

Значение

Нажатая кнопка

vbOK

vbCancel

vbAbort

vbRetry

vbIgnore

vbYes

vbNo

1

2

3

4

5

6

7

ОК

Отмена (Cancel)

Прервать (Abort)

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

Да (Yes)

Нет (No)

Пример.

Public Sub TestMsgBox1()

x = 2

n = MsgBox("Значение переменной Х=" & x & Chr(10) _

& "Продолжитьвычисления ?", vbYesNo, "Пример окна MsgBox")

If n = 6 Then

MsgBox "Нажата кнопка Да"

ElseIf n = 7 Then

MsgBox "Нажата кнопка Нет"

End If

End Sub

Пользователь может нажать одну из кнопок – Да или Нет. Если будет нажата кнопка Да, переменной N будет присвоено значение 6 , если будет нажата кнопка Нет – 7. Проанализировав в дальнейшем это значение, можно выбрать одну из ветвей выполнения программы.

Часто процедура MsgBox используется в «минимальном» варианте - только для вывода сообщения, с одной кнопкой – OK. В этом случае аргументы не берутся в скобки.

Например:

MsgBox “Значение переменной Х=” & X

Пример окна сообщений

ПРИМЕР:

1. Пример использования окон сообщений. В результате действия приведенной ниже процедуры Тестокон появится диалоговое окно пример окна ввода с полем ввода

Следуя приглашению в этом диалоговом окне, введем в поле ввода имя, например Андрей. Нажмем кнопку ОК.

На экране отобразится диалоговое окно пример окна сообщения с текстом приветствия

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

Public Sub ТестОкон()

Dim ИмяКлиента As String

'

' Ввод имени пользователя

'

ИмяКлиента = InputBox("Введите ваше имя", "Пример окна ввода")

' Реакция программы на ввод имени пользователя

If ИмяКлиента <> "" Then

MsgBox "Привет, " & ИмяКлиента, vbInformation, _

"Пример окна сообщения"

Else

MsgBox "Невежа, ты забыл ввести свое имя ", _

vbExclamation, "Еще один пример окна сообщения"

End If

End Sub

    1. Условные операторы

Для изменения порядка выполнения программного кода используются условные операторы

Условный оператор позволяет выбирать и выполнять действия в зависимости от истинности некоторого условия.

Имеется два варианта синтаксиса:

1) Строчная форма записи условного оператора:

IF <условное выражение> Then <операторы 1> [Else <операторы 2>]

Работа:

Если <условное выражение> принимает значение True, то выполняются <операторы 1> после Then и управление передается оператору, следующему за условным оператором. Если <условное выражение>=False, то выполняются <операторы 2> после Else и управление передается оператору, следующему за условным оператором. Ветвь Else является необязательной

2) Блочная форма записи оператора IF (оператор расположен на нескольких строках ):

IF < условное выражение 1> Then

<операторы 1>

[ElseIf < условное выражениеn> Then

[<операторы-n >]…

[Else

[<ИначеОператоры>]

End If

Работа:

Если <условное выражение1> принимает значение True, то выполняются <операторы 1> после Then, и управление передается оператору, следующему за условным оператором. Если <условное выражение1> =False, то при наличии конструкции [ElseIf < условное выражениеn> проверяется значение < условное выражениеn> . Если оно имеет значение True, то выполняются[<операторы-n >]…и управление передается оператору, следующему за условным, в противном случае выполняются операторы [<ИначеОператоры>] после Else. Ветвь Else является необязательной.

На блок-схеме условные операторы отображаются следующим образом:

Пример 1

Вычислить, является ли введенное число четным

Public Sub Четное_число()

Dim s As Integer

s = Worksheets(1).Range("a1")

's = Worksheets("Лист1").Range("a1")

's = Worksheets(1).Cells(1, 1)

's = CInt(InputBox("Введите любое целое число"))

If s Mod 2 = 0 Then

Worksheets(1).Range("a2") = "Введенное число " & s & " является четным"

'MsgBox "Введенное число " & s & " является четным"

Else

Worksheets(1).Range("a2") = "Введенное число " & s & " является нечетным"

'MsgBox "Введенное число " & s & " является нечетным"

End If

End Sub

Пример 2

Вычислить

Public Sub aa()

Dim a As Double, f As Double

Dim i As Integer

a = Worksheets(2).Range("b1")

i = Worksheets(2).Range("b2")

If i Mod 2 = 0 And a > 0 Then

f = i * Sqr(a)

ElseIf i Mod 2 <> 0 And a < 0 Then

f = 0.5 * i * Sqr(Abs(a))

Else

f = Sqr(Abs(i * a))

End If

Worksheets(2).Range("a3") = "Результат"

Worksheets(2).Range("a4") = "f="

Worksheets(2).Range("b4") = f

End Sub

Пример 3 Вложенные операторы If

Public Sub Возраст1()

intВозраст = InputBox("Укажите возраст")

If intВозраст > 7 Then

If intВозраст <= 17 Then

MsgBox ("Школьник")

Else

MsgBox "Взрослый"

End If

Else

MsgBox "Дошкольник"

End If

End Sub

Пример 4 Эквивалентом вложенных операторов операторов If является оператор If …Then … ElseIf, в котором используется ключевое слово ElseIf

Public Sub Возраст2()

intВозраст = InputBox("Укажите возраст")

If intВозраст < 7 Then

MsgBox "Дошкольник"

ElseIf intВозраст <= 17 Then

MsgBox ("Школьник")

ElseIf intВозраст <= 23 Then

MsgBox ("Студент")

ElseIf intВозраст <= 55 Then

MsgBox ("Специалист")

Else

MsgBox "Пенсионер"

End If

End Sub

Что получим, если ничего не введем ?

    1. Оператор безусловного перехода GoTo

Оператор безусловного перехода GoTo всегда изменяет порядок выполнения операторов в программе – при этом VBA не проверяет никаких условий, а просто переходит к выполнению программы с того места, которое будет указано в этом операторе.

Синтаксис оператора:

GoTo Labl

Здесь Labl – метка, определяющая оператор (или группу операторов), с которого будет продолжено выполнение программы. Метка – это любой допустимый идентификатор VBA, за которым обязательно должно следовать двоеточие.

Public Sub Опер_GoTo()

Пароль = InputBox("Введите Ваш пароль")

If Пароль <> "ABC" Then GoTo Неверный_пароль

MsgBox ("Добро пожаловать, ABC!")

'Другие операторы

Exit Sub

Неверный_пароль:

MsgBox "Вы не можете работать на этой машине"

End Sub

В этой процедуре оператор GoTo используется для перехода в особую ветвь программы, предназначенную для обработки ситуации, когда пользователь вводит неверный пароль. Если же пароль будет введен верно (“ABC”), то после вывода приветствия программа представит пользователю доступ к машине для продолжения работы.

Оператор GoTo не пользуется большой популярностью у программистов, поскольку его использование противоречит нормам структурного программирования и часто приводит к появлению ошибок в логике программы. Поэтому оператор GoTo следует применять только в том случае, когда без него никак нельзя обойтись. Обычно в VBA оператор GoTo используется только при обработке ошибок.

    1. Условный оператор Select Case

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

Синтаксис оператора Select Case

Select Case <выражение>

Case <список выражений 1>

<операторы 1>

…………..

Case <список выражений N>

<операторы N>

[Case Else

<операторы N+1>]

End Select

Здесь

<выражение> - любое численное или строковое выражение,

<список выражений i> - представляют список выражений, отделенных друг от друга запятыми или (если в интервале), то in to ik,

<операторы i> - (i=1,N) – операторы, которые выполняются, если <выражение i> совпадает с любым компонентом <список выражений i>,

[Case Else

<операторы N+1>] необязательная конструкция.

Работа:

  • Вычисляется <выражение>

  • Если значение <выражение> совпадает со значением из Case <список выражений i>, то выполняются соответствующие <операторы i> и затем управление передается на оператор следующий за оператором Select Case

  • Если значение <выражение> не совпадает ни с одним из Case <список выражений i>, то при наличии конструкции Case Else выполняются <операторы N+1>. Если конструкция Case Else отсутствует, то сразу выполняется оператор, следующий за оператором Select Case

Пример:

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

Public Sub Оператор_Select_Case1()

Dim n_day As Integer

Dim day As String

n_day = CInt(InputBox("Введите номер дня недели"))

Select Case n_day

Case 1 To 5

day = "Рабочий день"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

Case 6

day = "Суббота"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

Case 7

day = "Воскресенье"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

End Select

End Sub

Public Sub Оператор_Select_Case2()

Dim n_day As Integer

Dim day As String

n_day = CInt(InputBox("Введите номер дня недели"))

Select Case n_day

Case 6

day = "Суббота"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

Case 7

day = "Воскресенье"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

Case Else

day = "Рабочий день"

MsgBox "Сегодня - " & day, vbOKOnly + vbInformation

End Select

End Sub

    1. Операторы повтора

Для организации циклов язык VBA предоставляет несколько гибких и мощных структур – операторы повтора.

А) Оператор цикла с параметром ( For — Next)

Оператор цикла позволяет повторять группу операторов заданное число раз

Синтаксис:

For <счетчик цикла>=<начало> To <конец> [Step шаг]

<операторы>

[Exit For]

Next <счетчик цикла>

Где:

  • <счетчик цикла> - любая числовая переменная, в которой сохраняется информация о количестве выполненных проходов цикла (счетчик цикла);

  • Параметры <начало> и <конец> - это числовые выражения, задающие начальное и конечное значение счетчика и определяющие количество проходов цикла.

  • Числовая переменная шаг задает приращение, на которое увеличивается счетчик цикла при каждом проходе. [Step шаг] необязательная фраза. При её отсутствии VBA (по умолчанию) увеличивает счетчик цикла на единицу.

  • Во фразе Next <счетчик цикла> имя переменной счетчик указывать необязательно. Но при указании имени переменной улучшается читабельность программы и в случае вложенных циклов For — Next сразу видно, какому именно циклу принадлежит данное слово Next

Работа:

  • Переменной <счетчик цикла> присваивается значение параметра <начало> и проверяется условие счетчик цикла < конец. Если условие неверно, то управление передается оператору, следующему за Next. Если же условие - верно, то выполняются все операторы, входящие в блок, обозначенный как <операторы>, вплоть до ключевого слова Next

  • Значение переменной <счетчик цикла> увеличивается на величину, заданную во фразе [Step шаг] или на единицу, если фраза Step не указана

  • Управление возвращается

  • Данный процесс будет выполняться, пока значение <счетчик цикла> не достигнет значение <конец>

  • Досрочно завершить цикл For — Next можно с помощью оператора Exit For, который располагается в том месте блока <операторы>, где необходимо выйти из оператора цикла For — Next не дожидаясь условия завершения цикла.

На блок – схеме оператор изображается следующим образом:

Пример 1

Вычислить n-ый член последовательности, заданный формулой , если

Public Sub Prog1()

Dim n As Byte

Dim a1 As Integer, a2 As Integer, an As Integer

n = CByte(InputBox("введите N"))

a1 = 1: a2 = 1

For i = 3 To n

an = a2 + a1

a1 = a2: a2 = an

Next i

MsgBox n & "-й член последовательности = " & an

End Sub

Пример 2

Задана последовательность хi вещественных чисел. Вычислить

Public Sub Prog2()

Dim n As Byte

Dim i As Byte

Dim xi As Double, s As Double

n = CByte(InputBox("введите N"))

s = 0

For i = 1 To n

xi= CDbl(InputBox("Введите " & i & "-й элемент последовательности"))

s = s + xi

Next i

Worksheets(1).Range("a1") = "Значение суммы равно"

Worksheets(1).Cells(2, 1) = s

End Sub

Пример 3

Задан массив, содержащий N вещественных чисел. Найти наибольший и наименьший элементы и поменять их местами.

Public Sub Prog3()

Dim n As Integer, i As Integer

Dim imin As Integer, imax As Integer

Dim max As Double, min As Double

Dim a() As Double

n = CInt(InputBox("введите N"))

ReDim a(1 To n)

Worksheets(1).Range("A1") = "Исх. массив"

For i = 1 To n

a(i)=CDbl(InputBox("Введите " & i & "-й элемент последовательности"))

Worksheets(1).Cells(i + 1, 1) = a(i)

Next

imin = 1: imax = 1

min = a(1): max = a(1)

For i = 1 To n

If a(i) > max Then

imax = i: max = a(i)

End If

If a(i) < min Then

imin = i: min = a(i)

End If

Next i

a(imin) = max

a(imax) = min

Worksheets(1).Range("C1") = "Рез. массив"

For i = 1 To n

Worksheets(1).Cells(i + 1, 3) = a(i)

Next i

End Sub

Пример 4

Вывести на экран окно сообщения со строкой нечетных чисел

Public Sub Prog4()

Dim addnum As String

For a = 1 To 21 Step 2

addnum = addnum & a & " "

Next a

MsgBox "Это последовательность нечетных чисел:" & _

Chr(13) & addnum

End Sub

В) Операторы повтора

Инструкция ForNext применяется в тех случаях, когда известно число повторений.

Если число повторений неизвестно, то применяются операторы повтора.

Существует несколько типов Операторов повтора

Операторы повтора с предусловием.

Синтаксис:

Do While <условное выражение>

<операторы>

[Exit Do]

< операторы >

Loop

While < условное выражение >

<операторы>

[Exit Do]

< операторы >

Wend

Работа:

Вычисляется условное выражение. Если значение условного выражения равно TRUE (истина), то выполняется блок <операторы> и, достигнув слова Loop, опять управление передается в начало оператора повтора, чтобы опять проверить условное выражение. Если вычисленное значение условного выражения равно FALSE (ложь), то управление передается оператору, следующему за оператором повтора.

При наличии инструкции Exit Do есть возможность досрочного выхода из цикла.

На блок-схеме операторы отображаются следующим образом:

Еще одной формой записи оператора повтора с предусловием, является следующий оператор:

Do Until <условие>

<операторы>

[Exit Do]

< операторы >

Loop

Работа:

Вычисляется условное выражение. Если значение условного выражения равно FALSE (ложь), то выполняется блок <операторы> и, достигнув слова Loop, опять управление передается в начало оператора повтора, чтобы опять проверить условное выражение. Если вычисленное значение условного выражения равно TRUE (истина), то управление передается оператору, следующему за оператором повтора.

Операторы повтора с постусловием.

Синтаксис:

Do

<операторы>

[Exit Do]

< операторы >

Loop While <условное выражение>

Работа:

Блок операторов выполняется, если <условное выражение> имеет значение TRUE (истина). Оператор повтора прекращает свою работу, если <условное выражение> примет значение FALSE (ложь)

Do

<операторы>

[Exit Do]

< операторы >

Loop Until <условное выражение>

Работа:

Блок операторов выполняется, если <условное выражение> имеет значение FALSE (ложь). Оператор повтора прекращает свою работу, если <условное выражение> примет значение TRUE (истина).

Примечание:

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

Пример 1:

Вычислить значения Y=sin(x)+ex для всех значений х[a,b]

  • Программный код с использованием оператора Do While

Public Sub Операторы_повтора1()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора While

Public Sub Операторы_повтора2()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Wend

End Sub

  • Программный код с использованием оператора Do While

Public Sub Операторы_повтора1()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do While x <= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора Do Until

Public Sub Операторы_повтора3()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do Until x >= b

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop

End Sub

  • Программный код с использованием оператора Do … Loop While

Public Sub Операторы_повтора4()

Dim a As Double, b As Double, hx As Double

Dim x As Double, y As Double

Dim i As Integer

a = Worksheets(1).Range("b1")

b = Worksheets(1).Range("b2")

hx = Worksheets(1).Range("b3")

Worksheets(1).Range("a4") = "Результат"

x = a: i = 5

Do

y = Sin(x) + Exp(x)

Worksheets(1).Cells(i, 1) = "x[" & i & "]="

Worksheets(1).Cells(i, 2) = x

Worksheets(1).Cells(i, 3) = "y[" & i & "]="

Worksheets(1).Cells(i, 4) = y

i = i + 1

x = x + hx

Loop While x <= b

End Sub

Пример 2

Рассортировать по убыванию одномерный массив, содержащий 10 вещественных элементов.

Текст программы приведен ниже

Public Sub Сортировка()

Dim a(1 To 10) As Double

Dim i As Integer, i1 As Integer

Dim n As Integer, imax As Integer

Dim j As Integer

Dim max As Double

Worksheets(1).Range("a1") = "Исходный массив"

n = 10

j = 2

For i = 1 To n

a(i) = Worksheets(1).Cells(j, 1)

j = j + 1

Next i

i1 = 1

Do While i1 <= n - 1

max = a(i1)

imax = i1

For i = i1 To n

If a(i) > max Then

imax = i: max = a(i)

End If

Next i

a(imax) = a(i1)

a(i1) = max

i1 = i1 + 1

Loop

Worksheets(1).Range("c1") = "Рассортированный массив"

j = 2

For i = 1 To n

Worksheets(1).Cells(j, 3) = a(i)

j = j + 1

Next i

End Sub

Пример 3

Вычислить . Вычисление суммы прекратить, когда при каком-то значенииi, общий член ряда станет <=

Текст программного кода будет выглядеть следующим оьразом

Public Sub Summa_ряда()

Const eps = 0.001

Dim sum As Double, ai As Double

Dim n As Integer, i As Integer

Dim j As Integer

Dim f1 As Integer, f2 As Integer

sum = 0

i = 1

ai = 1 / 2

Do Until ai <= eps

sum = sum + ai

i = i + 1

f1 = 1

For j = 1 To i

f1 = f1 * j

Next j

f2 = 1

For j = 1 To 2 * i

f2 = f2 * j

Next j

ai = f1 / f2

Loop

MsgBox "Значение i=" & i & Chr(10) & _

"Значение ai=" & ai & Chr(13) & _

"Значение Sum=" & sum

End Sub

  1. Пользовательские подпрограммы

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

В VBA существуют два типа подпрограмм:

  • Подпрограммы-процедуры (процедуры).

  • Подпрограммы-функции (функции)

12.1 Подпрограмма – процедура – является самостоятельной частью программного кода, имеет свое имя, может иметь параметры, выполняет последовательность инструкций языка VBA.

Синтаксис описания:

[Private Public] Sub <имя процедуры> ([<список параметров>])

<операторы>

[Exit Sub]

< операторы >

End Sub

Здесь:

  • Private – ключевое слово, указывающее на то, что процедура доступна для всех процедур в данном модуле и недоступна процедурам, находящимся в других модулях.

  • Public - ключевое слово, указывающее на то, что процедура доступна во всех модулях проекта. Эта область действия процедуры принята по умолчанию, поэтому использовать ключевое слово Public при объявлении процедуры не обязательно

  • <имя процедуры> - Имя процедуры, которое удовлетворяет всем правилам создания идентификатора в VBA

  • ([<список параметров>]) – это список параметров, значения которых передаются в процедуру или возвращаются из процедуры. Разделителем в списке формальных параметров является запятая.

  • <операторы> - группа инструкций, выполняемых в процедуре

  • [Exit Sub] – оператор, приводящий к немедленному выходу из процедуры.

Вызов подпрограммы – процедуры пользователя из другой процедуры можно произвести несколькими способами:

  • <имя процедуры> <список аргументов>

  • Call <имя процедуры> <список аргументов>

Примечание:

<Список параметров>отличается от <списка аргументов>тем, что первый указывается при описании подпрограммы, второй – при ее вызове в основной программе.

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

Синтаксис описания:

[Private ½ Public] Function <имя функции> ([<список параметров>]) [As<тип функции>]

<операторы>

[Exit Function]

< операторы >

<имя функции> = <выражение>

End Function

Здесь:

  • <имя функции> - Имя функции, которое удовлетворяет всем правилам создания идентификатора в VBA

  • ([<список параметров>])- список параметров, который описывает передаваемые функции данные

  • <тип функции> - определяет тип возвращаемого функцией значения ( по умолчанию это тип Variant). Следует помнить, что значения, сохраняемые или обрабатываемые как тип Variant, занимают больше памяти, чем любой другой тип данных, и на их обработку требуется больше времени. Поэтому при объявлении функции всегда следует указывать тип возвращаемого результата.

Примечание:

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

Вызов подпрограммы – функции пользователя осуществляется по имени в выражении, как любой стандартной функции VBA. За именем функции в круглых скобках указывается список аргументов.

Список параметров и список аргументов

<Список параметров> отличается от <списка аргументов> тем, что первый указывается при описании подпрограммы, второй – при ее вызове в основной программе.

<Список параметров> позволяет передать в подпрограмму требуемые значения из вызывающей программы и имеет следующий синтаксис:

Синтаксис:

[ByRef | ByVal] <имя параметра1> [As <Тип>], [ByRef | ByVal] <имя параметра2> [As <Тип>], [ByRef | ByVal] <имя параметра3> [As <Тип>], …

Здесь:

<Тип> позволяет явно задать тип передаваемых значений. Если тип опущен, то по умолчанию принимает значение Variant.

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

Использование ByRef (передача по ссылке) или, если ключевое слово опущено, означает, что при изменении параметров внутри процедуры происходит изменение соответствующих параметров в основной программе.

При вызове подпрограммы пользователя в основной программе используется <Список аргументов>.

В <Списке аргументов> аргументы перечисляется через запятую.

Соответствие между списком параметров и списком аргументов:

  • Количество и типы в списке параметров и в списке аргументов должны соответствовать друг другу.

  • Аргументы, соответствующие параметрам с ключевым словом ByVal могут быть константами, переменными и выражениями.

  • Аргументы, сответсвующие параметрам с ключевывым словом ByRef (или по умолчанию), должны быть переменными.

Для выхода из подпрограммы и возврата в основную программу, опуская оставшиеся операторы, используется Exit Sub (в процедурах) и Exit Function (в функциях).

Примеры:

Пример 1. Вычислить с помощью подпрограммы пользователя площадь прямоугольника.

С помощью процедуры:

Sub Sgure(ByVal a As Long, ByVal b As Long, ByRef ss As Long)

ss = a * b

End Sub

Public Sub Test_sub()

Dim a As Long

Dim b As Long

Dim s As Long

b = 2

'Sgure 5, b, s

Call Sgure(5, b, s)

MsgBox "s=" & s

End Sub

С помощью функции:

Function SgureF(ByVal a As Long, ByVal b As Long) As Long

SgureF = a * b

End Function

Public Sub Test_Function()

Dim a As Long

Dim b As Long

Dim s As Long

b = 2

s = SgureF(5, b)

MsgBox "s=" & s

End Sub

Пример 2. Показывает отличие передачи параметра по ссылке от передачи параметра по значению.

Sub DemoByValByRef(ByVal a, b, ByRef c)

'a - передается по значению

'b - передается по умолчанию

' по ссылке (ByRef)

' c - передается по ссылке

a = a + 1

b = b + a

c = c + a

End Sub

Public Sub Test()

a = 1

b = 10

c = 100

DemoByValByRef a, b, c

MsgBox "a=" & a ‘ a=1

MsgBox "b=" & b ‘ b=12

MsgBox "c=" & c ‘ c=102

End Sub

Пример 3

Вычислить . Вычисление суммы прекратить, когда при каком-то значенииi, общий член ряда станет <=

Текст программного кода будет выглядеть следующим образом

Public Sub Summa_ряда()

Const eps = 0.001

Dim sum As Double, ai As Double

Dim n As Integer, i As Integer

sum = 0

i = 1

ai = 1 / 2

Do Until ai <= eps

sum = sum + ai

i = i + 1

ai = Factor(i) / Factor(2 * i)

Loop

MsgBox "Значение i=" & i & Chr(10) & _

"Значение ai=" & ai & Chr(13) & _

"Значение Sum=" & sum

End Sub

Function Factor(n As Integer) As Long

Factor = 1

For i = 1 To n

Factor = Factor * i

Next i

End Function

Тестовые задания: