Операторы условного перехода If - Then и If-Then-Else

Условный оператор If-Then-else обеспечивает передачу управления в программе в зависимости от выполнения условия.

Синтаксис:

If <условие> Then <блок_операторов_1>

Else <блок_операторов_2>

End If

В условном операторе допустимо использование как блока операторов, так и любого из операторов. В операторе условия Опреатор_1 или Блок_операторов_1 выполняется если <условие> истинно, в противном случае выполняется Оператор_2 или Блок_операторов_2.

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

Таблица 1. Логическое отношение.

Операция Название Выражение Результат
= равно А = В True, если А равно В
<> не равно A<>B True, если А не равно В
> больше A>B True, если А больше В
< меньше A<B True, если А меньше В
>= больше или равно A>=B True, если А больше или равно В
<= меньше или равно A<=B True, если А меньше или равно В

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

Ветвь Else в условном операторе является необязательной. Таким образом, возможен следующий синтаксис оператора условия:

If <условие> Then <оператор или блок_операторов>

End If

Заметим, что в операторе условия после Then можно разместить блок операторов, для того, чтобы все они выполнялись, если условие истинно. В этом случае они должны располагаться в одну строчку и быть разделены двоеточием. Например,

If A>10 Then A=A+1 : B =B+A : C=C+B

End If

Рассмотрим пример функции пользователя с использованием оператора условного перехода If-Then-Else.

Function G(y)

If y<=0 Then G = (1+y^2)/(1+y^4)^(1/2)_

Else G = 2*y +sin (y)^2/(2+y)

End If

End Function

вычисляющей следующую функцию с двумя условиями:

Операторы условного перехода If - Then и If-Then-Else - student2.ru

Заметим, что знак подчеркивания «_» в конце строки обозначает, что следующая строка является продолжением предыдущей.

Пусть в ячейку А1 записано число 0,2 и вам нужно вычислить в ячейке В1 значение функции G при У=0,2. Для этого достаточно в ячейку В1 ввести формулу = G(А1). Тот же результат можно получить, если ввести в ячейку В1 следующую формулу

= если (А<=0*; (1+А1^2)/(1+A1^4)^(1/2); 2*A1+sin(A1)^2/(2+a1))

В условном операторе может проверяться несколько условий. В этом случае условный оператор имеет вид:

If <условие_1> Then <Блок_операторов_1>

Else If <условие_2> Then <блок_операторов_2>

Else If <условие_3> Then ...

else <блок_операторов>

End If

В данном условном операторе выполняется блок_операторов_i, если истинно условие_i, в противном случае выполняется блок_операторов.

Оператор выбора Select Case

Оператор выбора Select Case удобно использовать, когда одна величина участвует во многих сравнениях для выбора одного из блоков кода. Наиболее часто используется, когда сравниваемая величина является целым числом - селектором или индексом. Значение селектора или индекса выбирает тот блок кода, который будет выполняться.

Синтаксис:

Select Case <тестируемое _выражение>

Case <условие_выбора_1>

<блок_операторов_1>

... ... ...

Case <условие_выбора_n>

<блок_операторов_n>

Case Else

<блок_операторов_n>

End Select

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

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

Is является ключевым словом VBA, обозначающим тестируемое выражение в операторе Case. В операторе Case допустимы составные условия, например

Case 4,7 to 8, Is >=16

Проверяет, принадлежит ли тестируемое выражение отрезку от 7 до 8 или равняется значению 4, или оно не меньше, чем 16.

Пример перевода числового значения дня недели в строковое представление.

Sub perevod()

x = Sheets("Лист1").Range("e30").Value

Select Case x

Case 1

Sheets("Лист1").Range("e31").Value = "Понедельник"

Case 2

Sheets("Лист1").Range("e31").Value = "Вторник"

Case 3

Sheets("Лист1").Range("e31").Value = "Среда"

Case 4

Sheets("Лист1").Range("e31").Value = "Четверг"

Case 5

Sheets("Лист1").Range("e31").Value = "Пятница"

Case 6

Sheets("Лист1").Range("e31").Value = "Суббота"

Case 7

Sheets("Лист1").Range("e31").Value = "Воскресенье"

Case Else 'is<=0, is>7

