【问题标题】:How to delete five rows after every sixth row?如何在每六行后删除五行?
【发布时间】:2019-04-23 20:25:52
【问题描述】:

我需要在每 6 行之后删除 5 行,假设第一行是被忽略的第一行。例如:

Row 1 <-- want to keep
Row 2-6 <-- want to delete
Row 7 <-- want to keep
Row 8-12 <-- want to delete
etc., for all rows with values in column A

我尝试手动删除不需要的行,但意识到必须有更好的方法。我确实查找了几个删除每隔一行的 VBA 示例,但我需要每隔这么多行删除一系列行,并且不确定如何处理。我也不确定如何修改代码以继续循环所有在 A 列中有数据的行,而不仅仅是一个特定的集合。

Sub sbVBS_To_Delete_Rows_In_Range()
Dim iCntr
Dim rng As Range
Set rng = Range("A10:D20")

    For iCntr = rng.Row + rng.Rows.Count - 1 To rng.Row Step -1
       Rows(iCntr).EntireRow.Delete
    Next

End Sub

这似乎删除了一个范围的行,所以这比我以前更接近。但是,我需要继续处理 A 列中包含日期的所有行。

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    我相信你正在寻找这样的东西:

    Sub tgr()
    
        Dim ws As Worksheet
        Dim rStart As Range
        Dim rStop As Range
        Dim rTemp As Range
        Dim rDel As Range
        Dim lGroupSize As Long
        Dim i As Long
    
        Set ws = ActiveWorkbook.ActiveSheet
        Set rStart = ws.Columns("A").Find("*", ws.Cells(ws.Rows.Count, "A"), xlValues, xlPart)
        Set rStop = ws.Cells(ws.Rows.Count, "A").End(xlUp)
        lGroupSize = 5
    
        For i = rStart.Row To rStop.Row Step lGroupSize + 1
            Set rTemp = ws.Cells(i + 1, "A").Resize(lGroupSize)
            If rDel Is Nothing Then Set rDel = rTemp Else Set rDel = Union(rDel, rTemp)
        Next i
    
        If Not rDel Is Nothing Then rDel.EntireRow.Delete
    
    End Sub
    

    编辑:根据 cmets 中的请求更新代码

    Sub tgr()
    
        Dim ws As Worksheet
        Dim rStart As Range
        Dim rStop As Range
        Dim rTemp As Range
        Dim rDel As Range
        Dim sColCheck As String
        Dim lGroupSize As Long
        Dim i As Long, j As Long
    
        Set ws = ActiveWorkbook.ActiveSheet
        sColCheck = "A"
        lGroupSize = 5
    
        Set rStart = ws.Columns(sColCheck).Find("*", ws.Cells(ws.Rows.Count, sColCheck), xlValues, xlPart)
        Set rStop = ws.Cells(ws.Rows.Count, sColCheck).End(xlUp)
    
        i = rStart.Row
        Do While i <= rStop.Row
            Set rTemp = Nothing
            For j = 1 To lGroupSize
                If IsDate(ws.Cells(i + j, sColCheck)) Then
                    Set rTemp = ws.Cells(i + 1, sColCheck).Resize(j)
                    Exit For
                End If
            Next j
            If Not rTemp Is Nothing Then If rDel Is Nothing Then Set rDel = rTemp Else Set rDel = Union(rDel, rTemp)
            i = i + j + 1
        Loop
    
        If Not rDel Is Nothing Then rDel.EntireRow.Delete
    
    End Sub
    

    【讨论】:

    • 这太棒了!完美的!现在,我想知道如何使它更具动态性,它不会在这么多行之后删除一定数量的行,而是删除行直到它到达一个日期,也删除带有日期的行,然后跳过下一个日期之后的行,并以相同的模式再次开始删除。例如,第 1 行
    • @lemonbars 发现了一个错误,更新了解决该错误的答案。
    • 谢谢!一个问题,不过。 . .在第二种情况下,通过带有日期的行删除行,跳过,然后重新开始,lGroupSize = 5 是否仍然需要,因为要删除的行数变得任意?
    【解决方案2】:

    希望对你有用,你可以通过任何你想要的范围和频率!

    Sub sbVBS_To_Delete_Rows_In_Range(rg As Range, Optional frequency As Long = 5)
        Dim i As Long
        Dim rangeToDelete As String
    
        Dim cont As Long
        rangeToDelete = VBA.Split(rg.Cells(i, 1).Address, "$")(1) & (VBA.Split(rg.Cells(i, 1).Address, "$")(2) + 1) & ":" & VBA.Split(rg.Cells(i, 1).Address, "$")(1) & (VBA.Split(rg.Cells(i + frequency, 1).Address, "$")(2))
        For i = 1 To rg.Cells.count
            Range(rangeToDelete).Offset(i - 1).Select
            Range(rangeToDelete).Offset(i - 1).rows.Delete
        Next
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 2015-07-11
      • 2018-04-27
      • 2014-09-30
      • 2021-09-20
      • 1970-01-01
      相关资源
      最近更新 更多