Вы возвращаете Variant()
и вводите UDF как функцию массива (с помощью CTRL + SHIFT + ENTER )
Пример функции, которая удваивает значение в массиве
Public Function ScaleValues(ByRef r As Range, ByVal factor As Double) As Variant()
Dim n As Long, m As Long, i As Long, j As Long
n = r.Rows.Count: m = r.Columns.Count
Dim vals() As Variant
vals = r.Value
For i = 1 To n
For j = 1 To m
vals(i, j) = factor * vals(i, j)
Next j
Next i
ScaleValues = vals
End Function
В частности, функция для заполнения ячеек в последовательности будет:
Public Function MySeq(ByVal start_value As Long, ByVal end_value As Long) As Variant()
Dim n As Long, i As Long
n = end_value - start_value + 1
Dim vals() As Variant
ReDim vals(1 To n, 1 To 1)
For i = 1 To n
vals(i, 1) = start_value + (i - 1)
Next i
MySeq = vals
End Function
Это хорошо, как вы можете проверить. Введите =SUM(MySeq(1,24))
в ячейку, и вы получите 300, что является правильным ответом. Если вы хотите использовать линейную алгебру, например, масштабирование или добавление массивов, то для каждого шага вы должны отделить операцию от столбца к столбцу.
Обратите внимание, что вы не можете хранить весь массив в одной ячейке. Поверьте мне, я пробовал множество способов (например, установил формулу на ={1,2,3,4}
). Даже если это удастся, нет никакого способа извлечь значения любым стандартным способом для использования в SUM()
, TRANSPOSE()
или MMULT()
.
Для потомков есть версия функции последовательности который обрабатывает нецелые значения и не единичный шаг (шаг)
Public Function MySeq2(ByVal start_value As Double, ByVal end_value As Double, Optional stride As Double = 1) As Variant()
Dim n As Long, i As Long
n = (end_value - start_value + stride) / stride
Dim vals() As Variant
ReDim vals(1 To n, 1 To 1)
For i = 1 To n
vals(i, 1) = start_value + (i - 1) * stride
Next i
MySeq2 = vals
End Function