Excel 如何简化VBA代码以更快地运行?

Excel 如何简化VBA代码以更快地运行?,excel,vba,performance,Excel,Vba,Performance,相对较新的VBA编码器,我有一个运行缓慢的excel宏 以下代码用于从一个工作表(例如,Sheet12“CLIENT 1”)中获取非空行数据,并基于单元格值将其移动到其他工作表。数据可以发送到5张表中的一张,有4张需要排序的数据表 代码目前可以运行,但运行速度非常慢,尤其是在数据量很大的情况下。有没有更好的方法来编写此代码以加快运行时间 Private Sub REFRESH_DATA() Sheet3.Range("A3:Z2000").ClearContents

相对较新的VBA编码器,我有一个运行缓慢的excel宏

以下代码用于从一个工作表(例如,Sheet12“CLIENT 1”)中获取非空行数据,并基于单元格值将其移动到其他工作表。数据可以发送到5张表中的一张,有4张需要排序的数据表

代码目前可以运行,但运行速度非常慢,尤其是在数据量很大的情况下。有没有更好的方法来编写此代码以加快运行时间

Private Sub REFRESH_DATA()

Sheet3.Range("A3:Z2000").ClearContents            'Clear GREEN_Data
Sheet5.Range("A3:Z2000").ClearContents            'Clear BLUE_Data
Sheet7.Range("A3:Z2000").ClearContents            'Clear PURPLE_Data
Sheet9.Range("A3:Z2000").ClearContents            'Clear YELLOW_Data
Sheet11.Range("A3:Z2000").ClearContents           'Clear ORANGE_Data

Application.ScreenUpdating = False                'Stop screen from flashing

Dim s As Long
Dim AA As Long
Dim AB As Long
Dim AC As Long
Dim AD As Long
Dim A1 As Long
Dim A2 As Long
Dim A3 As Long
Dim A4 As Long
Dim A5 As Long

AA = Sheet12.Range("A" & Sheet12.Rows.Count).End(xlUp).Row  'Project List - Client 1
AB = Sheet13.Range("A" & Sheet13.Rows.Count).End(xlUp).Row  'Project List - Client 2
AC = Sheet14.Range("A" & Sheet14.Rows.Count).End(xlUp).Row  'Project List - Client 3
AD = Sheet15.Range("A" & Sheet15.Rows.Count).End(xlUp).Row  'Project List - Client 4

A1 = Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Row     'GREEN_Data
A2 = Sheet5.Range("A" & Sheet5.Rows.Count).End(xlUp).Row     'BLUE_Data
A3 = Sheet7.Range("A" & Sheet7.Rows.Count).End(xlUp).Row     'PURPLE_Data
A4 = Sheet9.Range("A" & Sheet9.Rows.Count).End(xlUp).Row     'YELLOW_Data
A5 = Sheet11.Range("A" & Sheet11.Rows.Count).End(xlUp).Row   'ORANGE_Data

For s = 5 To AA     'Project List - Client 1
    If Sheet12.Cells(s, 28).Value = True Then
        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A1 = A1 + 1
        Sheet3.Range("A" & A1).PasteSpecial Paste:=xlPasteValues     'GREEN_Data
    End If
    If Sheet12.Cells(s, 29).Value = True Then
        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A2 = A2 + 1
        Sheet5.Range("A" & A2).PasteSpecial Paste:=xlPasteValues     'BLUE_Data
    End If
    If Sheet12.Cells(s, 30).Value = True Then
        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A3 = A3 + 1
        Sheet7.Range("A" & A3).PasteSpecial Paste:=xlPasteValues     'PURPLE_Data
    End If
    If Sheet12.Cells(s, 31).Value = True Then
        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A4 = A4 + 1
        Sheet9.Range("A" & A4).PasteSpecial Paste:=xlPasteValues     'YELLOW_Data
    End If
    If Sheet12.Cells(s, 32).Value = True Then
        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A5 = A5 + 1
        Sheet11.Range("A" & A5).PasteSpecial Paste:=xlPasteValues    'ORANGE_Data
    End If
Next s
For s = 5 To AB     'Project List - Client 2
    If Sheet13.Cells(s, 28).Value = True Then
        Sheet13.Range("A" & s).Resize(ColumnSize:=27).Copy
        A1 = A1 + 1
        Sheet3.Range("A" & A1).PasteSpecial Paste:=xlPasteValues     'GREEN_Data
    End If
    If Sheet13.Cells(s, 29).Value = True Then
        Sheet13.Range("A" & s).Resize(ColumnSize:=27).Copy
        A2 = A2 + 1
        Sheet5.Range("A" & A2).PasteSpecial Paste:=xlPasteValues     'BLUE_Data
    End If
    If Sheet13.Cells(s, 30).Value = True Then
        Sheet13.Range("A" & s).Resize(ColumnSize:=27).Copy
        A3 = A3 + 1
        Sheet7.Range("A" & A3).PasteSpecial Paste:=xlPasteValues     'PURPLE_Data
    End If
    If Sheet13.Cells(s, 31).Value = True Then
        Sheet13.Range("A" & s).Resize(ColumnSize:=27).Copy
        A4 = A4 + 1
        Sheet9.Range("A" & A4).PasteSpecial Paste:=xlPasteValues     'YELLOW_Data
    End If
    If Sheet13.Cells(s, 32).Value = True Then
        Sheet13.Range("A" & s).Resize(ColumnSize:=27).Copy
        A5 = A5 + 1
        Sheet11.Range("A" & A5).PasteSpecial Paste:=xlPasteValues    'ORANGE_Data
    End If
