Операторы условного перехода 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
вычисляющей следующую функцию с двумя условиями:
Заметим, что знак подчеркивания «_» в конце строки обозначает, что следующая строка является продолжением предыдущей.
Пусть в ячейку А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 в конце. Ниже приведен синтаксис всех четырех конфигураций:
|
’ Условие True в начале.
’
Do While условие
...блок кода
Exit Do
...блок кода
Loop
’
|
’
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() обеспечивает создание диалогового окна, подобного простому окну сообщения. Если окно сообщения всего лишь отображает сообщение для пользователя. то диалоговое окно требует от пользователя некоторых действий по вводу данных. Оно отображает строку текста, а затем ожидает, пока пользователь нажмет командную кнопку (их возможное число не ограничено).