使用INDEX()的最小Excel数组公式

我在Excel中遇到这个数组公式有点麻烦。

我有两个范围(数据列),对应于行和列号到整个数组,其中包含要应用于非相关函数的乘法器。 我想find从列/行引用find的最小乘数。

假设列号范围是A1:A10 ,行号范围是A15:A24 ,乘数arrays是K4:M23 。 一个低效率的方法是做:

 =MIN(INDEX(K4:M23,A15,A1),INDEX(K4:M23,A16,A2),etc...) 

…但这会变得麻烦,尤其是如果检查错误等。更不用说如果这个函数被称为几千次(它恰好是),内存使用情况。

所以我想到了一个数组函数:

 {=MIN(INDEX(K4:M23,A15:A24,A1:A10))} 

…但是这只返回数组中的第一个元素。 如果这个函数是作为一个多单元格数组公式input的,但是它似乎是, MIN被应用于每个单数元素,函数返回原始数组大小,而不是最小值的单个值。

有什么办法呢?

如果我正确理解你的问题,下面的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模块并粘贴代码来以标准方式进行安装。

我从来没有能够像索引数组一样操作索引的输出。 可以做的是过滤原始的乘法器表。 为了避免帮助单元,可以在定义的名称中完成

 rowFilter: = SIGN( MATCH(rowIndex, selectedRows, 0)) columnFilter: = SIGN( MATCH(columnIndex, selectedColumns, 0 ) ) filteredMultipliers:= multipliers * rowFilter * columnFilter 

工作表公式

 = AGGREGATE( 15, 6, filteredMultipliers, 1 ) 

将识别最小值,忽略故意的#N / A错误。

感谢pbart的一点启发,以下是我如何正确地做到这一点…(问了一个半年后)。

我基本上创build了一个与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) 

不知道这是最有效的,但没有使用MatchIndex做一个数组查找。