Next s
For s = 5 To AC     'Project List - Client 3
    If Sheet14.Cells(s, 28).Value = True Then
        Sheet14.Range("A" & s).Resize(ColumnSize:=27).Copy
        A1 = A1 + 1
        Sheet3.Range("A" & A1).PasteSpecial Paste:=xlPasteValues     'GREEN_Data
    End If
    If Sheet14.Cells(s, 29).Value = True Then
        Sheet14.Range("A" & s).Resize(ColumnSize:=27).Copy
        A2 = A2 + 1
        Sheet5.Range("A" & A2).PasteSpecial Paste:=xlPasteValues     'BLUE_Data
    End If
    If Sheet14.Cells(s, 30).Value = True Then
        Sheet14.Range("A" & s).Resize(ColumnSize:=27).Copy
        A3 = A3 + 1
        Sheet7.Range("A" & A3).PasteSpecial Paste:=xlPasteValues     'PURPLE_Data
    End If
    If Sheet14.Cells(s, 31).Value = True Then
        Sheet14.Range("A" & s).Resize(ColumnSize:=27).Copy
        A4 = A4 + 1
        Sheet9.Range("A" & A4).PasteSpecial Paste:=xlPasteValues     'YELLOW_Data
    End If
    If Sheet14.Cells(s, 32).Value = True Then
        Sheet14.Range("A" & s).Resize(ColumnSize:=27).Copy
        A5 = A5 + 1
        Sheet11.Range("A" & A5).PasteSpecial Paste:=xlPasteValues    'ORANGE_Data
    End If
Next s
For s = 5 To AD     'Project List - Client 4
    If Sheet15.Cells(s, 28).Value = True Then
        Sheet15.Range("A" & s).Resize(ColumnSize:=27).Copy
        A1 = A1 + 1
        Sheet3.Range("A" & A1).PasteSpecial Paste:=xlPasteValues     'GREEN_Data
    End If
    If Sheet15.Cells(s, 29).Value = True Then
        Sheet15.Range("A" & s).Resize(ColumnSize:=27).Copy
        A2 = A2 + 1
        Sheet5.Range("A" & A2).PasteSpecial Paste:=xlPasteValues     'BLUE_Data
    End If
    If Sheet15.Cells(s, 30).Value = True Then
        Sheet15.Range("A" & s).Resize(ColumnSize:=27).Copy
        A3 = A3 + 1
        Sheet7.Range("A" & A3).PasteSpecial Paste:=xlPasteValues     'PURPLE_Data
    End If
    If Sheet15.Cells(s, 31).Value = True Then
        Sheet15.Range("A" & s).Resize(ColumnSize:=27).Copy
        A4 = A4 + 1
        Sheet9.Range("A" & A4).PasteSpecial Paste:=xlPasteValues     'YELLOW_Data
    End If
    If Sheet15.Cells(s, 32).Value = True Then
        Sheet15.Range("A" & s).Resize(ColumnSize:=27).Copy
        A5 = A5 + 1
        Sheet11.Range("A" & A5).PasteSpecial Paste:=xlPasteValues    'ORANGE_Data
    End If
Next s

Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
提前感谢您的帮助

应该更快:

私有子刷新_数据()
常数拷贝长度=27
变暗ws、rw等长、ARRDESTSETES、ARRDESTOWS、n等长
Application.ScreenUpdate=False“停止屏幕闪烁”
'要复制到的工作表:绿、蓝、紫、黄、橙
arrDestSheets=阵列(第3页、第5页、第7页、第9页、第11页)
arrDestRows=每个工作表中的数组(3,3,3,3)目标行
'清除所有目的地工作表
对于每个工作表中的ws
ws.Range(“A3:Z2000”).ClearContents
下一个ws
对于阵列中的每个ws(表12、表13、表14、表15)
对于rw=5到ws.Cells(Rows.Count,1).End(xlUp).Row
对于n=0到4
如果ws.Cells(rw,28+n)=True,则
arrDestSheets(n).单元格(arrDestRows(n),1).调整大小(1,复制)。值=_
ws.Cells(rw,1).Resize(1,COPY_COLS).Value
arrDestRows(n)=arrDestRows(n)+1
如果每行只有一个匹配项,则“Exit For”取消注释
如果结束
下一个
下一个rw
下一个ws
Application.ScreenUpdating=True
端接头

要做的第一件事:删除“复制粘贴”结构,如下所示:

您的代码:

        Sheet12.Range("A" & s).Resize(ColumnSize:=27).Copy
        A1 = A1 + 1
        Sheet3.Range("A" & A1).PasteSpecial Paste:=xlPasteValues     'GREEN_Data
我的建议:

        Sheet12.Range("A" & s).Resize(ColumnSize:=27)
        A1 = A1 + 1
        Sheet3.Range("A" & A1).Value = Sheet12.Range("A" & s).Value    'GREEN_Data

这样可以避免通过剪贴板,在我看来,这是一个巨大的性能下降点。

可能与
范围有关。AutoFilter
如果坚持循环数据,请不要循环范围,但大容量加载变量数组,使用数据和循环代替。这个问题可能更适合于.Tim-使用此代码将A列中的信息复制到整行中。是否有办法确保复制整行,而不是将a列中的数据复制到所有列中?如果任何行只能移动一次,则可以在第一次匹配后退出