Сделай Сам Свою Работу на 5

Выбор с помощью функции MsgBox





 

Выбор посредством функции MsgBox производится с помощью использования ее необязательного параметра Buttons (кнопки). До настоящего момента мы использовали эту инструкцию только с целью вывода сообщений на экран, поэтому окно, выводимое этой функцией, содержало только одну кнопку «Ок». На самом деле окно функции MsgBox может содержать несколько кнопок. Как и все другие функции, функция MsgBox имеет возвращаемое значение, которое определяется кнопкой, которую выбрал пользователь. Таким образом, отследив возвращаемое функцией значение, мы можем определить выбранную пользователем кнопку и произвести в соответствии с этим необходимые действия. Выбор действий реализуется посредством рассмотренных ранее операторов ветвления: If или Select.

Для создания кнопок в диалоговом окне MsgBox в VBA предусмотрено несколько встроенных констант, наиболее простая и часто используемая константа vbYesNo, которая отображает в окне две кнопки «Да» и «Нет».

MsgBox “Вы прилежный студент?”, vbYesNo, “Самооценка”

Рис. 40. Окно функции MsgBox

 

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



Sub _MsgBut()

Dim rez As Byte

rez = MsgBox("Вы прилежный студент?", vbYesNo, "Самооценка")

If rez = vbYes Then

MsgBox "молодец!"

Else

MsgBox "Нужно срочно исправляться!"

End If

End Sub

Некоторые константы для конструирования окна MsgBox

Таблица 11

Константа Кнопки
vbOkOnly OK (Если не написать Only, то выведется еще и кнопка Cancel (отмена))
vbOkCancel OK и Cancel
vbAbortRetryIgnore Abort, Retry, Ignore
vbYesNoCancel Yes, No, Cancel
vbYesNo Yes и No
vbRetryCancel Retry и Cancel

 

Возвращаемые значения функции MsgBox при нажатии

соответствующих кнопок

Таблица 12

Константа Значение Нажатая кнопка
vbOK OK
vbCancel Cancel
vbAbort Abort
vbRetry Retry
vbIgnore Ignore
vbYes Yes
vbNo No

 

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



 

Константы статусов окон

Таблица 13

Константа Статус окна Вид окна
vbCritical Critical message
vbQuestion Warning query
vbExclamation Warning message
vbInformation Information message

 

Обычно, первая выводимая в окне кнопка является активной по умолчанию, т.е. при нажатии клавиши «Ввод» нажимается именно эта кнопка. Кнопка, выделенная по умолчанию должна быть наиболее частой для предполагаемого использования в данном случае, например, в предыдущем примере – это кнопка «Ок». В некоторых случаях требуется переопределить активную кнопку, это делается с помощью констант vbDefaultButtonN, где N – порядковый номер кнопки в окне.

Синтаксис использования констант:

Кнопки+значки+кнопка_по_умолчанию

Например:

rez = MsgBox("Вы прилежный студент?", vbYesNo+vbQuestion+vbDefaultButton2, "Самооценка")

 

Рис. 41. Окно функции MsgBox

 

Актуальным является и использование статуса предупреждения выполнения дальнейших действий, например, при удалении данных:

rez = MsgBox("Вы действительно хотите удалить информацию об оценках?", vbYesNo+vbExclamation+vbDefaultButton2, "Удаление данных")

 

Рис. 42.

 

И, как следствие нажатия кнопки «Да», можно вывести сообщение об удалении и невозможности восстановления данных:

rez = MsgBox("Данные удалены и восстановлению не подлежат!", vbCritical, "Удаление данных")

 

Рис. 43.


Циклы

Циклы – это программные структуры, посредством которых осуществляется повторение набора инструкций, в данном случае инструкций VBA. Совокупность этих инструкций называется телом цикла. Однократное выполнение инструкций, находящихся в циклической операции называется итерацией цикла. Некоторые циклические структуры построены так, что количество итераций заранее определено, они называются определенными циклами. Другие выполняются неопределенное число раз, которое зависит от некоторого условия, такие циклы называются неопределенными. И в тех и в других циклах имеются выражения, ограничивающие количество итераций цикла, они называются определителями цикла. В определенных циклах определителями обычно являются числовые выражения, в неопределенных - логические выражения.



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

Принято два основных способа построения неопределенных циклов:

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

