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

Циклы с проверкой условия перед выполнением





Чтобы условия определителя цикла проверялись перед его выполнением, логическое выражение вместе с ключевыми словами While и Until помещают в начале цикла.

Создание циклов с помощью Do While

Синтаксис:

Do While условие

тело цикла

Loop

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

Порядок работы цикла:

1. Проверяется условие, если оно истинно, то происходит выполнение всех инструкций, записанных в теле цикла, т.е. начиная со следующей строки после условия и до ключевого слова Loop.

2. Когда будет достигнуто слово Loop, осуществляется переход к первой строке цикла, где вновь проверяется условие.

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

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

Создание циклов с помощью Do Until.

Синтаксис:

Do Until условие



тело цикла

Loop

Эта конструкция похожа на предыдущую с одним различием: слово Until обозначает «пока не», следовательно, пока не выполнено условие, инструкции, записанные в теле цикла будут выполняться. Т.е. пока значение условия ложно цикл выполняется.

Циклы с проверкой условия после выполнения

Чтобы условия определителя проверялись после выполнения тела цикла, логическое выражение определителя цикла нужно поместить в конце циклической структуры, а именно, после слова Loop.

Создание циклов с помощью Do..Loop While.

Синтаксис:

Do

Тело цикла

Loop While условие

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

Порядок работы цикла:

1. Выполняются инструкции, записанные в теле цикла.

2. Проверяется условие, если оно истинно, производится возврат к слову Do, после которого вновь осуществляются инструкции тела цикла.

3. Если условие ложно, то управление переходит к строке, следующей за последней строкой циклической конструкции: Loop While условие.



Таким образом, тело цикла будет выполнено хотя бы один раз.

Создание циклов с помощью Do..Loop Until

Синтаксис:

Do

Тело цикла

Loop Until условие

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

Немедленное завершение циклов

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

Как нам уже известно, в VBA существует две принципиально разные циклические структуры: For и Do. Для каждой из них существует своя инструкция немедленного завершения цикла:

Для конструкции For это Exit For

Для конструкции Do - Exit Do.

Работа инструкций Exit For и Exit Do абсолютно одинакова, если VBA встречает эту инструкцию, управление программой переходит к строке, следующей за последней строкой циклической структуры.

Рассмотрим пример: требуется определить, есть ли в массиве хотя бы один нулевой элемент.

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

Для массива, к каждому элементу которого требуется применить одни и те же действия, удобно использовать циклическую структуру For Each .. Next.

Допустим, что массив уже объявлен и проинициализирован.

For Each a In arr

If a = 0 Then

MsgBox "yes"

Exit For

End If

Next a

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



В данном примере можно обойтись и без инструкции Exit For, для этого достаточно было бы использовать цикл типа Do.

 

Do While (a(i) <> 0) Or (k = True) ‘первое условие служит для продолжения работы цикла в том случае, если нулевой элемент массива не найден, аа второе условие формируется с помощью переключателя, определяющего конец элементов массива

If i < 5 Then

i = i + 1

Else

k = True

End If

Loop

If k = True Then

MsgBox "в массиве нет нулевых элементов"

Else

MsgBox i & "-тый элемент равен нулю"

End If

 

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

Как видно, в примере используется вспомогательная переменная-переключатель k логического типа. Она введена для обеспечения выполнимости условия окончания цикла и для проверки причины окончания цикла. Изначально переменной-переключателю присвоено значение False. В теле цикла переменная-индекс массива увеличивается на единицу (для перехода к следующему элементу массива) до тех пор, пока не станет равной пяти (окончание массива). Когда достигнут конец массива переменной-переключателю присваивается значение True. Условие окончания массива будет выполнено. Если же в условие окончания массива записать i<=5, то такое после выполнения тела цикла последний раз переменная-индекс станет равна 6,а такого элемента в массиве нет и при проверке условия (a(i)<>0) , будет ошибка переполнения массива. Кроме того, при введении в условие окончания цикла проверки индекса невозможно будет определить почему завершился цикл: потому что был найден нулевой элемент или потому что достигнут конец массива.

На практике инструкция Exit For действительно может пригодиться, например, в случае обнаружения ошибки, возникновение которой предусмотрел программист или в случае, когда условие цикла Do логически трудно совместимо с условием экстренного завершения цикла.

Рассмотрим еще один вариант оправданного использования инструкции Exit, но теперь на примере цикла Do .. Loop While.

