【问题标题】:Delete consecutive ROWs EXCEL VBA删除连续的ROWs EXCEL VBA
【发布时间】:2015-07-24 08:49:31
【问题描述】:

我的数据在 A 列中,我想删除所有连续的行,例如 B 列。 代码

  If Range("A" & i).Value = Range("A" & i).Offset(1, 0).Value Then
    Rows(i & ":" & i).Delete shift:=xlUp
  End If

我写了脚本,但我不知道如何把它放在一个循环中。任何帮助谢谢。

【问题讨论】:

  • 通常情况下,删除行最好从底部开始向顶部移动。确定要循环回第一行吗?
  • 它不关心我是怎么做的,但我想得到如“B”列所示的结果

标签: excel vba loops rows


【解决方案1】:

由于删除行非常耗时,因此此任务的最佳方法是使用 Union 函数将所有要删除的行收集到 Range 类的单个对象中,然后使用单次操作。

下面是演示如何做到这一点的代码:

Sub deleteConsecutiveRows()
    Dim wks As Excel.Worksheet
    Dim rng As Excel.Range
    Dim row As Long
    Dim lastRow As Long
    '-------------------------------------------------------------------------


    Set wks = Excel.ActiveSheet


    With wks
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).row

        For row = 2 To lastRow
            If .Cells(row, 1).Value = .Cells(row - 1, 1).Value Then

                If rng Is Nothing Then
                    Set rng = .Rows(row)
                Else
                    Set rng = Excel.Union(rng, .Rows(row))
                End If

            End If
        Next row

    End With


    'In order to avoid Run-time error check if [rng] range is not empty, before removing it.
    If Not rng Is Nothing Then
        Call rng.EntireRow.Delete
    End If


End Sub

【讨论】:

    【解决方案2】:

    通常,删除行的最佳方法是从底部开始向顶部移动。这样可以避免在您删除 is 并且行向上移动时“跳过”一行。

    Dim rw As Long
    
    With Sheets("Sheet1")
        For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
            If .Cells(rw, 1).Value = .Cells(rw - 1, 1).Value Then _
                .Rows(rw).Delete
        Next rw
    End With
    

    同样,通常一列数据会有一个列标题标签,您不希望在删除过程中涉及该标签。但是,只要标签(如果有)与第 2 行中的单元格值不匹配,这应该不是问题。

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 2013-06-17
      • 2013-06-14
      • 1970-01-01
      • 2013-01-27
      • 2018-02-21
      • 2012-03-11
      • 2023-03-17
      相关资源
      最近更新 更多