Excel VBA排序更有效
我目前有一个排序脚本,可以逐行检查某个字符串。如果字符串匹配,则该行将复制到该工作表中,并且该行将被删除。然而,有时我需要对成千上万行进行排序,这可能需要很长时间,或者会使Excel崩溃。有没有办法重写它以便能够更有效地排序 在我的代码中,我使用不同的图纸名称多次复制了With ws2块Excel VBA排序更有效,vba,excel,sorting,Vba,Excel,Sorting,我目前有一个排序脚本,可以逐行检查某个字符串。如果字符串匹配,则该行将复制到该工作表中,并且该行将被删除。然而,有时我需要对成千上万行进行排序,这可能需要很长时间,或者会使Excel崩溃。有没有办法重写它以便能够更有效地排序 在我的代码中,我使用不同的图纸名称多次复制了With ws2块 Dim ws1 As Worksheet, ws2 As Worksheet Dim firstRowWs1 As Long Dim lastRowWs1 As Long Dim lastRowWs2 As L
Dim ws1 As Worksheet, ws2 As Worksheet
Dim firstRowWs1 As Long
Dim lastRowWs1 As Long
Dim lastRowWs2 As Long
Dim searchColumnWs1 As Integer
Dim i As Integer
Dim check As Variant
Dim strSearch As Variant
Dim foundMatches As Boolean
Dim sDate As String
sDate = Format(Now(), "mm/dd/yyyy")
Set ws1 = Worksheets("Sort")
Set ws3 = Worksheets("Overview")
Set ws2 = Worksheets("sheet2")
With ws2
lastRowWs1 = ws1.UsedRange.Rows.Count
lastRowWs2 = ws2.UsedRange.Rows.Count
firstRowWs1 = 1
searchColumnWs1 = 10
strSearch = Array("john")
For i = firstRowWs1 To lastRowWs1
For Each check In strSearch
If check = ws1.Cells(i, searchColumnWs1).Value Then
ws1.Rows(i).Copy (ws2.Rows(lastRowWs2 + 1))
ws2.Rows(lastRowWs2 + 1).Columns("A:B").Insert xlToRight
lastRowWs2 = lastRowWs2 + 1
ws1.Rows(i).Delete shift:=xlUp
i = i - 1
Exit For
End If
Next check
Next i
End With
这种挑战可以通过两个数据透视表轻松解决:数据透视表1有一个只显示所需内容的筛选器,数据透视表1有一个显示所有其他内容的筛选器。没有VBA,闪电般的速度,如果需要,很容易用VBA编写脚本
PowerQuery(又名Get&Transform)可能也会让您解决这个问题。这种挑战可以通过两个数据透视表轻松解决:数据透视表1有一个只显示所需内容的筛选器,数据透视表1有一个显示所有其他内容的筛选器。没有VBA,闪电般的速度,如果需要,很容易用VBA编写脚本
PowerQuery(又名Get&Transform)可能也会让您解决这个问题。如果代码有效,那么您应该询问。通常,您应该放弃工作表(这是您的瓶颈),将数据放在数组或其他数据结构中。之后,您应该实现一个排序算法。您可以避免声明
firstRowWs1
和searchColumnWs1
变量,因为它们的值是常量。另外,您也不需要使用i=i-1
您可以向后运行。@VictorK如果代码经常崩溃和/或运行速度非常慢,那么它实际上不会运行work@JohnColeman作者的问题是“有没有一种方法可以重写它以便能够更有效地排序?”而不是“为什么它会崩溃?”。出于这个原因,我认为它最适合于代码审查。范围对象有一个内置的排序方法。如果你真的在谈论排序(现在还不清楚你是否在谈论排序——这可能更像是过滤),那么你可以尝试使用这种方法。此外--您可以使用find
方法,而不是逐行检查某个内容。如果代码有效,那么您应该询问。通常,您应该放弃工作表(这是您的瓶颈),将数据放在数组或其他数据结构中。之后,您应该实现一个排序算法。您可以避免声明firstRowWs1
和searchColumnWs1
变量,因为它们的值是常量。另外,您也不需要使用i=i-1
您可以向后运行。@VictorK如果代码经常崩溃和/或运行速度非常慢,那么它实际上不会运行work@JohnColeman作者的问题是“有没有一种方法可以重写它以便能够更有效地排序?”而不是“为什么它会崩溃?”。出于这个原因,我认为它最适合于代码审查。范围对象有一个内置的排序方法。如果你真的在谈论排序(现在还不清楚你是否在谈论排序——这可能更像是过滤),那么你可以尝试使用这种方法。另外--您可以使用find
方法,而不是逐行检查某个内容。