Задача: пользователь вводит числа в окно ввода, выводимое при каждом проходе цикла. В теле цикла вычисляется частное переменной y и введенного числа. Начальное значение y = 20, в ходе выполнения цикла переменной y присваивается результат деления. Работа цикла продолжается до тех пор, пока y > 0.001. При этом пользователь в любой момент может отказаться от дальнейших вычислений и получить результат, имеющийся на данный момент, кроме того, необходимо установить защиту от ошибки деления на ноль. Необходимо так же проинициализировать переменную x, т.к., если пользователь при первом же выводе окна InputBox отменит ввод, то будет возвращена пустая строка и выведено сообщение об ошибке:

Sub dem_exit_do()

 

Dim x As String, y As Double

y = 20

x = 1

Do

x = InputBox("введите любое число, не равное нулю", "Test")

If x = "" Then

Exit Do

Else

If CDbl(x) = 0 Then

Exit Do

Else

y = y / CDbl(x)

End If

End If

Loop While y > 0.001

MsgBox CStr(y)

End Sub

 

Особого внимание в данном коде заслуживает вложенная конструкция оператора выбора. Казалось бы, можно было объединить условие x = "" и CDbl(x) = 0, но в первом случае мы проверяем строковую переменную, а во втором числовую. Т.о., если команда ввода была отменена и функция InputBox вернула пустую строку, то она не может быть преобразована в числовой тип и будет выведено сообщение об ошибке. Почему не проверяется 0 в виде строки «0»? Потому что при преобразовании к числовому типу случайно введенные пробелы игнорируются, т.о. преобразование позволяет обработать большее количество ошибок.

Поэтому, сначала нужно проверить строку на содержимое и в том случае, если она не пустая, производить проверку на ноль.

 

 


Массивы

Массивом называется пронумерованная группа значений одного типа. Их имена различаются только по индексам.

Синтаксис объявление массива:

Dim имя массива(размерность и размер массива) as тип

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

Пример объявления массива:

Dim NameArr(1 to 10) as Integer

Массив с именем NameArr сожержит 10 элементов типа Integer, первый элемент имеет индекс 1, последний 10. Если в описании массива опустить номер первого индекса, то по умолчанию он будет равен нулю, тогда описание:

Dim NameArr(10) as Integer

соответствует массиву, состоящему из 11 элементов, первый из которых имеет индекс 0, последний – 10.

В VBA имеется возможность указать, с какого номера будет производиться нумерация массива: с нуля или единицы. Указание производится с помощью директивы Option Base:

Option Base 0 ‘ нумерация массива по умолчанию начинается с нуля.

Option Base 1 ‘ нумерация массива по умолчанию начинается с единицы.

Директива помещается в модуле, перед объявлением макросов, констант, переменных и т.д.

Рассмотренный массив – одномерный. В VBA можно использовать массивы, имеющие до 60 измерений, однако они используются крайне редко, в связи с огромным объемом памяти, требующимся для его обработки. Однако, часто используются двумерные массивы, которые можно объявить следующим образом:

Dim NameArr(1 to 10, 1 to 80) as Double.

Доступ к элементам массива осуществляется через имя массива и индекса элемента, заключенного в скобки, например:

NameArr(3) = 15 ‘ третьему элементу массива (при условии нумерации с единицы) присвоено значение 15.

В VBA существуют так же динамические массивы, т.е. массивы, размерность которых заранее не определена и, поэтому они могут содержать неограниченное число элементов:

Dim NameArr( ) as Integer

Размер и размерность динамического массива можно задавать и изменять по ходу выполнения программы, для этого используется инструкция ReDim.

Примеры использования инструкции ReDim:

Dim NameArr() as Integer

ReDim NameArr(3 To 9) ' задана размерность и размер массива

ReDim Name Arr(1 To 10, 10 To 100) ‘ изменена размерность и размер массива.

ReDim Preserve NameArr(1 To 10, 10 To 100, 1 To 5) ‘ изменения размерности и размера массива произведены с сохранением ранее записаных в него данных.

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

Dim DemoArr as Variant ‘создается переменная типа Variant

ReDim DemoArr(2 To 6) ‘ в переменной DemoArr создается одномерный массив

ReDim DemoArr(2 To 6) as Long ‘ изменяет тип данных массива DemoArr при этом необходимо указывать размерность. Но при изменении типа данных нельзя сохранить данные массива.

Инструкция Erase. Если эта инструкция применяется к статическому массиву, то он очищается, т.е. удаляются значения всех его элементов, т.е. массив приходит в исходное состояние. При применении к динамическому массиву происходит его полное удаление из памяти вместе со всеми его элементами. Синтаксис:

Erase ArrName

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

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

Count(имя массива) (Счет) – количество ЧИСЕЛ в массиве;

Sum(имя массива) – сумма элементов массива;


 

 








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



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