Excel数组公式使用INDEX并且是变量相关的

时间:2017-05-04 19:12:45

标签: arrays excel indexing

我目前有一张表格,其中数据正在输入特定列。然后在摘要表中,我使用带索引的数组公式来生成与特定字段匹配的原始工作表上的所有数据的列表。

汇总表上的每列都有一个数组公式,链接回数据表上的等效列。 A-> A,B-> B,C-> C等......

数组公式如下:

{=IFERROR(INDEX('data'!C$2:C$1168,SMALL(IF('data'!$S$2:$S$1168>='OUTPUT'!$A$2,ROW('data'!C$2:C$1168)-ROW('data'!C$2)+1),ROWS('data'!C$2:'data'!C2))),"")}

此公式完美无缺,并生成所有行的实时更新列表,其中单元格" S"的值在工作表"数据"中,是" OUTPUT&#34 ;。

表"数据":

|Sample A|Result A|OUTPUT|
|Sample B|Result B|0     |
|Sample C|Result C|OUTPUT|

结果"摘要"片:

|Sample A|Result A|
|Sample C|Result C|

在表格中"数据"但是,现在还有一个数量列,我想尝试将其反映在"摘要"片。如下:

表"数据":

|Sample A|Result A|OUTPUT|  2  |
|Sample B|Result B|0     |  5  |
|Sample C|Result C|OUTPUT|  3  |

结果"摘要"片:

|Sample A|Result A|
|Sample A|Result A|
|Sample C|Result C|
|Sample C|Result C|
|Sample C|Result C|

有关如何导致此循环的任何建议或建议"一个阵列将非常感激。我通常会编写一个宏来处理数据,并在需要时循环输出,但我的目标是避免每次添加新数据时都运行宏。

谢谢你,问候

1 个答案:

答案 0 :(得分:0)

Excel公式很好,但在这种情况下,我倾向于将UDF与命名范围结合使用。

使用UDF返回所有所需输出字符串ONCE的数组,并将其放入命名范围。然后在您指定的范围内调用INDEX。

<强> UDF:

Public Function getResultArray( _
       sampleRange As Range, _
       isOutputRange As Range, _
       QuantityRange As Range, _
       str as string) As String()

  'error handling for inputs here
  Dim totalQuantity As Long
  totalQuantity = Application.WorksheetFunction.SumIf(isOutputRange, str, QuantityRange)

  Dim retArr() As String
  ReDim retArr(1 To totalQuantity)

  Dim ioArr As Variant, qArr As Variant, sampleArr As Variant
  ioArr = isOutputRange.Value
  qArr = QuantityRange.Value
  sampleArr = sampleRange.Value

  Dim i As Long, j As Long, counter as Long
  For i = LBound(ioArr) To UBound(ioArr)
        If ioArr(i, 1) = str Then
              For j = 1 To qArr(i, 1)
                    counter = counter + 1
                    retArr(counter) = sampleArr(i, 1)
              Next j
        End If
  Next i

  getResultArray = retArr
End Function

命名范围:

ResultArray = getResultArray(data!$A$2:$A$4, data!$C$2:$C$4, data!$D$2:$D$4, OUTPUT!$A$2)

您想要“摘要”的位置:

=INDEX(ResultArray, ROWS('data'!C$2:'data'!C2))

这减少了工作簿计算,因为数组只计算一次,而不是每个工作表公式(数组公式都很昂贵)