Параметры, передающиеся по значению и по ссылке

Параметры, передающиеся по значению, – это параметры, значения которых передаются в подпрограмму и не передаются из нее обратно. Перед такими параметрами ставится оператор 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. Получить значение выражения

Параметры, передающиеся по значению и по ссылке - student2.ru ,

где Параметры, передающиеся по значению и по ссылке - student2.ru

Программный код

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

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