对于一个范围内的每个单元格,如果在下一个单元格中find一个单独范围内的值,则执行该操作
这个macros我已经build立了工作,但我希望有一个更快的版本或公式,将在较短的时间内做相同的。
我拥有的:
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行的情况。我也怀疑这个数组公式会比vbamacros要快得多,同时还需要更多维护testing值的范围(F2:F3)在这种情况下,我将不得不不断更新该公式,否则我必须使原来的范围,如F2:F100女巫会导致花费更长的时间。
所以,我想要的是,如果在我的值范围内的任何值(在这种情况下是F2:F3),在当前行的额外信息列内find,那么该行的原因2(Offset(0,-1 ))等于匹配的值。 但是,如果没有发现,那么只需使用该行中的原因(偏移(0,1))。
第二个问题是,我需要运行的macrosQueryTable刷新后,但如果我将它设置为一个单元格中的单元格更改事件在查询中将更改,macros运行并完成导入最终querytable之前sorting。
解决了!
这是张贴的评论,我上面有最初的公式。
=IF(COUNT(FIND($F$2:$F$3,C1)),"What Will Go Here",A1)
下面告诉你什么去取代"What Will Go Here"
把这个公式放在B2单元格中。 请注意,这是一个数组公式。 input公式后,必须按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 ,它会告诉您find匹配的位置。 看这个截图
所以它告诉我们它在4532的第三个位置find了匹配。它没有告诉我们匹配的是什么。
现在下一步是从数组中检索该数字的位置。 所以在上面的例子中它将是位置2,并find我们将使用MATCH()
并使用MATCH我们将需要3
所以要从数组中检索3
,我们使用这个公式
=SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1)))
现在我们有了这3
所以我们将在Match
使用它来findPossible 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
。 要find这个数字,我们将使用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)
SAMPLE工作簿
这是我遇到的解决scheme,不必input数组,似乎运行得更快,然后Siddharth Rout的解决scheme。 我正在使用公式
=IFERROR(LOOKUP(1E+100,SEARCH($F$2:$F$4,C2),$F$2:$F$4),A2)
我在哪里寻找在C2范围F2:F4的任何单词。 如果没有发现它会抛出一个ERROR
,在这种情况下,我知道什么都没有find,只是返回原来的原因。
没有在图片中显示,我也将F2:F4转换成一个名为Reasons
的命名范围,并更改公式:
=IFERROR(LOOKUP(1E+100,SEARCH(Reasons,C2),Reasons),A2)