【发布时间】: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<>0,COUNT(FIND($F$2,C2))),$F$2,IF(AND($F$3<>0,COUNT(FIND($F$3,C2))),$F$3,IF(AND($F$4<>0,COUNT(FIND($F$4,C2))),$F$4,A2)))之类的东西现在会比我的宏更快吗? 注意:实际的F列将更像是 10-20 个值。
标签: vba excel excel-formula array-formulas