2

我已经构建了这个宏,但我希望有一个更快的版本或一个能在更短的时间内做同样事情的公式。

是)我有的:

    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 )) 等于匹配的值。但如果没有找到,那么只需使用该行中的原因(偏移量(0,1))。

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

4

2 回答 2

0

解决了!

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

=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所以我们将使用它MatchPossible 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

于 2013-04-17T19:22:06.290 回答
0

这是我遇到的一个解决方案,它不必输入数组,并且似乎比 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)

在此处输入图像描述

于 2013-04-26T14:16:32.873 回答