对于范围中的每个单元格,如果在下一个单元格中找到单独范围中的值,则执行填充

时间:2013-04-17 17:13:40

标签: excel vba excel-vba excel-formula array-formulas

这个宏我已经建立了作品,但我希望更快的版本或公式将在更短的时间内做同样的事情。

我有什么:

    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女巫会使它花费更长的时间。

Sample

所以,我想要的是,如果我的值范围中的任何值(在这种情况下为F2:F3),则在当前行的Extra Info列中找到,然后在该行的Reason2中找到(Offset(0) ,-1))等于匹配的值。但是如果没有找到任何内容,那么只需使用该行中的Reason(Offset(0,1))。

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

2 个答案:

答案 0 :(得分: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)

<强>截图

enter image description here

<强>解释

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

enter image description here

所以它告诉我们它在4532的第3个位置找到了比赛。它还没有告诉我们它找到了什么匹配。

现在,下一步是从数组中检索该数字的位置。所以在上面的示例中,它将是位置2​​并且为了找到我们将使用MATCH()的位置并使用MATCH,我们将需要3

因此,要从数组中检索3,我们使用此公式

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

enter image description here

现在我们有了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

enter image description here

现在我们知道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)

enter image description here

SAMPLE Workbook

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

答案 1 :(得分: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)

enter image description here