2. Условие проверяется после выполнения тела цикла, т.о., одна итерация такого цикла будет выполнена хотя бы один раз. Такие циклы называются циклами с постусловием. Циклы с постусловием используют тогда, когда данные для условия формируются в процессе выполнения тела цикла и проверка условия до его выполнения не имеет смысла.

Блок-схемы циклов с предусловием и с постусловием показаны на рисунке 44.

условие
  Тело цикла
Инструкции VBA, следующие за циклом
условие
  Тело цикла
Инструкции VBA, следующие за циклом
да
да
нет
нет

Рис. 44. Блок-схемы циклических конструкций с предусловием и с постусловием

 

Определенные циклы

 

Простейшим из циклов является фиксированный или определенный цикл. В VBA имеется две различные структуры для создания циклов такого типа: For .. Next и For Each .. Next.

Оба цикла выполняются фиксированное (заданное) количество раз.

Рассмотрим цикл For .. Next.

Синтаксис:

For переменная = начало To конец [Step шаг]

[Тело цикла]

Next [переменная]

Переменная – переменная целого числового типа (Integer, Long), выполняющая роль счетчика.

Начало и конец – числовые выражения, определяющие соответственно начальное и конечное значения цикла.

Шаг задает число, которое будет прибавляться к счетчику после выполнения каждой итерации цикла, по умолчанию шаг равен единице. Значением шага может быть любое целое число, в том числе и отрицательное. Step – служебное слово. Если не указывается величина шага, то слово Step не пишется.

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

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

Работа цикла:

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

Примеры:

Посчитать значение числа, заданного пользователем, возведенное в 7-ю степень.

Sub Demo1_ForNext()

Dim i as Integer, R as Long, Ch as Integer

‘i – переменная-счетчик цикла

‘R – переменная для сохранения результата вычислений степени

‘Ch – число, которое будет возведено в 7-ю степень

Сh = InputBox (“Введите целое число:”)

‘при вводе числа, функция InputBox возвращает строку, содержащую число, но так как эта строка присваивается числовой переменной, производится автоматическое преобразование типа данных. Однако, нужно помнить, что такое преобразование будет успешным, если введено действительно целое число, иначе произойдет ошибка преобразования типов данных. Для того, чтобы полностью быть уверенным в результате преобразования, можно воспользоваться функцией преобразования строки в целое число типа Integer – Cint(Ch).

R = 1 ‘определение начального значения результата

For i =1 To 7

R = R*Ch

Next i

MsgBox R

End Sub

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

Sub Demo2_ForNext()

Dim k as Integer, uStsrt as String, uEnd as String, uSum as Long

uStart = InputBox (“Введите натуральное число:”)

uEnd = InputBox (“Введите еще одно натуральное число:”)

uSum = 0

For k = CInt(uStart) To CInt(uEnd)

‘начальное и конечное значения ряда преобразуются к числовому типу данных - Integer, т.к. функция InputBox возвращает строковое значение

uSum = uSum+k ‘ в этой строке сначала производится сложение текущего значения переменной uSum с переменной k, а затем результат записывается в переменную uSum.

Next k

MsgBox “сумма натурального ряда от ” & uStart & “ до ” & uEnd & _

“ равна: ” & uSum

‘строка выводв на экран формируется из строковых констант, заключенных в двойные кавычки, числовых и строковых переменных. Например, в случае исходных данных диапазона от 2 до 5, результат, выведенный на экран будет выглядеть следующим образом: сумма натурального ряда от 2 до 5 равна: 14.

End Sub

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

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

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

 

Sub UFStr()

Dim oStr As String, iStr As String, k As Long

iStr = InputBox(“введите строку:”)

oStr = UCase(Left(iStr,1)) ‘записывается первый символ строки, 'переведенный в верхний регистр

For k = 2 to Len(iStr)

If Mid(iStr,k-1,1) = “ “ Then

oStr = oStr & UCase(Mid(iStr,k,1))

Else

oStr = oStr & LCase(Mid(iStr,k,1))

End If

Next k

MsgBox(oStr)

End Sub

Пример: Преобразовать все первые символы предложений в верхний регистр, а остальные в нижний:

 

Sub UFStr()

Dim oStr As String, iStr As String, k As Long

‘oStr – формируемая строка

‘iStr – исходная строка

‘k – перемення-счетчик

iStr = InputBox(«введите строку:»)

oStr = Ucase(Left(iStr, 1)) 'записывается первый символ строки, переведенный в верхний регистр

