2017-05-04 60 views
1

我目前有一个工作表,其中数据正在输入到特定列中。然后在汇总表中,我使用带索引的数组公式来生成匹配特定字段的原始图纸上的所有数据的列表。使用INDEX的Excel数组公式使用INDEX并取决于变量

汇总表上的每一列都有一个数组公式,并链接回数据表上的等效列。 A-> A,B-> B,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”的值是“输出”。

表“数据”:

|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| 

任何建议或关于如何导致此“环”的建议以与阵列将非常感谢。我通常会编写一个宏来处理数据,并在需要时使用循环输出的函数,但是我的目标是避免每次添加新数据时都必须运行宏。

谢谢你,至于

+0

我不认为在这种情况下可以避免使用宏,因为汇总列表工作表必须根据每张工作表上的输出动态调整长度。此外,下一张表格的“摘要”必须在先前表格的摘要结束时开始。因此,下一张表的摘要的开始将与长度一样动态,并且其结束(对于每张下一张都是如此)。所以,我看不到任何可能的方法来使这一点与公式有关。 – Ralph

回答

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

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