1

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

有什么办法吗?

4

3 回答 3

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 模块并粘贴代码以标准方式安装。

于 2013-03-12T06:38:33.497 回答
1

我从来没有能够像操作数组一样对 index 的输出进行操作。相反,可以做的是过滤原始乘数表。为了避免辅助单元格,这可以在定义的名称内完成

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

工作表公式

= AGGREGATE( 15, 6, filteredMultipliers, 1 )

将确定忽略故意 #N/A 错误的最小值。

于 2014-10-30T22:26:30.733 回答
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)

不确定它是最有效的,但在不使用Matchor的情况下进行数组查找也不错Index

于 2014-11-06T22:04:49.510 回答