【发布时间】:2018-05-11 05:25:57
【问题描述】:
我目前有一个排序脚本,可以逐行检查某个字符串。如果字符串匹配,则该行将被复制到该工作表并删除该行。但是,有时我需要对数万行进行排序,这可能需要很长时间或者会使 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
【问题讨论】:
-
如果代码有效,那么您应该在Code Review 询问。一般来说,您应该放弃工作表(这是您的瓶颈)并将数据放在数组或其他数据结构中。之后你应该实现一个排序算法。
-
您可以避免声明
firstRowWs1和searchColumnWs1变量,因为它们的值是恒定的。你也不需要使用i = i - 1你可以向后运行。 -
@VictorK 如果代码经常崩溃和/或运行速度非常慢,那么它就不能正常工作
-
@JohnColeman 作者的问题是“有没有办法重写它以便能够更有效地排序?”而不是“为什么会崩溃?”。出于这个原因,我认为它最适合代码审查。
-
Range 对象有一个内置的排序方法。如果您实际上是在谈论排序(并且不清楚您是 - 它似乎更像是过滤),那么您可以尝试使用该方法。此外,您可以使用
find方法,而不是逐行检查。