Передача данных при вызове программы
Вызывая подпрограмму, мы вправе передать в нее переменные или значения. Эта возможность еще более расширяет область применения подпрограмм, позволяя выполнять одни и те же действия с различными исходными данными.
Рассмотрим в качестве примера программу СлучайныеЧисла и подпрограмму Оформление. Сейчас разыгрывается строго 10 чисел и форматируются первые 10 ячеек столбца А. Модернизируем программу СлучайныеЧисла и введем в неё запрос о количестве разыгрываемых чисел. Получим следующий код:
1) | Sub СлучайныеЧисла() |
2) | Dim СлучЧисло As Integer |
3) | Dim Листов As String |
4) | Dim КолЧисел As Integer |
5) | Листов = Application.SheetsInNewWorkbook |
6) | Application.SheetsInNewWorkbook = 1 |
7) | Workbooks.Add |
8) | ActiveSheet.Name = "Случ. числа" |
9) | КолЧисел = Int(InputBox("Введите количество чисел:")) |
10) | For i = 1 To КолЧисел |
11) | СлучЧисло = Int(100 * Rnd()) |
12) | Cells(i, 1).Value = СлучЧисло |
13) | Next i |
14) | 'Вызов подпрограммы Оформление: |
15) | Оформление КолЧисел |
16) | Sheets.Add After:=Worksheets(Worksheets.Count) |
17) | Worksheets(1).Select |
18) | Range("A1").Select |
19) | Application.SheetsInNewWorkbook = Листов |
20) | ActiveWorkbook.SaveAs Filename:="C:\St\Случайные числа.xls" |
21) | MsgBox "Случайные числа разыграны!" |
22) | End Sub |
Внесем изменения в программу Оформление:
1) | Sub Оформление(КолЯчеек) |
2) | Range(Cells(1,1),Cells(КолЯчеек,1)).Select |
3) | Selection.Font.Italic = True |
4) | With Selection.Borders(xlEdgeLeft) |
5) | .LineStyle = xlDot |
6) | .ColorIndex = 5 |
7) | End With |
8) | With Selection.Borders(xlEdgeTop) |
9) | .LineStyle = xlDot |
10) | .ColorIndex = 5 |
11) | End With |
12) | With Selection.Borders(xlEdgeBottom) |
13) | .LineStyle = xlDot |
14) | .ColorIndex = 5 |
15) | End With |
16) | With Selection.Borders(xlEdgeRight) |
17) | .LineStyle = xlDot |
18) | .ColorIndex = 5 |
19) | End With |
20) | With Selection.Borders(xlInsideHorizontal) |
21) | .LineStyle = xlDot |
22) | .ColorIndex = 5 |
23) | End With |
24) | Range("A1").Select |
25) | End Sub |
Здесь есть два интересных момента. Во-первых, обращение к подпрограмме Оформление в программе СлучайныеЧисла содержит аргумент КолЧисел (15-я строка). Во-вторых, в первой строке Оформление в круглых скобках задано имя переменной КолЯчеек. Она принимает значение аргумента, который указывается в вызове подпрограммы (т.е. КолЧисел), и затем задает номер последней оформляемой строки.
Задание:
1. Создайте подпрограмму ОформлениеТаблицы, которая оформляет выходную таблицу (из программы МассивДоценты_СохранениеДанных_Мод) следующим образом:
Выходная таблица имеет ровно 3 столбца. Количество строк может варьироваться.
В 62-й строке программы МассивДоценты_СохранениеДанных_Мод снимете комментарий.
2. Протестируйте работу программы в различных режимах.
Передача по ссылке и по значению
Передача аргументов из одной программы в другую осуществляется двумя способами — по ссылке (by reference) и по значению (by value). В первом случае передается сама переменная, поэтому ее значение в подпрограмме можно изменить. Во втором случае — только значение переменной, а не она сама, и изменить ее в вызванной подпрограмме нельзя.
Выбор способа передачи осуществляется ключевыми словами ByRef и ByVal, которые в круглых скобках указываются в описании вызываемой подпрограммы.
В Модуль5 наберите и протестируйте работу следующих программ:
1. Пример передачи переменной UserName по ссылке с одним и тем же именем переменной (подпрограмма вызывается только для одной переменной):
Sub ПередачаАргументаПоСылке ()
Dim UserName As String
UserName = "Иван"
ChangeName UserName
MsgBox UserName
End Sub
Sub ChangeName (ByRef UserName)
UserName = "Петр"
End Sub
2. Пример передачи переменной по ссылке с разными именами (одна и та же подпрограмма вызывается для разных переменных):
Sub ПередачаАргументаПоСсылке_РазныеПеременные ()
Dim UserName As String
UserName = "Иван"
ChangeName2 UserName
MsgBox UserName
End Sub
Sub ChangeName2(ByRef NewName)
NewName = "Петр"
End Sub
3. Пример передачи переменной по значению (в подпрограмму передается только её значение):
Sub ПередачаАргументаПоЗначению()
Dim UserName As String
UserName = "Иван"
ChangeName3 UserName
MsgBox "В исходной программе имя осталось прежним " _
& UserName
End Sub
Sub ChangeName3(ByVal UserName)
MsgBox "Сначала был " & UserName & "."
UserName = "Петр"
MsgBox "В вызванной подпрограмме имя стало " & UserName
End Sub
Функции
Отличие функции от подпрограммы:
§ Функция начинается ключевым словом Function и заканчивается ключевыми словами End Function.
§ Функцию можно вызывать из формулы, введенной в ячейку.
§ Функция может возвращать значение в вызывающую программу или формулу.
Рассмотрим пример функции Multiply, вычисляющей произведение двух чисел.
Sub ВызовФункции()
Dim Var1 As Integer
Dim Var2 As Integer
Dim Var3 As Integer
Var1 =5
Var2 = 10
Var3 = Multiply(Var1, Var2)
MsgBox Var3
End Sub
Function Multiply(ByVal Var1, ByVal Var2)
Multiply = Var1 * Var2
End Function