Excel通过使用Variant而不是Range来抵消宏增加性能

时间:2015-03-13 16:01:10

标签: excel vba

我有这个宏来检查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,但结果仍然相同。

您能否建议我如何更改代码以使用变体并获得最佳性能?

1 个答案:

答案 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