首页 > 解决方案 > VBA - 避免循环

问题描述

我在 Excel 工作表中分别在 A、B 和 C 列中有以下数据。

+-----------+--------------+----------------+
| RangeName |    Clear?    | Value if Clear |
+-----------+--------------+----------------+
| Name1     | DO NOT CLEAR |                |
| Name2     |              |              6 |
| Name3     |              |              7 |
| Name4     | DO NOT CLEAR |                |
| Name5     | DO NOT CLEAR |                |
| Name6     | DO NOT CLEAR |                |
| Name7     | DO NOT CLEAR |                |
| Name8     | DO NOT CLEAR |                |
| Name9     |              |              5 |
| Name10    |              |              9 |
+-----------+--------------+----------------+

有一个“清除”宏检查每个 excel 范围名称,如果 B 列显示“请勿清除”,那么它将跳过并且什么也不做,如果它是空白的,那么它将清除范围名称并将范围名称值设置为列C、代码如下:

For i = 1 To MaxRowCount

    Select Case Range("RngeTbl").Cells(i, 2).Value
    Case "DO NOT CLEAR" 'do nothing
    Case Else 'set to default value
        Range(Range("RngeTbl").Cells(i, 1).Value).Value = Range("RngeTbl").Cells(i, 3).Value
    End Select

Next i

但是,范围名称的数量正在大量增加,现在我有 32571 个范围名称。

有没有办法可以加快这个宏?我一直在尝试将列放入数组并以某种方式检查,但我没有运气。

请提供任何帮助!

标签: excelvba

解决方案


RngeTbl此代码将在“清除?”上对您的范围进行排序。列,然后计算“清除”中有多少个非空白单元格?列,并在下一行开始循环。

这将意味着循环跳过所有“请勿清除”范围 - 如果要清除所有范围,则代码运行速度会稍慢。如果没有要清除的范围,那么代码将只需要与清除范围一样长的时间Sort

Dim lStart As Long

'Sort the range, without header
[RngeTbl].Sort [RngeTbl].Cells(1, 2), xlAscending, Header:=xlNo
'Since Calculation should be Manual for speed, we recalculate the sorted Range...
[RngeTbl].Calculate
'Count the Non-Blank cells in the "Clear?" column, to find the first non-blank cell
lStart = 1 + WorksheetFunction.CountA([RngTbl].Columns(2))

'If there ARE any non-blank cells
If lStart <= MaxRowCount Then
    'Skip all of the "DO NOT CLEAR" cells
    For i = lStart To MaxRowCount
        Range(Range("RngeTbl").Cells(i, 1).Value).Value = Range("RngeTbl").Cells(i, 3).Value
    Next i
Next lStart

推荐阅读