VBA-避免循环

时间:2018-09-27 10:23:37

标签: excel 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个范围名称。

有没有一种方法可以加快此宏的速度?我一直在尝试将列放入数组中,并以某种方式进行检查,但是我没有运气。

请帮忙!

2 个答案:

答案 0 :(得分:1)

以下代码应该稍好一些(如果在Application.ScreenUpdating = Fasle等上下文中运行):

Dim A As Variant
Set A = Range("RngeTbl").Value
For i = 1 To UBound(A)
    If A(i,2) <> "DO NOT CLEAR" Then Range(A(i,1)).Value = A(i,3)
Next i

如果MaxRowCount小于该范围内的行数,那么您当然可以在循环中使用该值而不是UBound(A)

答案 1 :(得分:1)

此代码将在“清除?”上对您的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