You return a Variant()
and enter the UDF as an array function (with 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()
or 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