Параметры, передающиеся по значению и по ссылке
Параметры, передающиеся по значению, – это параметры, значения которых передаются в подпрограмму и не передаются из нее обратно. Перед такими параметрами ставится оператор ByVal. Параметры, передающиеся по ссылке, – это параметры, значения которых вычисляются в подпрограмме и передаются из нее в другие подпрограммы. Перед такими параметрами ставится оператор ByRef.
Рассмотрим несколько примеров использования подпрограммы-процедуры.
Пример 1
Сформировать три матрицы A(K, K), B(L, L), C(M,M) на разных листах Excel.
Размерность у каждой матрицы своя.
Матрицы должны иметь вид
... | N | |||
... | ||||
... | ... | |||
... | ||||
... | N |
Программный код
Option Explicit
Dim i As Integer, j As Integer ‘ описание глобальных параметров
Sub PR28()
Dim a(1 To 10, 1 To 10) As Integer
Dim b(1 To 10, 1 To 10) As Integer
Dim c(1 To 10, 1 To 10) As Integer
Dim K As Integer, L As Integer, M As Integer
K = Val(InputBox("Введи K"))
L = Val(InputBox("Введи L"))
M = Val(InputBox("Введи M"))
F K, a ‘ вызов подпрограммы F для массива a
F L, b ‘ вызов подпрограммы F для массива b
F M, c ‘ вызов подпрограммы F для массива c
Worksheets("Лист1").Select ‘ переходим на Лист1
W K, a ‘ вызов подпрограммы W для массива a
Worksheets("Лист2").Select ‘ переходим на Лист2
W L, b ‘ вызов подпрограммы W для массива b
Worksheets("Лист3").Select ‘ переходим на Лист3
W M, c ‘ вызов подпрограммы W для массива c
End Sub
Private Sub F(ByVal n As Integer, ByRef x() As Integer)
For i = 1 To n ‘ формирование матрицы
For j = 1 To n
x(i, j) = 0
If i = j Then x(i, j) = i
If i + j = n + 1 Then x(i, j) = n + 1 – i
Next j
Next i
End Sub
Private Sub W(ByVal n As Integer, ByRef x() As Integer)
Range(Cells(1, 1), Cells(10, 10)).Select
Selection.Clear
Cells(1, 1).Select
For i = 1 To n ‘ вывод матрицы
For j = 1 To n
Cells(i, j) = x(i, j)
Next j
Next i
End Sub
Пример 2
Прочитать три матрицы с разных листов Excel. В каждой матрице вычислить максимальный элемент, а затем найти сумму этих максимумов.
Программный код
Option Explicit
Dim i As Integer, j As Integer ‘ описание глобальных параметров
Sub PR29()
Dim a(1 To 10, 1 To 10) As Integer
Dim b(1 To 10, 1 To 10) As Integer
Dim c(1 To 10, 1 To 10) As Integer
Dim K As Integer
Dim L As Integer
Dim M As Integer
Dim MaxA As Integer
Dim MaxB As Integer
Dim MaxC As Integer
Dim S As Integer
K = Val(InputBox("Введи K"))
L = Val(InputBox("Введи L"))
M = Val(InputBox("Введи M"))
Worksheets("Лист1").Select ‘ переходим на Лист1
Wwod K, a ‘ вызов подпрограммы Wwod для матрицы a
Worksheets("Лист2").Select ‘ переходим на Лист2
Wwod L, b ‘ вызов подпрограммы Wwod для матрицы b
Worksheets("Лист3").Select ‘ переходим на Лист3
Wwod M, c ‘ вызов подпрограммы Wwod для матрицы c
Max K, a, MaxA ‘ вызов подпрограммы Max для матрицы a
Max L, b, MaxB ‘ вызов подпрограммы Max для матрицы b
Max M, c, MaxC ‘ вызов подпрограммы Max для матрицы c
S = MaxA + MaxB + MaxC
MsgBox ("MaxA=" & MaxA)
MsgBox ("MaxB=" & MaxB)
MsgBox ("MaxC=" & MaxC)
MsgBox ("S=" & S)
End Sub
Private Sub Wwod(ByVal n As Integer, ByRef x() As Integer)
For i = 1 To n ‘ ввод матрицы
For j = 1 To n
x(i, j) = Cells(i, j)
Next j
Next i
End Sub
Private Sub Max(ByVal n As Integer, ByRef x() As Integer, ByRef max1 As Integer)
max1 = –32000
For i = 1 To n
For j = 1 To n
If x(i, j) > max1 Then max1 = x(i, j)
Next j
Next i
End Sub
Пример 3
С помощью счетчика случайных чисел заполнить две матрицы на разных листах Excel и в каждой матрице упорядочить по возрастанию элементы каждой строки. Полученные матрицы вывести на те же листы Excel.
Программный код
Option Explicit
Dim i As Integer, j As Integer ‘ описание глобальных параметров
Sub PR30()
Dim x(1 To 10, 1 To 10) As Integer
Dim y(1 To 10, 1 To 10) As Integer
Dim K As Integer, L As Integer
K = Val(InputBox("Введи K"))
L = Val(InputBox("Введи L"))
Worksheets("Лист1").Select
Matr K, x
Worksheets("Лист2").Select
Matr L, y
End Sub
Private Sub Matr(ByVal n As Integer, ByRef a() As Integer)
Dim M, R As Integer
Range(Cells(1, 1), Cells(10, 10)).Select
Selection.Clear
Cells(1, 1).Select
‘ заполнение матрицы
For i = 1 To n
For j = 1 To n
Cells(i, j) = Int(Rnd * 100 – 50)
a(i, j) = Cells(i, j)
Next j
Next i
‘ сортировка
For i = 1 To n
For M = 1 To n – 1
For j = 1 To n – M
If a(i, j) > a(i, j + 1) Then
R = a(i, j)
a(i, j) = a(i, j + 1)
a(i, j + 1) = R
End If
Next j
Next M
Next i
‘ вывод на лист Excel новой матрицы
Cells(i, 2) = "полученная матрица"
For i = 1 To n
For j = 1 To n
Cells(i + 1 + n, j) = a(i, j)
Next j
Next i
End Sub
Подпрограмма-функция
Подобно подпрограмме-процедуре Sub, подпрограмма-функция Function является самостоятельной подпрограммой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. В отличие от подпрограммы-процедуры подпрограмма-функция может применяться в правой части выражения, как и любая другая встроенная функция, например косинус или синус угла. Подпрограмма-функция возвращает один результат и он должен быть присвоен имени этой функции.
Синтаксис:
[Public | Private] [Static] Function Имя [(Список аргументов)] As Тип
Тело подпрограммы
Имя = Выражение
End Function
Подпрограмма-функция вызывается в выражении по своему имени, за которым следует список аргументов в скобках:
Переменная = Имя подпрограммы-функции(Список аргументов)
Пример 1
Даны действительные числа s, t. Получить значение выражения
,
где
Программный код
Option Explicit
Sub PR31()
Dim s As Double
Dim t As Double
Dim f As Double
s = Val(InputBox("Введи s"))
t = Val(InputBox("Введи t"))
f = Q(1.2, s) + Q(t, s) – Q(2 * s – 1, s * t)
MsgBox("f=" & f)
End Sub
Private Function Q(ByVal a As Double, ByVal b As Double) As Double
Q = (a^2 + b^2) / (a^2 + 2 * a * b + 3 * b^2 + 4)
End Function
Пример 2
Известна заработная плата сотрудников двух отделов. Вычислить среднюю заработную плату сотрудников в каждом отделе и определить, где она больше и насколько.
Программный код
Option Explicit
Dim i As Integer ‘ Описание глобальных параметров
Sub PR32()
Dim x(1 To 100) As Double
Dim y(1 To 100) As Double
Dim N As Integer
Dim M As Integer
Dim Sz1 As Double
Dim Sz2 As Double
N = Val(InputBox("Введите количество сотрудников 1-го отдела"))
M = Val(InputBox("Введите количество сотрудников 2-го отдела"))
Sz1 = Sz(N, x, 2)
Sz2 = Sz(M, y, 4)
MsgBox("Средняя зарплата сотрудников 1-го отдела =" & Sz1)
MsgBox("Средняя зарплата сотрудников 2-го отдела =" & Sz2)
If Sz1 > Sz2 Then MsgBox("В 1-м отделе средняя зарплата больше")
If Sz2 > Sz1 Then MsgBox("Во 2-м отделе средняя зарплата больше")
If Sz1 = Sz2 Then MsgBox("Средняя зарплата в отделах одинакова")
End Sub
Private Function Sz(ByVal k As Integer, ByRef a() As Double, ByVal k1 As Integer) As Double
Dim s As Double ‘ описание промежуточной переменной
s = 0
For i = 1 To k ‘ считывание данных и заполнение массива
A(i) = Cells(k1, i)
s = s + a(i) ‘ вычисление общей суммы
Next i
Sz = s / k ‘ вычисление средней зарплаты
End Function