Sheets("Лист1").Range("e31").Value = "Не день недели"

End Select

End Sub

Циклы

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

Вычисляемые

Логически прерываемые

Объектного типа

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

Рассмотрим два вычисляемых цикла: For .. Next и For Each .. Next. Вычисляемые циклы разделяются Visual Basic с помощью циклической структуры For-Next и For Each-Next.

Цикл For… Next

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

.

. блок кода

.

Exit For

.

. блок кода

.

Next переменная _цикла

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

Когда в программе встречается цикл For-Next, переменная_цикла получает значение начало, затем выполняется блок кода вплоть до оператора Next. Далее переменная_цикла увеличивается на величину шаг и сравнивается со значением конец. Если значение переменная_цикла больше, чем значение конец, то цикл прерывается и управление переходит к оператору, следующему за оператором Next. Если значение переменная_цикла меньше или равно значению конец, то блок кода цикла выполняется ещё раз. Так продолжается до тех пор, пока значение переменная_цикла не станет больше значения конец.

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

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

Использование счётчика цикла

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

После завершения цикла значение счётчика больше значения конец (или меньше значения конец, если цикл считался по убывающей). Этот фактор удобно использовать, чтобы определить, завершился ли цикл нормально или был преждевременно прерван оператором Exit For.

Особенность:

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

Например, следующая конструкция будет выполняться всегда:

Sub Beep

For I = 1 To 10

I = I-1

Beep

Next I

End Sub

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

Dim numRows As Integer, numCols As Integer

Dim theRow As Integer, theCol As Integer

Sub StikRandom ()

‘Определение размера текущего выбора.

numRows = Selection.Rows.Count

numCols = Selection.Columns.Count

Randomize ‘Инициализация генератора случайных чисел.

For theRow = 1 To numRows

For theCol = 1 To numCols

Selection.Cells (theRow, theCol).Value = Rnd

Next theCol

Next theRow

End Sub

Цикл For Each…Next

Данный вид цикла называется объектным и предназначен для обработки элементов в выделенном наборе. Циклы объектного типа реализуются структурой For Each...Next. Процесс выполнения данного цикла аналогичен циклу For…Next. Однако, в качестве переменной цикла используется не счётчик, определяющий количество повторов, а объект из выделенного набора. В качестве набора может быть использована как область ячеек, так и массив.

For Each <элемент> in <набор>

<Тело цикла>

Next <элемент>, где

<элемент> и <набор> являются переменными типа Variant.

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

C использованием цикла For Each - Next, рассмотрим пример заполнения области случайным набором действительных чисел.

Dim c

Sub Oblast

For Each C in Selection

C.Value=RND * 10

Next C

End Sub

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

Dim c

Dim s As Long

Dim Mas( ) as integer

Dim nrow as integer

Dim ncolumn as integer

Sub Массив

Nrow=Selection.Rows.Count

Ncolumn=Selection.Columns.Count

ReDim Mas (nrow,ncolumn)

‘заполнение массива соответствующими элементами

For i=1 to nrow

For j=1 to ncolumn

Mas (i,j)=cells(i,j).Value

Next j

Next i

‘вычислим сумму элементов набора-массив

S=0

For Each C in Mas

S=S+C

Next C

MsgBox “Сумма=” & S

‘вывод результата суммы на экран в виде окна

End Sub

цикл Do - Loop.

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

’ Условие False в начале. ’ Do Until условие ...блок кода Exit Do ...блок кода Loop  

’ Условие True в начале.

Do While условие

...блок кода

Exit Do

...блок кода

Loop

’ Условие False в конце. ’ Do ...блок кода Exit Do ...блок кода Loop Until условие
’ Условие True в конце.

Do

...блок кода

Exit Do

...блок кода

Loop While условие.

Цикл While и Until.

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

While условие = Until Not условие

Применение оператора Exit Do.

Оператор Exit Do предназначен для преждевременного прекращения цикла и обычно применяется в логической структуре (вроде оператора If), которая проверяет альтернативное условие прерывания цикла, например ошибку.

Запись условия в начале цикла.

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

