我在Excel中使用这个数组公式有点麻烦。
我有两个范围(数据列)对应于行和列号到整个数组,其中包含要应用于非相关函数的乘数。我想找到从列/行引用中找到的最小乘数。
我们假设列号范围是A1:A10
,行号范围是A15:A24
,乘数数组是K4:M23
。执行此操作的低效方法是:
=MIN(INDEX(K4:M23,A15,A1),INDEX(K4:M23,A16,A2),etc...)
...但这会很麻烦,特别是在检查错误等时。更不用说如果这个函数被调用几千次就会占用内存(恰好是这样)。
所以我想到了一个数组函数:
{=MIN(INDEX(K4:M23,A15:A24,A1:A10))}
...但这只返回数组中的第一个元素。如果此函数作为多单元格数组公式输入,则它会正确处理它,但它似乎就是这样,MIN
应用于每个单数元素,并且函数返回原始数组大小,而不是单个值最低限度。
有什么方法吗?
答案 0 :(得分:1)
如果我理解你的问题,以下VBA功能应该产生你想要的。
该函数有三个参数:对数组范围的引用;对行号范围的引用;以及对列号范围的引用。它返回与行号和列号对应的单元格中的最小值。
Function ArrayMin(MatrixRange As Range, RowRange As Range, ColRange As Range) As Double
Application.Volatile
Dim colNum As Long
Dim rowNum As Long
Dim cellVal As Double
Dim MinVal As Double
Dim i As Long
MinVal = 1000000 'a number >= than max array range value
For i = 0 To ColRange.Rows.Count - 1
rowNum = RowRange(1, 1).Offset(i, 0).Value
colNum = ColRange(1, 1).Offset(i, 0).Value
cellVal = MatrixRange(rowNum, colNum).Value
If cellVal < MinVal Then
MinVal = cellVal
End If
Next
ArrayMin = MinVal
End Function
可以通过在工作簿中插入新的标准VBA模块并粘贴代码来以标准方式安装它。
答案 1 :(得分:1)
我从来没有能够对索引的输出进行操作,就像它是一个数组一样。可以做的是过滤原始的乘数表。为避免辅助细胞,可以在定义的名称中完成
rowFilter: = SIGN( MATCH(rowIndex, selectedRows, 0))
columnFilter: = SIGN( MATCH(columnIndex, selectedColumns, 0 ) )
filteredMultipliers:= multipliers * rowFilter * columnFilter
工作表公式
= AGGREGATE( 15, 6, filteredMultipliers, 1 )
将识别忽略故意#N / A错误的最小值。
答案 2 :(得分:0)
感谢pbart的一点灵感,这里是我如何正确地做到这一点......(在我提出这个问题后的一年半。)
我基本上创建了一个与K4:M23
尺寸相同的参考数组,它在列和行数组的交叉处有一个,并将它们相乘。
=AGGREGATE(15,6,(IF(MMULT(TRANSPOSE(IFERROR(IF(A15:A24=COLUMN(1:20),1,0),0)),IFERROR(IF(A1:A10={1,2,3},1,0),0))=0,#N/A,1)*K4:M23),1)
不确定在不使用Match
或Index
的情况下进行数组查找效率最高但效果不错。