1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | Вариант. Для того, чтобы Ваша функция возвращала несколько значений, можно воспользоваться возможностями, которые "предоставляет" тип 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 |