Например, при чтении дискового файла можно использовать функцию EOF() для проверки очередной части файла в поисках маркера его конца. Если вы попытаетесь прочесть маркер конца файла, ваша программа остановится с ошибкой; таким образом, перед тем, как прочесть из файла какие либо данные, необходимо проверять очередную часть файла в поисках маркера конца файла. Чтобы сделать это, можно использовать нечто подобное

Open “Myfile.txt” For Input As #1 ’ Открытие файла.

Do Until EOF(1) ’ Проверка на конец файла.

Input #1, A$ ’ Если нет, то чтение данных.

.

. ’ Код преобразования величины A$

.

Loop

Close #1 ’ Закрытие файла по концу работы.

В этом фрагменте кода функция EOF() проверяет маркер конца файла. Если вы еще не дошли до конца файла, функция EOF() возвратит False и цикл выполниться, прочитав из файла строку и обработав ее. Если функция EOF() обнаружит маркер конца файла, то она возвратит True и цикл прервется.

Запись условия в конце цикла.

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

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

’ Поиск первого положительного элемента массива.

Function FirstPos(theArray) As Single

Dim J As Integer, Value As Single

J = LBound(theArray) -1 ’Инициализация J

Do ’Начало цикла

J = J + 1 ’Наращивание J

Value = theArray(J) ’Выбор элемента массива

Loop Until Value > 0 ’Проверка элемента

FirstPos = Value

End Function

В этой процедуре theArray является переменной типа Variant, и следовательно, позволяет передать из таблицы массив. Функция Lbound() возвращает нижний предел индекса массива. Переменная J устанавливается не единицу меньше этого предела, так как в начале цикла она будет увеличена на 1, что и даст значение нижнего предела индекса массива. Цикл начинается оператором Do, затем наращивается переменная J и из массива выделяется элемент с соответствующим индексом. В конце цикла этот элемент проверяется, и если он положительный, то цикл прерывается, причем переменная Value равна положительному элементу массива, а переменная J - индексу этого элемента массива.

Такая процедура предполагает, что один из элементов массива будет иметь положительное значение. Если это точно неизвестно, то необходимо проверять значение переменной J и прерывать цикл, когда J превысит верхний предел индекса массива. Иначе вы получите ошибку выполнения 9 «Subscript out of range». Что бы проверить переменную J, процедуру нужно модифицировать следующим образом:

’ Поиск первого положительного элемента массива

Function FirstPos2(theArray) As Single

Dim J As Integer, Value As Single

J = LBound(theArray) -1 ’Инициализация J

Do ’Начало цикла

J = J + 1 ’Наращивание J

If J > UBound (theArraay) Then ’Превышение верхнего предела?

Value = CVFrr (xlErrValue) ’Установка кода ошибки, если нет ни одного положительного элемента

Exit Do ’Прерывание цикла

End If

Value = theArray(J) ’Выбор элемента массива

Loop Until Value > 0 ’Проверка элемента

FirstPos2 = Value

End Function

В этой версии процедуры значение переменной J после каждого наращивания сравнивается с верхним пределом индекса массива, полученном с помощью функции UBond(). Если переменная J превысит верхний предел, то переменной Value будет присвоен код ошибки #VALUE!, чтобы показать, что ни один элемент массива не соответствует заданному условию. В этом случае цикл будет прерван оператором Exit Do. Обратите внимание на то, что теперь функция возвращает значение типа Variant, - это позволяет передать код ошибки.

Диалоговые окона

Встроенные диалоговые окона

Передача данных программе и получение данных от программы зачастую представляет собой непростую задачу. В зависимости от конкретного применения программы создается код, реализующий пользовательский интерфейс, и эта часть программы является едва ли не самой важной. В профессионально разработанных программах объем кода, реализующего пользовательский интерфейс, занимает около 90 % общего объема кода, и только 10 % используется для обработки данных. Анализируя Excel или любую другую коммерческую программу, вы легко убедитесь в справедливости этого утверждения.

Visual Basic представляет возможность применять диалоговые окна для получения данных от пользователя и для передачи ему информации. Кроме собственных встроенных диалоговых окон, Visual Basic может использовать все диалоговые окна Excel или Project.

Выделяют следующие виды окон:

· Встроенные диалоговые окна сообщений;

· Встроенные диалоговые окна ввода данных;

· Диалоговые окна Excel.

Применение функции MsgBox()

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

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