宏以识别和删除部分

时间:2017-06-20 15:49:45

标签: excel vba excel-vba

我有一个宏可视化地描绘我的数据,底部边框将与每个项目相关的交易分成很好的小部分。问题是,为了捕获我需要的一切,有很多无关的数据,大多数部分都不相关。我有相关的交易粗体,但我需要看到同一个"框"作为粗体交易,所以我不能简单地使用自动过滤器。此外,所有相关交易都是"删除。"

我添加了一个帮助列,其中每个具有底部边框的行都有" Line"在M列中,每个粗体删除事务都有一个"删除"在该列中,列中的大多数单元格都是空白的。现在的任务是开发一个宏来删除" Lines"之间的所有行。不包含"删除"它们之间。因此,在下面的示例中,我希望删除行2-4,保留5-9,并删除10-11(由于绘制为底部边框的线条,每个范围中的第一行为+1)。

1 Header Row
2  
3 
4 Line
5
6 Remove
7
8 Remove
9 Line
10
11 Line
12 Line
13
14
15 Remove
16 Remove
17
18 Remove
19 
20 Line

这是我目前的尝试:

'   Delete empty sections
Dim LastRow As Long
Dim rng3 As Range
Dim LastWasLine As String
Dim LastLine As Long

LastWasLine = "True"
LastLine = 1
LastRow = Sheets("Audit").Cells(Rows.Count, 3).End(xlUp).Row

For Each rng3 In Range("M2:M" & LastRow)
    If rng3 = "Remove" Then
        LastWasLine = "False"
    ElseIf rng3 = "Line" Then
        If LastWasLine = "True" Then
            Range("M" & LastLine + 1 & ":M" & rng3.Row).EntireRow.Delete
        Else
            LastLine = rng3.Row
            LastWasLine = "True"
        End If
    End If
Next rng3

在行3583之前,它似乎行为正常,并且恰当地我只是意味着它删除了所有内容。我无法真正辨别它的功能模式,只保留大块然后删除一个非常大的块,当它应该保留并删除更多更小的部分时。我知道我做错了什么?

原始问题:Macro to identify sections between borders

编辑:搞定了!这就是我最终的结果。我需要继续测试,我确定它可以清理一下,但到目前为止,这么好。谢谢布鲁斯!

'   Delete sections with no removals
Dim LastWasLine As String
Dim LastLine As Long
Dim i As Long

LastRow = Sheets("Audit").Cells(Rows.Count, 3).End(xlUp).Row
LastWasLine = "True"
LastLine = LastRow
Sheets("Audit").Range("M1").FormulaR1C1 = "Line"

For i = LastRow To 1 Step -1
    With Sheets("Audit").Cells(i, "M")
        If .Value = "Remove" Then
            LastWasLine = "False"
        ElseIf .Value = "Line" Then
            If LastWasLine = "True" Then
                Sheets("Audit").Range("M" & i + 1 & ":M" & LastLine).EntireRow.Delete
                LastWasLine = "True"
                LastLine = i
            Else
                LastLine = i
                LastWasLine = "True"
            End If
        End If
    End With
Next i

'   Delete helper column
Sheets("Audit").Range("M:M").Delete Shift:=xlToLeft

1 个答案:

答案 0 :(得分:0)

正如我所提到的,这可能是由于您在列中进行迭代,删除列以及继续操作而不归因于现在删除的行的方式。 ......任何方式,这是如何工作的?

Sub t()
Dim LastRow As Long, i As Long
Dim nextCellUp As Range

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
LastRow = Sheets("Audit").Cells(Rows.Count, 3).End(xlUp).Row ' Note you're using Column C here...

For i = LastRow To 2 Step -1
    With Sheets("Audit").Cells(i, "M")
        If .Value = "Line" Then
            Set nextCellUp = .End(xlUp)
            If nextCellUp = "Line" Then
               'Sheets("Audit").Range(nextCellUp.Row + 1 & ":" & i).EntireRow.Select
                Sheets("Audit").Range(nextCellUp.Row + 1 & ":" & i).EntireRow.Delete
            End If
        End If
    End With
Next i

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

我试图将其“收紧”一点。你也可以,而不是一个字符串,只需完成Dim wasLastLine as Boolean然后再快点检查if wasLastLine Then,最后一行是“行”的时候......任何方式,让我知道是否我理解正确!我想我忽略了一个场景,但它与上面提供的示例数据一起正常工作。