Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel偏移宏通过使用变量而不是范围来提高性能_Excel_Vba - Fatal编程技术网

Excel偏移宏通过使用变量而不是范围来提高性能

Excel偏移宏通过使用变量而不是范围来提高性能,excel,vba,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).Ro

我有一个宏,它检查列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博客中找到了这个页面,我注意到,在我的情况下,与其抵消一个变体,不如更好:

我尝试了一些更改,将
rng
声明为Variant而不是Range,但结果仍然很慢


您能建议我如何更改代码以使用变体并实现最佳性能吗?

对于仅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

考虑处理数组中的所有数据:不与页交互的操作将允许您大幅提高性能。按照这种方法,您应该通过将
SomeRange.Value
赋值给数组,将数据从工作表放到二维数组中。然后处理数据,也可以创建另一个大小不同的数组,并通过将结果数组赋给
SomeRange.Value
,将其放回到工作表中。我必须道歉,我没有明确提到许多列需要下两个单元格,但是在CC列的左侧和右侧有一些人只需要向下移动一个单元格。我正在重新排列数据,以便将所有内容都放在一行中。我很高兴知道如何一次向下添加多个单元格,以便从A列到BZ列我可以向下移动两行,然后从CA列到CI列我可以将数据向下移动一行。这可能会带来更多的性能,也许,你觉得这个案例怎么样?请看我编辑的代码。我注释掉了为整行插入新行的两行,并添加了三行,这三行将a:BZ下移两行,CA:CI下移一行。