【问题标题】:Excel VBA Sort More EfficientlyExcel VBA 排序更高效
【发布时间】: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 询问。一般来说,您应该放弃工作表(这是您的瓶颈)并将数据放在数组或其他数据结构中。之后你应该实现一个排序算法。
  • 您可以避免声明firstRowWs1searchColumnWs1 变量,因为它们的值是恒定的。你也不需要使用i = i - 1你可以向后运行。
  • @VictorK 如果代码经常崩溃和/或运行速度非常慢,那么它就不能正常工作
  • @JohnColeman 作者的问题是“有没有办法重写它以便能够更有效地排序?”而不是“为什么会崩溃?”。出于这个原因,我认为它最适合代码审查。
  • Range 对象有一个内置的排序方法。如果您实际上是在谈论排序(并且不清楚您是 - 它似乎更像是过滤),那么您可以尝试使用该方法。此外,您可以使用find 方法,而不是逐行检查。

标签: vba excel sorting


【解决方案1】:

这种挑战很容易通过两个数据透视表解决:数据透视表 1 有一个过滤器,只显示您想要的东西,数据透视表 1 有一个过滤器显示其他所有内容。无需 VBA,速度快如闪电,必要时可轻松使用 VBA 编写脚本。

PowerQuery(又名 Get & Transform)也可能让您解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多