在B列中循环范围,并根据B列中的值设置E列中的索引匹配公式

时间:2017-05-22 02:04:43

标签: excel vba excel-vba loops

新手与VBA在这里。 我需要帮助设置一个VBA命令,该命令将遍历B列中的范围,并根据B列中的值在E列中设置索引匹配公式。

我尝试过编辑来自其他帖子的命令,但我似乎无法根据此链接找出它是如何工作的Excel VBA - Loop through range and set formula in each cell

我需要的索引匹配公式基本上将ID号与基于另一张表中的数据库的名称相匹配。我目前在工作表中使用固定的索引匹配函数,但这会搞砸过滤器/条目的排序。我已经使用了另一个宏来清除返回空白处的单元格内容 - 但是需要很长时间来浏览工作表。

如果B栏中的单元格介于1到450之间,则在E列的单元格中需要公式。

=IF($B49="","",INDEX(NAMES,MATCH($B49,ID,0)))

提前致谢。

1 个答案:

答案 0 :(得分:0)

这听起来像是一个简单的解决方案:

For Each cell In Range("B2:B2000")
If cell.Value <= 450 And cell.Value >= 0 Then
    i = cell.Row
    Range("E" & i).Formula = "=IF($B" & i & "="""","""",INDEX(NAMES,MATCH($B" & i & ",ID,0)))"
End If
Next

将在Col E中为其在Col B中找到的每个值设置1到450之间的公式。

对于长列表,这可能会有点慢。你可以关闭自动计算和工作表事件来加快速度:

' Deactivate - put this at the start of your code
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

' Reactivate - put this at the end of your code
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

在我的电脑上提供了以下速度提升(20次迭代后的平均速度):

Without deactivation: 1.043359375 s per iteration
With deactivation: 0.270703125 s per iteration

或者,如果来自索引函数的错误是抛出过滤器并进行排序,则可以尝试将该函数包装在IFERROR()函数中并完全绕过VBA。

=IFERROR(IF($B49="","",INDEX(NAMES,MATCH($B49,ID,0))),"")