vba - 将两个范围/数组逐个单元格相乘

标签 vba excel

我正在尝试编写一个 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/

相关文章:

vba - 循环遍历行以将值均匀地拆分到新的电子表格中

excel - 工作表不存在时的错误处理

javascript - 带有单选按钮的 html 表复制粘贴到 xls 中

vba - 在特定工作表中搜索文本字符串

excel - 查找 `find` 方法是否在 Excel VBA 中返回 `nothing`

excel - 如何替换字符串中的第一个字符

vba - Wscript.Shell Exec 中的单词 "encode"确实会阻止 powershell 脚本运行。我能做什么?

vba - 检查是否应用了条件格式

excel - 在 OR 函数 (EXCEL) 中使用范围

excel - 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?