Excel VBA排序更有效

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

我目前有一个排序脚本,可以逐行检查某个字符串。如果字符串匹配,则该行将复制到该工作表中,并且该行将被删除。然而,有时我需要对成千上万行进行排序,这可能需要很长时间,或者会使Excel崩溃。有没有办法重写它以便能够更有效地排序

在我的代码中,我使用不同的图纸名称多次复制了With ws2块

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
方法,而不是逐行检查某个内容。