我有一个宏可视化地描绘我的数据,底部边框将与每个项目相关的交易分成很好的小部分。问题是,为了捕获我需要的一切,有很多无关的数据,大多数部分都不相关。我有相关的交易粗体,但我需要看到同一个"框"作为粗体交易,所以我不能简单地使用自动过滤器。此外,所有相关交易都是"删除。"
我添加了一个帮助列,其中每个具有底部边框的行都有" 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
答案 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
,最后一行是“行”的时候......任何方式,让我知道是否我理解正确!我想我忽略了一个场景,但它与上面提供的示例数据一起正常工作。