Vba 将两个范围/阵列逐单元格相乘

Vba 将两个范围/阵列逐单元格相乘,vba,excel,Vba,Excel,我正在尝试编写一个Excel UDF用户定义函数,它接受两个范围,将range1中的第一个单元格与range2中的第一个单元格相乘,将range1中的第二个单元格与range2中的第二个单元格相乘,依此类推,然后将结果存储在数组中 想象一下A1:A4{1,0,1,2}单元格中的array1和B1:B4{1,1,0,1}单元格中的array2。我的函数VECTORMULTA1:A4,B1:B4将返回{1,0,0,2} Function VECTORMULT(array1 As Range, arr

我正在尝试编写一个Excel UDF用户定义函数,它接受两个范围,将range1中的第一个单元格与range2中的第一个单元格相乘,将range1中的第二个单元格与range2中的第二个单元格相乘,依此类推,然后将结果存储在数组中

想象一下A1:A4{1,0,1,2}单元格中的array1和B1:B4{1,1,0,1}单元格中的array2。我的函数VECTORMULTA1: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 Arg并将每个Arg解析为一个数组,但我甚至无法解决这个看似简单的cell迭代器函数。我认为VBA可以以某种默认方式处理范围内的步进,如

Range(someRange).Item(i)
但它不。。。值得一提的是,当我用正确的行/列索引替换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

您计划如何将其与其他公式结合使用可能会产生很大的差异,但:

 =A1:A4*B1:B4  
作为数组公式输入将返回{1,0,0,2}-尽管在say Copy down之前不可见。但阵列的元素可以独立访问,例如:

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

还有一个返回2的数组公式。

您计划如何将其与其他公式结合使用可能会产生很大的差异,但是:

 =A1:A4*B1:B4  
作为数组公式输入将返回{1,0,0,2}-尽管在say Copy down之前不可见。但阵列的元素可以独立访问,例如:

=INDEX(A1:A4*B1:B4,4)  
还有一个返回2的数组公式。

索引函数通过在其数组形式中清空行数和列数参数来执行传递修改信息数组的任务,例如INDEXA1: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,我使用这种形式的索引来提供许多标准公式,但似乎只有数组公式可以工作。它作为数组处理,但不需要Ctrl+Shift+Enter

对于Excel 2010及更高版本,请查看新功能。

索引函数通过在其数组形式中清空行数和列数参数(例如INDEXA1: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,我使用这种形式的索引来提供许多标准公式,但似乎只有数组公式可以工作。它作为数组处理,但不需要Ctrl+Shift+Enter


对于Excel 2010及更高版本,请查看新版本以获取更多功能。

为什么说它失败了?它出错了吗?或者它不能产生你期望的结果?顺便说一句,这可能是一个输入错误,但您的函数是VECTORMULTrng,但您正在将结果分配给VECTORMULT。谢谢,修复了!这是尝试不同版本函数的结果。在我自己的代码中修复这一点也会导致函数为我的最后一段代码返回正确的值,因此这也是修复的。在范围内单步执行并返回数组的主要问题仍然存在。要回答第一个问题,请回答主代码段中的函数返回一个值错误。因此,您正在工作表的单元格中尝试将其用作公式?在我这里,你的第一个代码运行得很好。正确。我计划将它与其他以数组为参数的公式结合使用。你为什么说它失败了?它出错了吗?或者它不能产生你期望的结果?顺便说一句,这可能是一个输入错误,但您的函数是VECTORMULTrng,但您正在将结果分配给VECTORMULT。谢谢,修复了!这是尝试不同版本函数的结果。在我自己的代码中修复这一点也会导致函数为我的最后一段代码返回正确的值,因此这也是修复的。在范围内单步执行并返回数组的主要问题仍然存在。要回答第一个问题,请回答主代码段中的函数返回一个值错误。因此,您正在工作表的单元格中尝试将其用作公式?在我这里,你的第一个代码运行得很好。正确。我计划将它与其他以数组为参数的公式结合使用。是的!我曾经尝试过这样的索引,但没有意识到我可以省略行和列参数。这正是我想要的。如上所述,如果两个范围的方向都是相同的行或列,则此技术有效。您可以通过在其中一个范围上使用转置来比较行和列,但随后必须以数组形式输入函数Ctrl+Shift+EnterPoint:与最小值和最大值一起使用这是一种更强大的按位AND运算符,用于矩阵中的eg权限。将第一个数组用作0no和1yes,然后将第二个数组用作val
对于基于第一个范围的是/否位的多个可能分配,使用-1、0、1和2等UE。是!我曾经尝试过这样的索引,但没有意识到我可以省略行和列参数。这正是我想要的。如上所述,如果两个范围的方向都是相同的行或列,则此技术有效。您可以通过在其中一个范围上使用转置来比较行和列,但随后必须以数组形式输入函数Ctrl+Shift+EnterPoint:与最小值和最大值一起使用这是一种更强大的按位AND运算符,用于矩阵中的eg权限。使用第一个数组作为0no和1yes,然后使用值为-1、0、1和2的第二个数组根据第一个范围中的Yes/No位进行多个可能的赋值。