如何加速遍历C-L列的暴力法VBA宏?
VBA宏加速优化:替换低效的重复单元格遍历
原宏finalfinal3通过逐单元格选择的方式重复遍历C到L列,根据同行B列的"OnOrder"/"OnHand"值设置字体颜色,这种暴力实现不仅代码冗余,运行效率也极低。以下是优化后的实现方案:
核心优化点
- 移除单元格选择操作:直接通过Range对象操作单元格,避免激活/选择带来的性能损耗
- 合并重复逻辑:用循环遍历C-L列(对应列号3到12),替代重复10次的冗余代码块
- 动态确定数据范围:不再固定遍历到第500行,而是根据实际数据行范围处理,减少不必要的操作
- 保留应用级性能优化:延续原有的
ScreenUpdating和DisplayAlerts关闭逻辑,避免界面刷新干扰
优化后的代码
Sub OptimizedFormatting() Dim ws As Worksheet Dim targetCol As Integer Dim startRow As Integer Dim lastRow As Long Dim currentCell As Range ' 关闭界面刷新和提示,提升运行速度 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 直接指定目标工作表,避免依赖Activate操作 Set ws = ThisWorkbook.Sheets("FBM") ' 遍历C列到L列(对应列索引3到12) For targetCol = 3 To 12 ' 确定起始行:如果当前列第3行是"Grand Total",则从第5行开始,否则从第4行开始 If ws.Cells(3, targetCol).Value = "Grand Total" Then startRow = 5 Else startRow = 4 End If ' 获取当前列的最后一行数据,避免遍历空行 lastRow = ws.Cells(ws.Rows.Count, targetCol).End(xlUp).Row ' 遍历当前列的目标行范围 For Each currentCell In ws.Range(ws.Cells(startRow, targetCol), ws.Cells(lastRow, targetCol)) ' 清除原有格式 currentCell.ClearFormats ' 根据同行B列的值设置字体颜色 Select Case ws.Cells(currentCell.Row, 2).Value Case "OnOrder" currentCell.Font.Color = RGB(255, 255, 255) Case "OnHand" currentCell.Font.Color = RGB(0, 0, 0) Case Else currentCell.Font.Color = RGB(217, 217, 217) End Select Next currentCell Next targetCol ' 恢复界面默认设置 Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
额外说明
- 原代码中所有列的格式判断都依赖同行B列的值,优化后直接引用B列单元格,逻辑更清晰
- 通过
lastRow动态获取数据最后一行,避免遍历大量空行,进一步提升效率 - 全程未使用
Select/Activate操作,这是VBA提升运行速度的关键技巧之一
内容的提问来源于stack exchange,提问作者doug mackie
相关产品推荐
相关产品推荐

