- •Лекция 7. Процедуры и функции в vba
- •Процедуры, функции и макросы
- •Вставка процедур и функций
- •Процедуры
- •Определение процедуры
- •Вызов процедуры
- •Обработчики событий
- •Функции
- •Определение функции
- •Вызов функции
- •Функции, возвращающие массивы
- •Параметры
- •Необязательные параметры
- •Передача параметров по значению и по ссылке
Необязательные параметры
Язык VBA позволяет объявлять параметр как необязательный, а также задавать так называемыезначения по умолчанию.
Для указания того, что параметр является необязательным, используется ключевое слово Optional, которое ставится перед именем параметра.
Для задания значения по умолчанию после описания формального параметра ставится знак равенства и значение, которое подставляется в подпрограмму, в случае отсутствия в вызове соответствующего фактического параметра.
Рассмотрим функцию, которая может возвращать целый диапазон, одну строку из диапазона, один столбец из диапазона или одну ячейку диапазона.
Public Function RangePart(r As Range, Optional row As Integer = 0, Optional column As Integer = 0) As Variant
If row = 0 And column = 0 Then
RangePart = r
ElseIf row = 0 Then
RangePart = r.Columns(column)
ElseIf column = 0 Then
RangePart = r.Rows(row)
Else
RangePart = r.Cells(row, column)
EndIf
EndFunction
'Функция возвращает весь диапазон, переданный в качестве первого параметра
r = RangePart(Worksheets(5).Range("A1:C4"))
'Функция возвращает одну ячейку, находящуюся в 1 строке 3 столбце
r = RangePart(Worksheets(5).Range("A1:C4"), 1, 3)
'Функция возвращает одну строку
r = RangePart(Worksheets(5).Range("A1:C4"), 5)
'Функция возвращает один столбец
r = RangePart(Worksheets(5).Range("A1:C4"), , 4)
r = RangePart(Worksheets(5).Range("A1:C4"), column:=4)
Параметры с типом Variantможно просто опускать, без задания значения по умолчанию, т.к. типVariantпозволяет в самом параметре указать факт отсутствия параметра. Для проверки, был ли параметр задан, используется функцияIsMissing. Рассмотрим для примера процедуру, которая в заданном диапазоне заменяет отрицательные числа. Кроме исходного диапазона можно также задать диапазон, откуда берутся числа для замены (в случае отсутствия этого параметра отрицательные числа заменяются модулями), и диапазон, куда копируется исходный диапазон с изменёнными значениями.
Public Sub Change(source As Range, Optional replace, Optional dest)
Dim i As Integer, j As Integer
If IsMissing(dest) Then
Set dest = source
Else
If TypeName(dest) <> "Range" Then Exit Sub
End If
If Not IsMissing(replace) And TypeName(replace) <> "Range" Then Exit Sub
For i = 1 To source.Rows.Count
For j = 1 To source.Columns.Count
If source.Cells(i, j) < 0 Then
If IsMissing(replace) Then
dest.Cells(i, j) = -source.Cells(i, j)
Else
dest.Cells(i, j) = replace.Cells(i, j)
End If
Else
dest.Cells(i, j) = source.Cells(i, j)
End If
Next j
Next i
EndSub
'Замена отрицательных чисел диапазона A1:C2 на их модули
'Результат записывается в исходный диапазон A1:C2
Change Worksheets(4).Range("A1:C2")
'Замена отрицательных чисел диапазона A1:C2 на числа из диапазона E1:G2
'Результат записывается в исходный диапазон A1:C2
Change Worksheets(4).Range("A1:C2"), Worksheets(4).Range("E1:G2")
'Замена отрицательных чисел диапазона A1:C2 на числа из диапазона E1:G2
'Результат записывается в диапазон I1:K2
Change Worksheets(4).Range("A1:C2"), Worksheets(4).Range("E1:G2"), _ Worksheets(4).Range("I1:K2")
'Замена отрицательных чисел диапазона A1:C2 на их модули
'Результат записывается в диапазон I1:K2
Change Worksheets(4).Range("A1:C2"), , Worksheets(4).Range("I1:K2")
'Явное указание имён параметров – данный вызов процедуры аналогичен предыдущему
Change dest:=Worksheets(4).Range("I1:K2"), source:=Worksheets(4).Range("A1:C2")