oStr = oStr & Lcase(Mid(iStr, 2, 1)) ‘к первому символу добавляется второй символ, переведенный в нижний регистр

For k = 3 To Len(iStr) ‘цикл для обработки строки с 3-го символа до количества символов, равного количеству символов в строке

If Mid(iStr, k – 2, 2) = “. “ Then ‘из строки выделяются два символа перед текущим и проверяются на окончания предложения

oStr = oStr & Ucase(Mid(iStr, k, 1)) ‘если условие истинно, т.е. перед текущим символом закончилось предыдущее предложение, то текущий символ переводится в верхний регистр и добавляется в конец результирующей строки

Else

oStr = oStr & Lcase(Mid(iStr, k, 1)) ‘если перед текущим символом не было окончания предыдущего предложения, то он переводится в нижний регистр и добавляется в конец формируемой строки

End If

Next k

MsgBox (oStr)

End Sub

 

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

For Each элемент In группа

Тело цикла

Next [элемент]

Элементпеременная, используемая для перебора всех элементов группы, она должна быть совместима по типу с типом группы. Например, если группа – это массив, то элемент должен быть типа Variant.

Группа – массив или коллекция объектов, но не может быть набором символов - строкой.

Цикл For Each .. Next всегда выполняется столько раз, сколько элементов в группе.

Пример: проинициализировать массив из 10 элементов и вывести их на экран через запятую:

 

Sub arrfen()

Dim arr(1 To 10) As Integer, a As Variant, I As Integer, s As String

‘arr – массив

‘а – элемент массива для цикла

‘I – переменная-счетчик

‘s – строка для вывода элементов массива на экран

For I = 1 To 5

arr(i) = InputBox(“введите элемент массива:”)

Next i

For Each a In arr

s = s & CStr(a) & “, “ ‘каждый элемент массива преобразуется в строковый тип данных и добавляется вместе с запятой в строку s для вывода на экран

Next a

MsgBox (s)

End Sub

 

Для инициализации массива используется циклическая конструкция For .. Next, а для формирования вывода строки на экран используется цикл For Each .. Next.

 

 

Неопределенные циклы

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

Инструкция Do – очень мощная гибкая циклическая структура. Она имеет четыре конструкции, которые можно разделить на две основные категории. Первая из них проверяет условие выполнения цикла перед выполнением его инструкций, вторая, соответственно – после, т.е. во втором случае тело цикла будет выполнено хотя бы один раз.

Раз есть условие выполнения цикла, значит, есть и условие окончания выполнения цикла, а, следовательно, нужно каким-либо образом контролировать продолжительность выполнения цикла. Существует два вида циклов:

· Циклы, контролируемые счетчиками. В этом случае тело цикла выполняется пока значение некоторого счетчика находится ниже или выше (в зависимости от условия) некоторой указанной границы. В этом есть определенное сходство с циклом For .. Next, за исключением того, что на разработчике лежит ответственность за инициализацию счетчика и изменение его значения. Такие циклы обычно используют в случаях с переменным шагом изменения счетчика или когда граница значения счетчика неизвестно до начала выполнения цикла.

· Циклы, контролируемые событиями. В этом случае условием обычно является логическое выражение, результатом которого могут быть значения True или False. Т.е. для завершения цикла требуется наступление определенного условием события. Например, перебор ячеек листа, пока не будет найдена ячейка с определенным содержанием.

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

В VBA имеется два разных способа проверки условия определителя:

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

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

Любой цикл, который написан с использованием команды While, может быть преобразован в цикл с командой Until, для этого только нужно изменить формулировку условия на противоположную. Т.о., выбор в пользу той или иной разновидности цикла следует делать в зависимости от удобства формирования условия, простоты его понимания и т.д.

Бесконечные циклы

Такие циклы возникают в случае ошибочного формирования условия. В этом случае необходимо прерывание выполнения программы. Для этого в VBA можно использовать клавиши Esc или Ctrl+Break. При этом на экран будет выведено окно, сообщающее о переполнении памяти и содержащее четыре кнопки:

Continue (продолжить) – продолжение выполнения программы, что в данном случае не имеет смысла.

End (закончить) – выполнение программы будет завершено, и вы сможете попробовать отыскать ошибку.

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

Help (помощь) – в данном случае не имеет смысла, т.к. ошибку в вашей программе это вам найти не поможет.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.