【问题标题】:For each cell in a range, if a value in a seperate range is found in the next cell do stuff对于范围内的每个单元格,如果在下一个单元格中找到单独范围内的值,则执行操作
【发布时间】:2013-04-10 13:47:15
【问题描述】:

我构建的这个宏可以工作,但我希望有一个更快的版本或一个能在更短的时间内完成同样工作的公式。

我有什么:

    For Each cell In Range("Table_Query_1[[#Data],[Reason2]]")
        For Each PossibleValue In Range("F2", Range("F2").End(xlDown))
            If Len(cell) = 0 Then
             If (InStr(UCase(cell.Offset(0, 1)), UCase(PossibleValue)) <> 0) Then
               cell.Value = PossibleValue.Value
             End If
             Else
                Exit For
             End If
         Next
         If Len(cell) = 0 Then
            cell.Value = cell.Offset(0, -1)
        End If
    Next

我可以使用以下数组公式获得任何东西的唯一其他方法

=IF(ISNA(MATCH($F$3:$F$10,[@Extra Info],0)),[@Reason],$F$3:$F$10)

但这不适用于第 4 行和第 9 行的部分匹配。我也怀疑这个数组公式会比 vba 宏快得多,而且它还需要更多维护在这种情况下使用测试值范围 (F2:f3),因为我必须不断更新该公式,否则我必须使原始范围像 F2:F100 女巫会导致它花费更长的时间。

所以,我想要的是,如果我的值范围内的任何值(在本例中为 F2:F3),是否在当前行的额外信息列中找到,然后是该行的原因 2(偏移(0 , -1)) 等于匹配的值。但是,如果没有找到任何内容,则只需使用该行中的原因 (Offset(0,1))。

第二个问题是,我需要宏在 QueryTable 刷新后运行,但如果我将其设置为单元格上的单元格更改事件,则查询中将发生更改,宏在最终查询表之前运行并完成被导入并排序。

【问题讨论】:

  • 我找到了一个部分匹配的公式,但我一直在检索 possible values 中的哪个数字在 Extra Info
  • 你能分享你的父亲匹配公式吗?也许它可以帮助引导我的方向?
  • 这会进入 Cell B2 是一个数组公式。 =IF(COUNT(FIND($F$2:$F$3,C1)),"What Will Go Here",A1)
  • 这是一个数组公式。而不是按回车。您必须按 control + shift + enter
  • @SiddharthRout 这样给我们留下=IF(AND($F$2&lt;&gt;0,COUNT(FIND($F$2,C2))),$F$2,IF(AND($F$3&lt;&gt;0,COUNT(FIND($F$3,C2))),$F$3,IF(AND($F$4&lt;&gt;0,COUNT(FIND($F$4,C2))),$F$4,A2))) 之类的东西现在会比我的宏更快吗? 注意:实际的 F 列将更像是 10-20 个值。

标签: vba excel excel-formula array-formulas


【解决方案1】:

解决了!

这是我在上面发布的带有初始公式的评论。

=IF(COUNT(FIND($F$2:$F$3,C1)),"What Will Go Here",A1)

下面会告诉你必须用什么来代替"What Will Go Here"

将此公式放在单元格 B2 中。请注意,这是一个数组公式。输入公式后,您必须按 CTRL + SHIFT + ENTER

=IF(COUNT(FIND($F$2:$F$4,C2)),INDEX($F$2:$F$4,MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0),0),A2)

截图

说明

FIND($F$2:$F$4,C2,1) 与数组一起使用时返回一个数组。要检查值,您可以突出显示它并按 F9,它会告诉您找到匹配项的位置。看这个截图

所以它告诉我们它在 4532 的第 3 个位置找到了匹配项。但它没有告诉我们它是通过什么找到匹配项的。

现在下一步是从数组中检索该数字的位置。因此,在上面的示例中,它将是位置 2,要找到该位置,我们将使用 MATCH(),而要使用 MATCH,我们将需要 3

所以要从数组中检索3,我们使用这个公式

=SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1)))

现在我们有了3,所以我们将在Match 中使用它来查找Possible Value 中的位置

=MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0)

这会给我们2

现在我们知道了Possible Value 中数字的位置。要找到该号码,我们将使用INDEX

=INDEX($F$2:$F$4,MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0),0)

示例工作簿

http://wikisend.com/download/280280/Sample.xlsx

【讨论】:

  • 我在所有匹配项上得到#N/A,在所有非匹配项上得到 0。复制粘贴您的确切公式并输入为数组(由公式中的 {} 验证)
  • 你真的认为使用它会比我原来帖子中的宏更快吗?它似乎要完成更多的工作。
  • 我刚刚测试了它,它可以工作。这是一个示例。 wikisend.com/download/280280/Sample.xlsx 我相信它应该比 VBA 更快,但我没有测试过。我还在上面的帖子中添加了解释,这样你就可以毫无问题地理解它。您可能需要刷新页面才能看到它。
  • 所以,我终于有时间玩这个了。唯一的问题是它 FIND 区分大小写。为了解决这个问题,我将FIND 替换为SEARCH
  • 这用于文本,数字仅用于示例数据。实际值为 Given Reason、Master Reason 和 Description of Reason。给定原因由下拉列表填充,描述是附加信息的文本框,我们希望有一个可能的描述的主列表,它将覆盖给定原因是主原因在描述中,但如果主描述值不存在于描述中使用的主要原因。基本上只是寻找数据整合的关键词。
【解决方案2】:

这是我遇到的一个解决方案,它不必输入数组,而且似乎比 Siddharth Rout 的解决方案运行得更快。我正在使用公式

=IFERROR(LOOKUP(1E+100,SEARCH($F$2:$F$4,C2),$F$2:$F$4),A2)

我在 C2 中查找 F2:F4 范围内的任何单词。如果没有找到它会抛出一个ERROR,在那种情况下我知道什么都没有找到,只是返回原来的原因。

图中未显示我还将 F2:F4 转换为名为 Reasons 的命名范围,并更改公式:

    =IFERROR(LOOKUP(1E+100,SEARCH(Reasons,C2),Reasons),A2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多