【问题标题】:Excel VBA to delete rows -- how to make this quicker?Excel VBA 删除行 - 如何更快?
【发布时间】:2016-07-04 05:23:41
【问题描述】:

我目前正在使用我在 stackxchg 上找到的以下代码 sn-p 来删除 A 列中没有数值的行。这可行,但是对于 5000 行的工作表来说速度非常慢。有什么办法可以让这件事走得更快吗?这个概念是,我有一些行只有在满足条件时才会踢出日期,并且将使用此列中的日期生成图表。我希望图表范围参考随行而变化,但这很难,因为行中一直有公式(并且要使图表看起来不错,行需要完全为空)。我的解决方法是找到一个可以删除这些行的宏(但使用此代码太慢了)。任何帮助,将不胜感激。

Sub Sample()
Dim LR3 As Long, i3 As Long

With Sheets("Basket Performance")
    LR3 = .Range("A" & .Rows.Count).End(xlUp).Row

    For i3 = LR3 To 2 Step -1
        If Not IsNumeric(.Range("A" & i3).Value) Or _
        .Range("A" & i3).Value = "" Then .Rows(i3).Delete
    Next i3
End With

结束子

【问题讨论】:

  • 另外,我想创建另一个宏,将行扩展回 5000 行。如果它更容易,也许只是一个宏,它会根据向下有多少行有数值来改变图表参考范围! (那更好)。感谢您的帮助
  • 关闭计算并禁止触发事件,这很可能是它减慢的原因。除此之外,您可以考虑创建一个联合范围并立即删除整个范围。
  • 对不起,我是新手——我该怎么做呢?其他答案没有奏效

标签: excel vba rows extend


【解决方案1】:

您可以在循环结束时执行一次删除:

Sub Sample()

    Dim LR3 As Long, i3 As Long, rng As Range

    With Sheets("Basket Performance")
        LR3 = .Range("A" & .Rows.Count).End(xlUp).Row

        For i3 = LR3 To 2 Step -1
            If Not IsNumeric(.Range("A" & i3).Value) Or _
                           .Range("A" & i3).Value = "" Then 
                If rng Is Nothing Then
                    Set rng = .Cells(i3, 1)
                Else
                    Set rng = application.union(rng, .Cells(i3, 1))
                End If
            End If '<<EDIT
        Next i3
    End With

    If Not rng Is Nothing then rng.Entirerow.Delete

End Sub

【讨论】:

  • 我在最后一个 Next 上收到“Next without for”错误
  • Missed the End If - 添加在上面
【解决方案2】:

你可以试试这个

Option Explicit

Sub delrow()

With ThisWorkbook.Worksheets("Basket Performance")
    .Columns("A").Insert '<== insert a "helper" column for counting and sorting purposes. it'll be removed by the end of the macro
    .Columns("B").SpecialCells(xlCellTypeConstants, xlNumbers).Offset(, -1).FormulaR1C1 = "=COUNT(R1C[1]:RC[1])"
    .Cells.Sort key1:=.Columns("A"), order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlNo
    .Columns("A").Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete '<== maybe you don't need to delete but just define the chart range reference from row 1 down to the last row in column A with a number
    .Columns("A").Delete '<== remove the "helper" column
End With

End Sub

您可能要考虑在整理后不要删除“非数字”行,而只需使用数字定义从第 1 行到 A 列最后一行的图表范围参考

【讨论】:

  • 嗨用户——你的解决方案将是非常理想的——因为到目前为止,这里发布的所有 VBA 代码似乎都不能识别具有数值的公式(他们正在删除所有带有公式的行实际上是踢出价值观)。如果您能帮我弄清楚如何在 VBA 中定义图表范围来做到这一点,我们将不胜感激。
  • 如果我回答了您的问题,请接受我的解决方案。至于图表范围的事情,您可能会让宏记录器为您工作,然后查看自动生成的代码。如果你仍然有问题,你可以开始一个新的问题。在后一种情况下,我建议您像在这种情况下一样行事,即在寻求帮助之前展示您的代码和您所做的所有努力并详细说明它们出了什么问题
  • 应该注意删除排序范围要快得多。可以快一千倍。 Excel 总是尝试先删除 底部 行,因此尽可能少地移动行。尝试将已删除的行彼此相邻,这样可以减少 99.9% 的处理时间。尽量将要删除的行放在底部,这样可以节省 30% 的时间。
猜你喜欢
  • 2023-02-03
  • 2018-02-21
  • 2012-03-11
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多