Безусловный переход. Оператор GOTO

Для безусловного перехода на желаемый оператор в программе на VBA используется оператор Goto, за которым указывается метка оператора, к которому требуется перейти. Метка указывается перед оператором. Между меткой и оператором указывается двоеточие.

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

Sub primer1_12()

nachalo: x = InputBox("Введите число")

If x < 0 Then Goto konec

koren = Sqr(x)

MsgBox ("Корень равен " & koren)

Goto nachalo

konec: End Sub

Здесь nachalo и konec – метки.

Подпрограммы.

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

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

Sub primer1_13()

Dim a() As Single

m = InputBox("Введите количество строк массива")

n = InputBox("Введите количество столбцов массива")

ReDim a (1 To m, 1 To n), asum(1 To n)

For i = 1 To m

For j = 1 To n

a(i, j) = InputBox("a(" & i & "," & j & ")")

Next j

Next i

nomer_stroki = InputBox(“Укажите, в какой строке требуется найти максимум”)

Call poisk_max(a, n, nomer_stroki, max_elem, nomer_max_elem)

MsgBox(“Максимальный элемент “ & i & “-й строки равен “ & max_elem)

MsgBox(“Он находится в “ & nomer_max_elem & “-м столбце“)

End Sub

Sub poisk_max(massiv, kol_stolb, i, max, nom_max)

max=massiv(i,1) : nom_max=1

For j=1 To kol_stolb

If massiv(i,j)>max Then

max = massiv(i,j)

nom_max = j

Next j

End Sub

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

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

Оператор Call – вызов подпрограммы. В данном примере он имеет следующий вид:

Call poisk_max(a, n, nomer_stroki, max_elem, nomer_max_elem)

Здесь poisk_max – имя вызываемой подпрограммы. Переменные a, n и nomer_stroki – входные параметры, так как при вызове подпрограммы их значения уже заданы. Переменные max_elem и nomer_max_elem – выходные параметры, так как они должны быть определены в результате выполнения подпрограммы.

Далее строка представляет собой заголовок подпрограммы:

Sub poisk_max(massiv, kol_stolb, i, max, nom_max)

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

В данном примере при вызове подпрограммы poisk_max переменная massiv получает значение переменной a (т.е. значение массива, введенного в основной программе), переменная kol_stolb – значение n, переменная i – значение nomer_stroki. Переменные max и nom_maxполучают значения переменных max_elem и nomer_max_elem; так как этим переменным в основной программе не было присвоено никакого значения, они равны нулю.

Затем выполняется подпрограммаpoisk_max. В результате ее выполнения определяются значения переменных max и nom_max. Эти же значения получают соответствующие переменные основной программы, в данном случае – переменные max_elem и nomer_max_elem.

По окончании выполнения подпрограммы происходит возврат в основную подпрограмму. Выполняется оператор, следующий за оператором Call. В данном случае это оператор MsgBox, выводящий результат на экран.

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

Call poisk_max(a, n, 3, max_elem, nomer_max_elem)

Никаких изменений в самой подпрограмме poisk_max при этом не требуется. При вызове подпрограммы переменная i получит значение 3. Все остальные действия выполняются точно так же, как описано выше.

Функции.

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

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

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

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

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

Sub primer1_13()

Dim a() As Single, b() As Single

n = InputBox("Введите размерность пространства")

ReDim a(1 To n), b(1 To n)

MsgBox ("Вводите координаты первой точки")

For i = 1 To n

a(i) = InputBox("Координата " & i & ": ")

Next i

MsgBox ("Вводите координаты второй точки")

For i = 1 To n

b(i) = InputBox("Координата " & i & ": ")

Next i

d = rasst(a, b, n)

MsgBox ("Расстояние равно " & d)

End Sub

Function rasst(x, y, razmernost)

rasst = 0

For i = 1 To razmernost

rasst = rasst + (x(i) - y(i)) ^ 2

Next i

rasst = Sqr(rasst)

End Function

Здесь rasst – функция. Она вызывается в операторе d = rasst(a, b, n). Таким образом, переменные a и b (массивы с координатами точек), а также переменная n (размерность пространства, т.е. количество координат у каждой точки) являются входными параметрами функции rasst. В самой функции rasst значения этих переменных присваиваются переменным x, y и razmernost соответственно. Функция вычисляет расстояние между точками. Результат присваивается переменной rasst. Следует обратить внимание, что имя этой переменной обязательно должно совпадать с именем самой функции (в данном случае – rasst). По окончании выполнения функции rasst выполняется возврат в основную программу: выполняется оператор, где была вызвана функция, т.е. оператор d = rasst(a, b, n). Таким образом, значение функции rasst присваивается переменной d. Затем эта переменная выводится на экран оператором MsgBox.