Excel VLOOKUP或索引匹配

Excel VLOOKUP或索引匹配,excel,excel-formula,Excel,Excel Formula,假设我有3列数据 AMOUNT(A) AMOUNT(B) INVOICE(C) 55 49 4541 47 47 1515 42 47 4478 86 12 9993 12 100 1224 5 44 1452 100

假设我有3列数据

AMOUNT(A)  AMOUNT(B)     INVOICE(C)
55          49           4541
47          47           1515
42          47           4478
86          12           9993
12          100          1224
5           44           1452
            100          4287
            99           4444
我需要检查的是A列中的值是否与B列中的值匹配。如果匹配,它将返回D列中C列的值。现在使用VLOOKUP很容易,但是我要处理700多行,并且有多个匹配的金额。索引(匹配)可以工作,但它只返回一个值。这是VB唯一的问题吗


也就是说,值47在B列中存在两次,因此D列将返回两个发票号(1515-4478)

在VBA中,问题将是微不足道的,因为您已经用问题陈述本身正确地描述了逻辑

仅使用Excel功能而不使用VBA是一个有趣的问题。您需要执行以下步骤以实现如下输出

步骤如下:

  • 透视表:从列
    (B)
    (C)
    创建透视表,行字段为
    (B)
    (C)
    ,最小值为
    金额(B)
    。(见下图)
  • Helper列:在透视表的一侧创建一列,比如说
    (Q)
    ,它与列
    (P)
    中的所有内容都相等
  • 续…:
    (R)
    (不幸的是,该列恰好位于工作表的Q列中,很抱歉出现混淆),如图所示,对于单元格
    Q20
    ,例如,输入公式

    =IF(P21=P20,Q21&“,”&M20,M20)

  • 这将导致创建类似下表的内容:

  • 表:

    (P) (Q)
    
    12  9993
    44  1452
    47  4478,1515
    47  4478
    49  4541
    99  4444
    100 4287,1224
    100 4287
    
    现在艰苦的工作完成了。您所需要做的就是使用
    VLOOKUP
    键-值对从此帮助表
    (P)(Q)
    -这将非常快,因为透视表始终保持排序,因此不需要精确的
    查找。
    -下面显示了Pivot表以及最终的
    VLOOKUP
    公式的屏幕截图

    透视表和辅助表:

    最终公式:


    所以我使用Countif来查看是否有基于列A的DUP。 在D列类型中,
    =IF(COUNTIF($A$2:$A$9,B2)>0,C2,“”)


    根据我的经验,是的,这需要VBA代码。Index和Vlookup都只返回它们遇到的第一个结果。您喜欢公式还是VBA??如果你的第一选择是只使用公式,我真的不认为它会起作用。您可以接近Excel数组公式,但我不知道有任何非VBA方法可以解决无法连接范围/数组以及缺少分隔符的问题。数组方法将使用一个小的UDF进行连接。或者你可以为整件事编写一个UDF。是的,数组公式可以,但不能像@MarkBalhoff所指出的那样单独返回D列上的单个单元格。@Treevar,看看下面的非基于VBA的解决方案。我不反对使用VBA,但我想要一个没有VBA经验的人可以编辑的解决方案。HNK您的解决方案很棒!我一定错过了什么。根据我对OP问题的理解,他想要一个列,逻辑上在a列旁边,是该金额的所有发票的列表。您似乎假设A)A列与B/C列是同一表格的一部分,B)OP希望看到当前平面表格格式中具有匹配金额的所有发票。这两种假设都不符合我对这个问题的理解。如果A列中只包含一次发票号,您的问题将如何“返回两个发票号?”@MarkBalhoff,上述方法应在没有任何基于VBA的宏/公式的情况下工作。看一看,好多了。一个可靠的非VBA答案。R中的公式和文本的行为类似于P列中的数据,但图像显示为空。在那里稍微调整一下后,它在我这边起作用了。就我个人而言,我避免使用透视表作为中间处理工具,但如果首选公式,则任何其他选项都会更加混乱。如果OP的数据没有停滞,则OP可能必须确保数据透视表刷新和/或扩展数据源范围。哦,还有一个奇怪的机会,OP关心第一个表上的任何发票排序顺序,这可能会有问题。是的,我会发现VBA是一个更好的选择。同样是的,截图是在我转移一些专栏之前拍摄的,但我希望它很清楚。最后,我同意-pivot表是用来透视数据的,而不是进行花哨的排序,但在这种情况下,如果出于安全原因(仅允许.xlsx等),如果某人只需要使用非VBA解决方案,这是整洁的、易于维护的,等等。Regd.排序顺序,可以通过pivot表按排序列(C)进行处理不同的是,可以实现一些排序层次结构。在这种情况下,数据不是动态的。VBA将是一个更好的选择,我同意,但我想尝试将其作为非VBA解决方案,以便新手用户可以在将来需要时使用类似的系统。谢谢hnk!