我正在尝试编写一个 Excel UDF(用户定义函数),它采用两个范围并将 range1 中的第一个单元格与 range2 中的第一个单元格相乘,range1 中的第二个单元格乘以 range2 中的第二个单元格,依此类推,然后存储结果在一个数组中。
想象单元格 A1:A4 {1,0,1,2} 中的 array1 和单元格 B1:B4 {1,1,0,1} 中的 array2。我的函数 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)
但它没有......对于它的值(value),当我用正确的行/列索引替换 Item 函数时,我似乎确实得到了正确的值,如下所示;但是 Result 仅适用于 1 个单元格(而不是数组)。我需要弄清楚如何传递“i”。
'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
最佳答案
INDEX
函数通过清除数组形式的 row_num 和 column_num 参数来执行传递修改信息数组的任务,例如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附加功能。
关于vba - 将两个范围/数组逐个单元格相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289736/