Excel VBA功能执行任务的速度非常慢
我在工作表中有很多数据,我一直在使用这些函数通过匹配条件来删除行,执行任务的速度非常慢 我希望得到一些帮助,使它更快。任何帮助都将不胜感激 如果这可以转换成一个代码,这将是很大的帮助Excel VBA功能执行任务的速度非常慢,excel,vba,Excel,Vba,我在工作表中有很多数据,我一直在使用这些函数通过匹配条件来删除行,执行任务的速度非常慢 我希望得到一些帮助,使它更快。任何帮助都将不胜感激 如果这可以转换成一个代码,这将是很大的帮助 Sub MyList() Dim Listing As Worksheet Dim LastRow As Long LastRow = Function1.GetLastFilledRowNo(Listing) For Ro
Sub MyList()
Dim Listing As Worksheet
Dim LastRow As Long
LastRow = Function1.GetLastFilledRowNo(Listing)
For RowNo = LastRow To 9 Step -1
SKU = Format(Listing.Cells(RowNo, 4), "0000000")
RowNoActive = Function2.GetRowNo_BySku(SKU)
If RowNoActive > 0 Then
Listing.Rows(RowNo).Delete
End If
Next RowNo
End Sub
Public Function GetLastFilledRowNo(Sht As Worksheet) As Long
GetLastFilledRowNo = Sht.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
End Function
Public Function GetRowNo_BySku(FormattedSku As String) As Long
GetRowNo_BySku = Function3.GetRowNoSearchOneColumnByString( _
Sheet1, FormattedSku, 2)
End Function
Public Function GetRowNoSearchOneColumnByString(SheetName As String, StringToFind As String, ColumnName As String) As Long
On Error GoTo GetRowNoSearchOneColumnByString_Error
Dim StrFormula As String
GetRowNoSearchOneColumnByString = WorksheetFunction.Match(StringToFind, ThisWorkbook.Worksheets(SheetName).Range(ColumnName & ":" & ColumnName), 0)
Exit Function
GetRowNoSearchOneColumnByString_Error:
GetRowNoSearchOneColumnByString = 0
End Function
嗯,你应该关闭计算和屏幕更新。如果这还不够,请确保使用
Union()
收集变量中要删除的所有行,并在最后立即删除它们(这将比单独删除每一行更快)
如果所有这些都不能显著加快速度,那么问题可能是您在每一行上运行
Match
方法(这需要花费大量时间,无法避免)。您只需测试将整个数据读入一个数组并在该数组上执行匹配是否会加快速度。但为此,您需要更改代码的整个设计。您应该关闭计算和屏幕更新。如果这还不够,请确保使用Union()
收集变量中要删除的所有行,并在最后立即删除它们(这将比单独删除每一行更快)。是的,你是对的。这是问题的根源。请参阅下面我的答案,这将给您带来显著的提升。您有多少行数据,其中有多少行通常会被删除?另一个查找表中有多少行?先生,几乎24K行,删除的记录超过2K,而另一个表中有将近5K的数据。是的,我还假设匹配功能可能是导致整个过程非常缓慢的原因。但是你添加了一个转折点谢谢让我检查一下谢谢@Pᴇʜ它的工作速度比以前快,但我仍然认为匹配功能可以像您所说的那样提供更多帮助。如果不麻烦的话,请再帮我一个匹配功能的忙。谢谢。@Arham您可能无法摆脱match函数。您可以尝试在数据数组而不是单元格上运行它。你的问题太不清楚,无法详细回答如何做到这一点,但你可以用谷歌搜索如何使用数组而不是单元格来提高速度。有很多教程,例如:如果你陷入困境,你可以打开一个新问题,展示你的尝试。非常感谢@Pᴇ谢谢你的好意。
Sub MyList()
Dim Listing As Worksheet
Dim LastRow As Long
LastRow = Function1.GetLastFilledRowNo(Listing)
Dim RowsToDelete As Range ' collect all rows
For RowNo = LastRow To 9 Step -1
SKU = Format(Listing.Cells(RowNo, 4), "0000000")
RowNoActive = Function2.GetRowNo_BySku(SKU)
If RowNoActive > 0 Then
' don't delete here just collect all rows to delete
If RowsToDelete Is Nothing Then
Set RowsToDelete = Listing.Rows(RowNo)
Else
Set RowsToDelete = Union(RowsToDelete, Listing.Rows(RowNo))
End If
End If
Next RowNo
' if there is something collected then delete
If Not RowsToDelete Is Nothing Then
RowsToDelete.Delete
End If
End Sub