【问题标题】:VBA complex vlookupVBA复杂的vlookup
【发布时间】:2013-04-26 21:39:16
【问题描述】:

好的,我看到了许多与我相似的问题,但没有一个是完全准确的所以答案没有帮助。虽然它可能不完全是一个 vlookup,但过程与一个类似,所以这是我能想到的最接近标题的东西。

我在文档 A 中有一列 (A) 值,我希望 excel 遍历每个值并查看文档 B 以在列 (A) 中找到相同的值。对于它找到的每个值,我想做三件事:

  1. 我希望它抓取文档 B 中找到的每个匹配值右侧两个单元格的值,并将其粘贴到文档 A 的 A 列中值右侧的一个单元格

  2. 我希望它查看文档 B 中找到的每个匹配值右侧的值 3,如果该值是“时间”,则将字母“T”放在列中值右侧的两个单元格文件A的A。

  3. 如果文档 B 中找到的每个匹配值右侧的四个单元格的值 > 5 我希望 excel 使用公式填充文档 A 的列 A 中值右侧的三个单元格 =文档 B 中同一行的(列 G / 列 H)的值。

如果我的措辞令人困惑,我基本上想做一个更复杂的 vlookup。文档 A 只有 A 列,我想查看 A 列以使用文档 B 中的表格填写 B、C 和 D 列

如果您有任何问题,请告诉我,并提前感谢您能给我的任何帮助。

【问题讨论】:

  • 你看到THIS了吗?

标签: excel vlookup vba


【解决方案1】:

您想做的每件事都以简单的“VLOOKUP”开始,但有些事情会有所不同。为简化起见,我们应该将范围命名为“A”和“B”。为此,您可以选择属于“A”的所有单元格,然后在地址框中(屏幕左上角)输入名称。我们称它为“RangeA”。同样,选择属于区域 B 的所有单元格(第一列到第八列;确保不包括标题),并将其命名为 RangeB。现在我们可以开始了:

"对于A中的每个值,在B中找到对应的值,并返回 值右二”:

这是一个简单的 VLOOKUP。在 A(可能是 B1)右侧的单元格中输入此公式:

=VLOOKUP(A1, RangeB, 3, FALSE)

解释:在名为 RangeB 的范围内查找单元格 A1 中的值。找到完全匹配(即“FALSE”)。返回第 3 列(右侧两个)中的相应值。将公式一直往下拖(快捷方式:选中单元格后双击右下角的小方块)。

我希望它查看每个匹配项右侧的值 3 在文档 B 中找到的值,如果该值是“时间”,则输入字母 "T" 文档 A 列 A 中值右侧的两个单元格。

这是一个 VLOOKUP,后跟一个 IF。把下面的公式放在A右边两个单元格(可能是C1),像以前一样往下拉:

=IF(VLOOKUP(A1, RangeB, 4, FALSE) = "time", "T", "")

解释:像以前一样向上看(但第 4 列,即“向右三”)。测试找到的值。如果是“时间”,则在此单元格中输入“T”;否则,输入“”(即什么都没有)。

如果在每个匹配值右侧的四个单元格中找到值 文档 B > 5 我希望 excel 将单元格三个单元格填充到 文档 A 的 A 列中值的右侧,公式 = 文档 B 中同一行的(列 G / 列 H)的值。

找到匹配项,取比值。使用 MATCH 函数(在工作表上的隐藏列中)只进行一次查找会更快,因此我们有对行号的引用(我们需要它三次),但这不是必需的。除非您的工作表有数千行,否则您不会注意到性能差异。根据this thread 的说法,在公式中没有“快速方法”来实现这一点。

=if(VLOOKUP(A1, RangeB, 5, FALSE) > 5, VLOOKUP(A1, RangeB, 7, FALSE)/VLOOKUP(A1, RangeB, 8, FALSE), "")

你有它。注意INDEX(MATCH...(@user2140261 的首选方法)可以实现与VLOOKUP 相同的功能,但涉及两个功能。但是,如果您决定创建一个包含 MATCH 函数的隐藏列,那么您可以使用 INDEX 函数来实现所有其他事情 - 这将是最有效的,因为您只使用一个 MATCH(而不是为每一列重新计算一次或多次)。

希望你能从这里弄清楚。

【讨论】:

  • 哇,这是一种更好/更全面的方式@Floris,谢谢你,一旦我得到足够好的代表来投票,我会为你这样做
  • @SeanConnecticut 我使用索引的原因是因为我觉得可读性可以知道我从哪个列返回值,而不是查找女巫可以采用任何范围和数量第一列中的一列,这可能会让人感到困惑,我喜欢索引的第一部分告诉我工作表上的哪一列,而不仅仅是范围,我正在返回。就是这样。
  • @user2140261 - 您对使用 INDEX 的解释非常容易理解。我认为使用 MATCH 函数创建一个隐藏列(它只进行一次查找并返回工作表 B 中的行号,然后将行号用于每列中的 INDEX 公式)是一个更清洁的解决方案 - 但它似乎超出问题提出的范围。
  • @Floris +1 这是我在实践中经常做的事情
【解决方案2】:

首先,我的英语不好。对不起。但我会尽力提供帮助。

一个文档包含以下信息。

名称
萨基尔
哈桑
希拉尔

B文件中有以下信息。
姓名 索引 年龄 性别 Column5 Column6 Column7 Column8
萨基尔 8 33 男 1 1 10 2
希拉尔 6 20 女 1 1 8 4
努雷 4 22 女 1 1 4 1

一个文档可以在B2列写如下公式。

=IF(VLOOKUP(A2;[DocB.xlsx]Sheet1!$A$2:$H$4;2;FALSE)>5;VLOOKUP(A2;[DocB.xlsx]Sheet1!$A$2:$H$4;7;FALSE)/VLOOKUP(A2;[DocB.xlsx]Sheet1!$A$2:$H$4;8;FALSE);"No Match")

尊重。

【讨论】:

    【解决方案3】:
    =INDEX(B!$C$1:$C$15,MATCH(A!A1,B!$A$1:$A$15,0))
    

    进入工作表AB1 或任何one cell to the right of the value 并向下拖动

    =IF(INDEX(B!$D$1:$D$15,MATCH(A!A1,B!$A$1:$A$15,0))="time","T",INDEX(B!$D$1:$D$15,MATCH(A!A1,B!$A$1:$A$15,0)))
    

    进入工作表AC1 或任何two cells to the right of the value 并向下拖动。

    *注意:* 如果matched value found in document BNOT“时间”,你没有指定你想要的这个值,所以我只使用单元格中的值.

    =IF(INDEX(B!$E$1:$E$15,MATCH(A!A1,B!$A$1:$A$15,0))>5,INDEX(B!$G$1:$G$15,MATCH(A!A1,B!$A$1:$A$15,0))/INDEX(B!$H$1:$H$15,MATCH(A!A1,B!$A$1:$A$15,0)),INDEX(B!$E$1:$E$15,MATCH(A!A1,B!$A$1:$A$15,0)))
    

    进入工作表AD1 或任何three cells to the right of the value 并向下拖动

    *注意:*如果matched value found in document B is NOT > 5,你没有指定你想要的值,所以我只使用单元格中的值。

    如果您要查找的值位于工作表 A 中的 Column A 中,并且您返回的是 sheet B 的列 C:E 中的值

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2019-04-18
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多