逐个单元地将两个范围/数组相乘

时间:2014-10-09 23:45:09

标签: excel vba excel-vba

我正在尝试编写一个带有两个范围的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

2 个答案:

答案 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