在Excel中,我需要找到两个数组之间的数据匹配 - 一个水平和一个垂直


0

在Excel 2010(或2007年 - 我有两个,虽然我的操作系统只有Win7 32位作为我们运行的一些遗留应用程序的限制),我需要找到如何从两个数据数组中找到并返回匹配值。

我有两个电子表格。一个是来自层级OLAP多维数据集维度的巨型平面文件(来自SAP BPC的37,000行)。另一个是我需要匹配的值表。我需要将第二个电子表格中的匹配值返回到第一个Sheet中的ColumnA - flatfile。

挑战在于,由于它是一个层级结构,我不能从Sheet1中选择一个匹配的列 - 匹配可以在每行的任何列中。所以,基本上,我正在考虑需要采取Sheet 1单行作为数组和Sheet 2列作为数组匹配的任何内容(我认为)。

在英语中,我希望Excel:对于Sheet1的每一行都有数据,查看整行中的所有内容(例如,范围B2:R2 - 我将Col A留作公式/匹配值的空白)。如果任何内容与报告类别列表中的任何内容匹配(即表2列A,范围A1:A42),则将Sheet2值返回到Sheet1!A2(我为匹配所做的空白列)。

这是一个带有食物寓言的数据样本。请注意,我已经创建了一个空白的ColumnA,并且每行中的数据向上进行了一个分类层次,其中ColB是基本级别,如果需要,它会重复,以便终端父级在ColF中:

在此输入图像描述

现在,在下一个图像中是我想要使用的报告格式。请参阅,有时我们需要来自某些层级,有时来自其他层级的数据。

在此输入图像描述

最后,我的电子表格将填充我想要的自定义报告类别(然后我可以针对聚合数据调整这些类别)。在此输入图像描述

我一直在通过怪物vlookup公式实现这一点,但是想知道是否还有另一个,更容易或者至少资源密集程度更低的方式,因为37,000行与vlookup语句嵌套8深度使Excel喜欢崩溃很多。因此,使用我的真实报告类别(sheet2称为All_Budget_Units),这是我目前使用的:

= IFERROR(VLOOKUP(IFERROR(VLOOKUP(IFERROR(VLOOKUP(IFERROR(VLOOKUP(IFERROR(VLOOKUP(IFERROR(VLOOKUP(C2,All_Budget_Units $ A $ 1:!$ A $ 39,1,FALSE),D2),All_Budget_Units $ A $ 1 :$ A $ 39,1,FALSE),E2),All_Budget_Units $ A $ 1:$ A $ 39,1,FALSE),F2),All_Budget_Units $ A $ 1:$ A $ 39,1,FALSE),G2),All_Budget_Units !$ A $ 1:$ A $ 39,1,FALSE),H2),All_Budget_Units $ A $ 1:$ A $ 39,1,FALSE),I2)

Answers:


0

YMMV,但查看 - >宏,添加一个宏。试试这个(根据需要更改单元格引用):

Dim data, reference As Range

Set reference = Worksheets("Sheet2").Range("A1", "A42")
Set data = Worksheets("Sheet1").Range("B2", "F6")

For Each dataCell In data
    For Each referenceCell In reference
        If dataCell.Value = referenceCell.Value Then
                Worksheets("Sheet1").Cells(dataCell.Row, 1).Value = dataCell.Value
        End If
    Next
Next

[编辑:如果这样可行,您可以通过在找到匹配项时停止搜索来加快速度。(假设每行只有一个可能的匹配)。例如:

Sub newtest()
    Dim data, reference As Range
    Dim skipsome As Boolean
    skipsome = False

    Set reference = Worksheets("Sheet2").Range("A1", "A7")

    Set data = Worksheets("Sheet1").Range("B2", "F6")
    For Each dataCell In data
        For Each referenceCell In reference
            If dataCell.Value = referenceCell.Value Then
                    Worksheets("Sheet1").Cells(dataCell.Row, 1).Value = dataCell.Value
                    skipsome = True
                    Exit For
            End If

            If skipsome = True Then
                skipsome = False
                Exit For
            End If
        Next
    Next
End Sub

就你的5行测试数据而言,这将细胞比较测试从175降低到132.] [编辑2:使代码工作]


是的,因为它是分层的,每行只有一个可能的匹配; 否则,我们将通过报告层次结构的多个级别来复制数据。谢谢宏 - 我会试一试!
ppfooie 2013年

2

你不需要宏观解决方案; 你可以使用数组公式。

{=INDEX(All_Budget_Units!$A$1:$A$39, MAX(IFERROR(MATCH(C2:I2, All_Budget_Units!$A$1:$A$39, 0), 0)))}

这假设I2中的值也在主列表中,原始公式不假设。如果不是,或者可能不存在,请改用:

{=IFERROR(INDEX(All_Budget_Units!$A$1:$A$39, MAX(IFERROR(MATCH(C2:H2, All_Budget_Units!$A$1:$A$39, 0), -1))), I2)}

如果您之前没有使用过数组公式,则不要自己键入大括号{}:放入公式的其余部分,然后按CTRL + SHIFT + ENTER将其作为数组公式输入。如果您已正确完成,则大括号将显示在公式框中。

这种方式的工作方式是我们使用该MATCH函数来创建匹配结果数组。除了其中一个之外的所有部分都是#N/A这样的,我们将它包装起来IFERROR将它们转换为0(或在第二个版本中转换为-1)。任何实际匹配都是正数,因此获取MAX数组会找到单个匹配项。然后我们使用该INDEX函数将其转换为值。在第二个版本中,如果根本没有匹配,我们将尝试使用INDEX-1的位置,这将产生错误,因此我们使用IFERROR返回默认值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.