每个单元格乘以两个范围/数组

我试图编写一个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 

我曾经想过编写一个更通用的函数来接受无限的ParamArrayArgs(),并将每个Argparsing为一个数组,但是我甚至无法解决这个看似简单的单元格迭代函数。 我认为VBA可以像一些默认的方式来处理一个范围

 Range(someRange).Item(i) 

但它不…对于什么是值得的,我似乎得到正确的值,当我replace正确的行/列indeces为Item函数,如下所示; 但结果只能在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 

INDEX函数执行通过以其数组forms (例如INDEX((A1:A4)*(B1:B4),,) 清空row_numcolumn_num参数来传递修改信息数组的任务。 范围的大小必须匹配,但应该除非您引用可以dynamic更改其形状的命名范围。 示例(使用您的示例数据):

 =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,我使用这种forms的INDEX来提供许多标准的公式似乎只有一个数组公式可以工作。 它作为一个数组进行处理,但不需要Ctrl + Shift + Enter

MINIF,MAXIF和MODEIF标准公式

对于Excel 2010及更高版本,请查看新的AGGREGATE函数以获取更多function。

你打算如何与其他公式一起使用可能会产生很大的不同,但是:

  =A1:A4*B1:B4 

作为数组公式可以返回{1,0,0,2} – 虽然不可见,直到被复制下来。 但是数组的元素可以独立访问,比如说:

 =INDEX(A1:A4*B1:B4,4) 

(也是一个数组公式)返回2