带INDEX的最小Excel数组公式()

时间:2013-03-12 03:40:20

标签: excel excel-formula

我在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应用于每个单数元素,并且函数返回原始数组大小,而不是单个值最低限度。

有什么方法吗?

3 个答案:

答案 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)

不确定在不使用MatchIndex的情况下进行数组查找效率最高但效果不错。