Как создать функцию, которая будет возвращать несколько значений?
Вариант. Для того, чтобы Ваша функция возвращала несколько значений, можно воспользоваться возможностями, которые "предоставляет" тип Variant, т.е.
code: #vbaFunction MyFunction() 'As Variant MyFunction = Array("Иванов Ю.В.", "г.Ростов-на-Дону, ул.Ленина,12", 1961) End Function
или
code: #vbaFunction MyFunction() 'As Variant Dim iMassiv(1 To 3) 'As Variant iMassiv(1) = "Иванов Ю.В." iMassiv(2) = "г.Ростов-на-Дону, ул.Ленина,12" iMassiv(3) = 1961 MyFunction = iMassiv End Function
Вызвать же программно эту функцию и получить все значения можно, использовав любой из двух нижеопубликованных вариантов (кстати, второй способ имеет смысл использовать тогда, когда нет необходимости в использовании переменной)
code: #vbaPrivate 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: #vbaFunction MyFunction() As Collection Set MyFunction = New Collection MyFunction.Add "Иванов Ю.В." MyFunction.Add "г.Ростов-на-Дону, ул.Ленина,12" MyFunction.Add 1961 End Function
Вызвать же программно эту функцию и получить все значения можно, использовав любой из двух нижеопубликованных вариантов (второй способ можно использовать в том случае, когда нет необходимости в использовании переменной)
code: #vbaPrivate 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: #vbaFunction 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: #vbaFunction 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