Вариант. Для того, чтобы Ваша функция возвращала несколько значений, можно воспользоваться возможностями, которые "предоставляет" тип Variant, т.е.
code: #vba
Function MyFunction() 'As Variant
MyFunction = Array("Иванов Ю.В.", "г.Ростов-на-Дону, ул.Ленина,12", 1961)
End Function
или
code: #vba
Function MyFunction() 'As Variant
Dim iMassiv(1 To 3) 'As Variant
iMassiv(1) = "Иванов Ю.В."
iMassiv(2) = "г.Ростов-на-Дону, ул.Ленина,12"
iMassiv(3) = 1961
MyFunction = iMassiv
End Function
Вызвать же программно эту функцию и получить все значения можно, использовав любой из двух нижеопубликованных вариантов (кстати, второй способ имеет смысл использовать тогда, когда нет необходимости в использовании переменной)
code: #vba
Private Sub Call_MyFunction()
iMassiv = MyFunction
For iCount& = LBound(iMassiv) To UBound(iMassiv)
MsgBox iMassiv(iCount&), , "Способ I"
Next
For Each vItem In MyFunction
MsgBox vItem, , "Способ II"
Next
End Sub
Если же Вы планируете вызвать свою функцию из ячеек рабочего листа, то:
подобную функцию необходимо вводить как формулу массива
при вводе формулы в ячейки столбца желательно воспользоваться стандартной функцией рабочего листа =ТРАНСП()
для получения только нужных значений (фактически отдельных элементов массива) следует использовать стандартную функцию рабочего листа =ИНДЕКС()
Если Вы используете функцию =ИНДЕКС() для получения всех значений возвращаемых Вашей функцией, то первый пункт автоматически становится неактуален
Вариант. Если нет необходимости вызывать функцию из ячеек рабочего листа, то для получения аналогичного результата можно просто воспользоваться обычной коллекцией / Collection, т.е.
code: #vba
Function MyFunction() As Collection
Set MyFunction = New Collection
MyFunction.Add "Иванов Ю.В."
MyFunction.Add "г.Ростов-на-Дону, ул.Ленина,12"
MyFunction.Add 1961
End Function
Вызвать же программно эту функцию и получить все значения можно, использовав любой из двух нижеопубликованных вариантов (второй способ можно использовать в том случае, когда нет необходимости в использовании переменной)
code: #vba
Private Sub Call_MyFunction()
Dim iCollection As Collection
Set iCollection = MyFunction
For iCount& = 1 To iCollection.Count
MsgBox iCollection(iCount&), , "Способ I"
Next
Dim vItem As Variant
For Each vItem In MyFunction
MsgBox vItem, , "Способ II"
Next
End Sub
Вариант. Автор: Сергей Гергерт. Начиная с Microsoft Excel XP можно использовать и такой способ:
code: #vba
Function MyFunction() As Single()
Dim sngTempArr(1 To 3) As Single
sngTempArr(1) = 100.123
sngTempArr(2) = 100.456
sngTempArr(3) = 100.789
MyFunction = sngTempArr
End Function
Разумеется массив может быть динамический, т.е.
code: #vba
Function MyFunction2(lngCount As Long) As Double()
Dim dblTempArr() As Double
ReDim dblTempArr(1 To lngCount) As Double
For lngCount = 1 To lngCount
dblTempArr(lngCount) = Rnd() * 10000
Next
MyFunction2 = dblTempArr
End Function