我在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个范围名称。
有没有一种方法可以加快此宏的速度?我一直在尝试将列放入数组中,并以某种方式进行检查,但是我没有运气。
请帮忙!
答案 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