我有这个宏来检查A列中是否是包含" F"然后从列CC检查最后使用的行(我希望我做对了,因为只有CC列是最长的一行) 如果找到了" F"然后右边的每个单元格向下移动两个位置。工作表包含A列到IW
的数据Dim rng As Range
Dim LastRow As Long
Application.ScreenUpdating = False
With ActiveSheet
LastRow = .Cells(.Rows.Count, "CC").End(xlUp).Row
End With
For Each rng In Range(Sheets(1).Range("A1"), Sheets(1).Range("A" & LastRow).End(xlUp))
If rng.Text = "F" Then
rng.Offset(-1, 0).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 0).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
...
rng.Offset(-1, 256).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
rng.Offset(-1, 256).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If
Next rng
Range("A1").Select
Application.ScreenUpdating = TRUE
不幸的是,对于大数据,当我获得750多行时,这个宏非常慢,即使在具有16GB RAM机器的双Xeon处理器(每个处理器为双核处理器)中,处理时间也会长达90分钟。 我试图进行性能优化,如关闭屏幕更新,所有Excel工作表都没有相关的公式,只有数据应该向下移动两行......
经过大量谷歌搜索后,我在Office博客中找到了这个页面,我注意到在我的情况下,而不是抵消变体应该更好:
http://blogs.office.com/2008/10/03/what-is-the-fastest-way-to-scan-a-large-range-in-excel/
我尝试了一些更改,将rng
声明为Variant而不是Range,但结果仍然相同。
您能否建议我如何更改代码以使用变体并获得最佳性能?
答案 0 :(得分:0)
对于仅750行,使用数组循环将产生可忽略的差异。你正在做的是在256列中分别插入2个单元格。尝试一次插入整行。我也会反过来循环这个范围。此外,您的.Insert
不会向下移动当前单元格,它会将单元格移动到当前单元格上方。请调整如下。
Dim rng As Range
Dim LastRow, i As Long
Application.ScreenUpdating = False
With ActiveSheet
LastRow = .Cells(.Rows.Count, "CC").End(xlUp).Row
End With
For i = LastRow to 1 Step -1
set rng = Cells(i,1)
If rng.Text = "F" Then
Range("A" & i & ":" & "BZ" & i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftorAbove
Range("A" & i & ":" & "BZ" & i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftorAbove
Range("CA" & i & ":" & "CI" & i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftorAbove
'rng.EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'rng.EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If
Next i
Range("A1").Select
Application.ScreenUpdating = TRUE