【问题标题】:How to compare two columns in Excel (from different sheets) and copy values from a corresponding column if the first two columns match?如果前两列匹配,如何比较 Excel 中的两列(来自不同的工作表)并从相应列复制值?
【发布时间】:2012-04-28 22:54:56
【问题描述】:

我正在尝试将工作表 1 中的 a 列与工作表 2 中的 a 列进行比较,然后将工作表 1 中的 b 列中的相应值复制到工作表 2 中的 b 列(其中 a 列的值匹配)。我一直在尝试阅读如何做到这一点,但我不确定我是否应该尝试创建一个宏,或者是否有更简单的方法来做到这一点,也许是 VLOOKUP 或 MATCH?不过,我真的不熟悉这些功能的工作原理。

另外,如果有区别,Sheet 2 的 b 列中会有重复值。

表 1

12AT8001    1
12AT8002    2
12AT8003    3
12AT8004    4
12AT8005    5
12AT8006    6

表 2

12AT8001
12AT8001
12AT8001
12AT8001
12AT8001
12AT8002
12AT8002
12AT8002
12AT8002
12AT8002
12AT8003
12AT8003
12AT8003
12AT8003
12AT8003

【问题讨论】:

    标签: excel excel-formula


    【解决方案1】:

    Vlookup 很好,如果参考值(A 列,第 1 页)按升序排列。另一个选项是索引和匹配,无论顺序如何都可以使用(只要 a 列中的值,表 1 中的值是唯一的)

    这就是您将在工作表 2 的 B 列中输入的内容

    =INDEX(Sheet1!A$1:B$6,MATCH(A1,Sheet1!A$1:A$6),2)
    

    Sheet1!A$1:B$6Sheet1!A$1:A$6 设置为命名范围使其更加用户友好。

    【讨论】:

    • 当我在数据子集上使用该公式(我在问题中用作示例)时,它起作用了。但是,当我对完整的数据集(sheet1 为 600 行,sheet2 为 2994 行)进行尝试时,它给了我 #N/A 错误。我将公式更新为:=INDEX(Sheet1!A$1:B$600,MATCH(A1,Sheet1!A$1:A$600),2)。
    • 然后我尝试使用 sheet1 上的全部 600 行,但将其保留为我在示例中使用的 sheet2 的相同测试子集。使用相同的 =INDEX(Sheet1!A$1:B$600,MATCH(A1,Sheet1!A$1:A$600),2) 公式,它为所有行返回看似任意的 276 数。
    • 也许它不起作用,因为 sheet2 的完整数据集中的 id 与 sheet1 的顺序不同(就像他们在示例中一样)?所有这些 id 都混在了全套中。 . .这就是为什么我需要比手动匹配更快的东西。顺便说一下,sheet1 的 A 列中的所有值都是唯一的。关于为什么它不能在全套上运行的任何想法,或者有其他尝试的想法?
    • 如果工作表 1 上的值按数字顺序排列,VLOOKUP 应该可以工作
    • 我刚刚尝试了 VLOOKUP,即使 sheet1 上的 id 不是按数字顺序排列的并且它有效!这是公式: =VLOOKUP(A1,Sheet1!A$1:B$600,2,FALSE) 感谢 MechEng 和 deusxmach1na 的建议,他们让我以不同的方式思考问题,最终导致了我的发现。我真的很感激!
    【解决方案2】:

    正如 kmcamara 所发现的,这正是 VLOOKUP 旨在解决的问题,而使用 vlookup 可以说是完成工作的最简单的替代方法。

    除了lookup_value、要搜索的table_range和返回值的column_index这三个参数之外,VLOOKUP还采用了可选的第四个参数,Excel文档称之为“range_lookup”。

    扩展deathApril的解释,如果此参数设置为TRUE(或1)或省略,表格范围必须按范围第一列中的值的升序排序,以便函数返回通常是理解为“正确”的值。在此默认行为下,该函数将根据精确匹配返回一个值(如果找到),或者如果未找到精确匹配则返回近似匹配。

    如果匹配是近似的,则函数返回的值将基于小于 lookup_value 的下一个最大值。例如,如果工作表 1 中的表中缺少“12AT8003”,则工作表 2 中该值的查找公式将返回“2”,因为“12AT8002”是表范围的查找列中小于的最大值比“12AT8003”。 (例如,如果目标是在税表中查找税率,则 VLOOKUP 的默认行为非常有意义。)

    但是,如果第四个参数设置为 FALSE(或 0),则 VLOOKUP 仅在完全匹配时返回查找值,如果不匹配则返回错误值 #N/A。现在通常的做法是在 IFERROR 函数中包装一个精确的 VLOOKUP 以便优雅地捕获不匹配。在引入 IFERROR 之前,使用 VLOOKUP 公式使用 IF 函数检查没有匹配项,一次检查是否存在匹配项,一次返回实际匹配值。

    虽然最初较难掌握,但 deusxmach1na 提出的解决方案是一组强大的 VLOOKUP 替代方案的变体,可用于将列或列表的值返回到查找列的左侧,扩展以处理需要对多个条件进行精确匹配的情况,或进行修改以在多个条件中合并 OR 和 AND 匹配条件。

    重复 kcamara 选择的解决方案,该问题的 VLOOKUP 公式为:

       =VLOOKUP(A1,Sheet1!A$1:B$600,2,FALSE)
    

    【讨论】:

      【解决方案3】:

      制作一个真值表并使用 SUMPRODUCT 获取值。将其复制到 Sheet2 上的单元格 B1 中并根据需要向下复制:
      =SUMPRODUCT(--($A1 = Sheet1!$A:$A), Sheet1!$B:$B)
      创建真值表的部分是:
      --($A1 = Sheet1!$A:$A)
      这将返回一个由 0 和 1 组成的数组。值匹配时为 1,不匹配时为 0。然后之后的逗号基本上会执行我所说的“有趣”矩阵乘法并返回结果。不过我可能误解了你的问题,Sheet1 的 A 列中是否有重复值?

      【讨论】:

      • 我没有遵循您的解决方案 :( 但在 Sheet1 的 A 列中没有重复项。
      • 尝试将我给您的第一个公式复制并粘贴到 Sheet2 上的单元格 B1 中,然后根据需要填写。假设您的工作表是按照您在帖子中提到的方式设置的,它应该给出正确的值。每当工作表 1 的 A 列与工作表 2 的 A 列中的值匹配时,它基本上乘以 1 * 工作表 1 的 B 列中的值。
      【解决方案4】:

      试试:

      sheet 2 a1 =vlookup(sheet2a1,sheet1$a$1:$b$6,2)
      

      然后向下拖动。

      它应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多