首页 文章

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

提问于
浏览
0

这里有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

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

    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))),"")
    

相关问题