【问题标题】:Speed up VBA code on extracting relevant rows to new worksheet加快 VBA 代码提取相关行到新工作表的速度
【发布时间】:2018-09-17 08:39:52
【问题描述】:

我需要将相关行复制到新的 Excel 工作表。代码将遍历原始工作表中的每一行,并根据数组中指定的相关国家和产品选择行到第二个工作表中。

Private Sub CommandButton1_Click()

a = Worksheets("worksheet1").Cells(Rows.Count, 2).End(xlUp).Row
Dim countryArray(1 To 17) As Variant
Dim productArray(1 To 17) As Variant

' countryArray(1)= "Australia" and so on...
' productArray(1)= "Product A" and so on...

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For i = 3 To a
    For Each j In countryArray
        For Each k In productArray
        Sheets("worksheet1").Rows(i).Copy Destination:=Sheets("worksheet2").Range("A" & Rows.Count).End(xlUp).Offset(1)
        Next
    Next
Next

Application.CutCopyMode = False
Application.ScreenUpdating = False

End Sub

每次我运行代码时,电子表格都会在几分钟内停止响应。如果有人可以帮助我,将不胜感激,在此先感谢!

【问题讨论】:

  • 你希望 Application.ScreenUpdating = True 在最后切换回重绘。
  • 我还会添加 Application.Calculation = xlCalculationManualApplication.EnableEvents = False 以加快速度。不要忘记在代码末尾反转它。
  • //define countryArray 和 productArray 不是您在 VBA 中的评论方式。使用'
  • countryArrayproductArray 中没有值,为什么要循环它们??
  • 根据您尚未共享的信息,您将通过以下方式之一大大加快此速度:1 将整个表读入 VBA 数组;遍历将相关提取到字典/集合的数组;将结果写入results 数组并将其写回新工作表。 2 使用过滤器并使用.SpecialCells(xlvisible) 属性复制到新工作表。 3 使用允许一次复制的高级过滤器;但需要在工作表中写入Criteria Array

标签: excel vba copy-paste


【解决方案1】:

这里有一些提示:

  1. 记得声明所有变量并在代码顶部使用Option Explicit
  2. 使用With 语句确保使用正确的工作表而不是隐式的活动表,否则您可能会得到错误的结束行数
  3. 只有 i 对循环有贡献,所以你在做不必要的循环工作
  4. 使用Union 收集符合条件的范围并一次性复制
  5. 记得重新开启screen-updating

代码:

Option Explicit
Private Sub CommandButton1_Click()
    Dim unionRng As Range, a As Long, i As Long
    With Worksheets("worksheet1")
        a = .Cells(.Rows.Count, 2).End(xlUp).Row

        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual

        For i = 3 To a
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, .Cells(i, 1))
            Else
                Set unionRng = .Cells(i, 1)
            End If
        Next

        With Worksheets("worksheet2")
            unionRng.EntireRow.Copy .Cells(.Rows.Count, "A").End(xlUp).Row +1
        End With
    End With

    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 顺便说一句,当宏退出时,Application.ScreenUpdating 将自动更改为True。我也在我的代码中明确地重置它,因为我认为它有助于清晰并避免混淆,但这不是严格要求的。
  • 这有帮助吗?
  • 我认为只有在您对问题发表评论时,OP才会收到通知
  • 非常感谢@RonRosenfeld。很抱歉打扰了。
  • 无干扰。坐在这里做其他事情,休息一下。
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2021-11-16
  • 2023-03-30
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多