Создать функцию, которая будет возвращать несколько значений — Visual Basic(Бейсик)

Вариант. Для того, чтобы Ваша функция возвращала несколько значений, можно воспользоваться возможностями, которые "предоставляет" тип 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

Leave a Comment