Как создать функцию, которая будет возвращать несколько значений?

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

    Если же Вы планируете вызвать свою функцию из ячеек рабочего листа, то:

    • подобную функцию необходимо вводить как формулу массива
    • при вводе формулы в ячейки столбца желательно воспользоваться стандартной функцией рабочего листа =ТРАНСП()
    • для получения только нужных значений (фактически отдельных элементов массива) следует использовать стандартную функцию рабочего листа =ИНДЕКС()

    Если Вы используете функцию =ИНДЕКС() для получения всех значений возвращаемых Вашей функцией, то первый пункт автоматически становится неактуален

  2. Вариант. Если нет необходимости вызывать функцию из ячеек рабочего листа, то для получения аналогичного результата можно просто воспользоваться обычной коллекцией / 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
  3. Вариант. Автор: Сергей Гергерт. Начиная с 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
Поделиться:

Похожие статьи: