我正在尝试编写一个带有两个范围的Excel UDF(用户定义函数),并将range1中的第一个单元格与range2中的第一个单元格,range1中的第二个单元格以及range2中的第二个单元格相乘,依此类推,然后将结果存储在数组中。
想象一下单元格A1中的array1:A4 {1,0,1,2}和单元格B1中的array2:B4 {1,1,0,1}。我的函数VECTORMULT(A1:A4,B1:B4)将返回{1,0,0,2}。
Function VECTORMULT(array1 As Range, array2 As Range) As Variant
'takes 2 ranges and multiplies cell1 by cell1, cell2 by cell2, etc _
and stores it in a vector array
Dim Result() As Variant
Dim largerArray As Range
Dim smallerArray As Range
Dim i As Integer
'determine the smaller range to determine UBound in Result() array
If array1.Cells.Count >= array2.Cells.Count Then
Set largerArray = array1
Set smallerArray = array2
Else
Set largerArray = array2
Set smallerArray = array1
End If
ReDim Result(1 To smallerArray.Cells.Count)
'THIS IS THE PART THAT FAILS
For i = 1 To smallerArray.Cells.Count
Result(i) = largerArray.Item(i).value * smallerArray.Item(i).value
Next i
VECTORMULT = Result
End Function
我曾设想编写一个更通用的函数,接受无限制的ParamArray Args()并将每个Arg解析为数组,但我甚至无法解决这个看似简单的单元迭代器函数。我认为VBA可以用某种默认方式处理一个范围,比如
Range(someRange).Item(i)
但它没有......对于它的价值,当我用Item函数替换正确的Row / Column indeces时,我似乎得到了正确的值,如下所示;但是结果只适用于1个单元格(而不是数组)。我需要弄清楚如何传递“我”。
'substitute Item(1,1) for Item(i) and it DOES work
For i = 1 To smallerArray.Cells.Count
Result(i) = largerArray.Item(1,1).value * smallerArray.Item(1,1).value
Next i
答案 0 :(得分:3)
INDEX
函数通过在数组形式中消隐 row_num 和 column_num 参数来执行提供修改信息数组的任务/ em>,例如INDEX((A1:A4)*(B1:B4),,)
。范围的大小必须匹配,但除非您引用可以动态更改其形状的命名范围,否则应该匹配。示例(使用您的示例数据):
=SUM(INDEX((A1:A4)*(B1:B4),,)) '◄ 3
=MIN(INDEX((A1:A4)*(B1:B4),,)) '◄ 0
=MAX(INDEX((A1:A4)*(B1:B4),,)) '◄ 2
=AVERAGE(INDEX((A1:A4)*(B1:B4),,)) '◄ 0.75
FWIW,我使用这种形式的INDEX
来提供许多标准公式,因为似乎只有数组公式才有效。它作为数组处理,但不需要 Ctrl + Shift + Enter 。
MINIF, MAXIF and MODEIF with Standard Formulas
对于Excel 2010及更高版本,请查看新的AGGREGATE function以获取其他功能。
答案 1 :(得分:1)
您打算如何将其与其他公式结合使用可能会产生很大的不同,但是:
=A1:A4*B1:B4
作为数组公式输入将返回{1,0,0,2} - 虽然在复制之前不可见。但是可以独立访问数组的元素,例如:
=INDEX(A1:A4*B1:B4,4)
(也是一个数组公式)返回2
。