【问题标题】:Find value in column, based on 2 criteria根据 2 个条件在列中查找值
【发布时间】:2016-03-03 23:57:13
【问题描述】:

我有一个包含 3 列的文件。 A 列包含 300,000 行,大约有 200 个单独的 ID,所有这些都至少重复了 1,000 次。 B 列包含每一行的日期。 C 列包含我需要提取的值。

Col A 中的 200 个 ID 中的每一个都可以有多个值(例如,ID 1234 的日期可能是 2001 年 1 月 1 日、2001 年 1 月 3 日、2015 年 1 月 2 日等)。同样,Col B 上的每个日期都有多个 ID(例如 1/2/15 的 ID 可能为 1234、1874、1930、6043 等)。

简而言之,我需要检查 Col A 和 Col B 中的值,以找到 Col A 中的相关 ID 和 Col B 中的最大值,并返回 Col C 中相关单元格中的值。

我查看了索引/匹配示例,但它们似乎不合适。有没有关于我可以运行的宏的任何建议,这将完成所需要的。

【问题讨论】:

  • 请求 VBA 代码帮助的人预计表现出最初的努力。开始做某事,然后回来展示你自己的尝试。
  • 提示:看看下面的数组公式,然后看看Replace worksheet array formula with VBA memory array中的代码。
  • 感谢您的链接。信息量很大
  • 顺便说一句,这些数组公式只需要几秒钟就可以根据 AGGREGATE 处理 200 个单独的 ID,以便条件最大值从 300K 行中返回关联值。鉴于数据必须是相当静态的,VBA 真的有必要吗?
  • 在这种情况下,这是必要的,因为输入到行中的数据会根据从系统中提取的值而改变。最大的提取大约 900k,最小的大约 30 行。

标签: vba excel


【解决方案1】:

使用这个数组公式:

=INDEX($C$1:$C$300000,MATCH(1,IF(($A$1:$A$300000="1234")*($B$1:$B$300000=MAX(IF($A$1:$A$300000="1234",$B$1:$B$300000))),1,0),0))

作为数组公式,退出编辑模式时必须使用 Ctrl-Shift-Enter 确认,而不是 Enter。

"1234" 更改为具有适当 ID 的参考单元格。

【讨论】:

  • 妈的,比我快 4 秒 :-P
  • @Scott Craner - 谢谢你的公式。我如何将这个公式实现到 VBA 命令中,而不是在 Excel 单元格中实现该公式?
  • @Clauric SO 不是我网站的代码。如果您的代码无法正常工作,请将其放在您的原始帖子中,并询问有关问题所在的具体问题。
  • 感谢您的帮助。认为我用 MAX 公式对其进行了排序
【解决方案2】:

您可以使用数组公式完成此操作。首先,您可以使用以下公式在 A 列为 1234 时检索 B 列中的最大日期。请记住,当您完成输入数组公式时,您必须使用 Ctrl-Shift-Enter。

{=MAX(IF($A$2:$A$24=1234,$B$2:$B$24))}

请注意,您需要更改范围以包含您的所有数据,而不是我在第 2-24 行的测试数据。

现在您有了一个检索最大日期的公式,您可以将其放入索引/匹配项中,然后再次使用 Ctrl-Shift-Enter,使用下面的数组公式检索列 C 中的值以进行行匹配1234 和最大日期。

{=INDEX($C$2:$C$24,MATCH(1234&MAX(IF($A$2:$A$24=1234,$B$2:$B$24)),$A$2:$A$24&$B$2:$B$24,0))}

【讨论】:

  • 如果我们都做了类似的事情,那一定是正确的方法。 :)
  • @Nick Peranzi - 谢谢你的公式。我如何将这些公式实现到 VBA 命令中,而不是在 Excel 单元格中实现这些公式?
  • @Clauric 你能更具体一点吗?这可以在 VBA 中以多种方式实现,从将 C 列中 A 列中一个特定值的相关值返回的 UDF,到在大范围的单元格中输入数组公式,再到输入输出值(静态,非公式)在唯一 ID 列表中。
  • 感谢您的帮助。认为我用 MAX 公式对其进行了排序
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多