新手与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)))
提前致谢。
答案 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))),"")