vlookup对应于两个非相邻字段的两个差异数据

时间:2016-02-17 04:57:31

标签: excel vba

我想在“不”中做一个VLOOKUP 获取值“201”,其中“购买”表中的“否”和“框”匹配

截图 enter image description here

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

可以有另一个选项比VLOOKUP更好,这也没关系。谢谢!

2 个答案:

答案 0 :(得分:0)

使用此数组公式。此公式将过滤您将放入I1单元格的所有数据。

=IFERROR(INDEX($A$1:$E$25,SMALL(IF($A$1:$A$25=$I$1,ROW($A$1:$A$25)),ROWS($A$1:$A1)),COLUMNS($A$1:A$1)),"")

由于它是一个数组公式,按 CTRL + SHIFT + ENTER 来评估公式。

示例屏幕截图: Sample Screenshot

将公式放入G4单元格后(如我的截图所示),根据需要向右下方拖动和填充。

答案 1 :(得分:0)

数组公式²和由AGGREGATE¹ function等函数产生的循环处理会产生计算滞后。它们引用的范围应保持最小行数。在频繁添加和删除的数据上维护最小数量的相关行是非常耗时的。

以下公式看起来要复杂得多,但它会动态跟踪INDEX function数组中的确切行数。为了简化公式,我允许一个额外的行;是包含列标题标签的第1行。

在I10中作为标准公式,

=INDEX(B:B, AGGREGATE(15, 6, ROW($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A )))/($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A ))=$H10), ROW(1:1)))

向右和向下填充。

用于字符串连接。我从one of my previous answers中将此VBA用户定义函数³(又名UDF)提取到了类似的问题。

Public Function conditional_concat_strs(rSTRs As Range, rCRITs As Range, rCRIT As Range, Optional sDELIM As String = ", ")
    Dim c As Long, sTMP As String

    Set rSTRs = Intersect(rSTRs, rSTRs.Parent.UsedRange)
    Set rCRITs = Intersect(rCRITs, rCRITs.Parent.UsedRange)

    Set rSTRs = rSTRs.Cells(1, 1).Resize(rCRITs.Rows.Count, rCRITs.Columns.Count)
    For c = 1 To rCRITs.Cells.Count
        If rCRITs(c).Value2 = rCRIT Then _
            sTMP = sTMP & rSTRs(c).Value & sDELIM
    Next c
    conditional_concat_strs = Left(sTMP, Application.Max(Len(sTMP) - Len(sDELIM), 0))
End Function

在I2中,

=conditional_concat_strs(E:E,A:A, I1)

完整列引用在Worksheet.UsedRange property的范围内被截断。使用它们没有计算损失。

conditonal_concat

¹数组公式需要用 Ctrl + Shift + Enter↵完成。一旦正确进入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。尝试并减少对更接近表示实际数据范围的范围的全列引用。数组公式以对数方式计算计算周期,因此将参考范围缩小到最小值是一种好习惯。有关详细信息,请参阅Guidelines and examples of array formulas

² {2010}引入了AGGREGATE function。它在早期版本中不可用。

³用户定义函数(又名UDF)被放入标准模块代码表中。点击 Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块 Alt + 中号)。将功能代码粘贴到标题为 Book1 - Module1(Code)的新模块代码表中。点击 Alt + Q 返回工作表。