报告生成一个如下所示的表格:
格式继承自源数据,数据位于列A,D和G中,A合并ABC,D自身合并DEF和G.
我想只保留以蓝色突出显示的行。我希望宏检查G:G的内容以及Cell.Text ="" wholerow.delete,否则不管它。
唯一的问题是当它删除第2行,然后第3行变为第2行,这意味着它不会删除它,因为它已经检查了第2行。第4行现在变为第3行,这是下一个要检查的,它看到文本在那里并且没有删除,移动到第四行,删除它,第5行变为第4行,保持未选中状态,它移动到第6行(现在是行) 5),看到它是空白的,删除它,但第7行现在变成第6行并且不被删除......依此类推。
我发现它的唯一方法是使用GOTO重启循环,然后使用另一个GOTO提前退出循环。我很欣赏这可能不是最优雅的解决方案。
iRange = Application.Workbooks(2).Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row + 1
Debug.Print (iRange)
RestartLoop:
For Each rCell In Application.Workbooks(2).Worksheets(2).Range("G2:G" & iRange)
If Not rCell.Offset(0, -3).Value = "" Then
If rCell.Text = "" Then
Debug.Print (rCell.Address)
rCell.EntireRow.Delete
GoTo RestartLoop
End If
Else0
GoTo LeaveLoop
End If
Next rCell
LeaveLoop:
'Do the next thing
(代码是Option Explicit:Dim iRange As Integer Dim rCell as code in top of code)
这是debug.print:
26
$G$2
$G$2
$G$3
$G$3
$G$3
$G$3
$G$3
$G$3
$G$3
$G$3
$G$3
$G$4
$G$4
$G$4
$G$4
$G$4
$G$6
$G$6
$G$7
如果有人知道解决方案,也可以为外行解释,我会很感激。解决方案需要是动态的,因为每次生成的原始纸张长度不同,每次都有不同数量的空白和蓝色单元格。
我已经搜索了一下,但要么我没有完全理解答案,要么他们似乎给我同样的问题。
答案 0 :(得分:2)
看看下面的内容,它的工作原理是从符合条件的单元格中建立一个范围,然后一次性删除所有这些单元格。 测试时,请始终在原件的副本上进行测试,以确保结果符合预期,然后才能永久
Dim DeleteRng As Range
Application.ScreenUpdating = False
IRange = Application.Workbooks(2).Worksheets(2).Cells(Rows.Count, "A").End(xlUp).Row + 1
Debug.Print IRange
' This is dangerous, select workbook using ThisWorkbook, or setting the workbook to a variable
' Not just using the number, this could change when opening other workbooks as well
' Similar with above when setting IRange
For Each rcell In Application.Workbooks(2).Worksheets(2).Range("G2:G" & IRange)
If Not rcell.Offset(0, -3).value = vbNullString And rcell.Text = vbNullString Then
If DeleteRng Is Nothing Then
Set DeleteRng = rcell
Else
Set DeleteRng = Union(DeleteRng, rcell)
End If
End If
Next rcell
Debug.Print DeleteRng.Address
DeleteRng.EntireRow.Delete
Application.ScreenUpdating = True
答案 1 :(得分:1)
您应该在G列上使用自动过滤来选择空白行,然后删除这些行,因此可以将所有那些行包含在G中的文本中。这将删除列G中有空白单元格的所有行。新建需要添加行,即虚拟行,以便它作为进一步选择和删除行的参考点
Dim lastrow As Long
lastrow = Range("A" & Rows.Count).End(xlUp).Row
' Add dummy row
Rows("1:1").Copy
Rows("2:2").Insert shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("2:2").Paste
CutCopyMode = False
'add filter
With ActiveSheet
.AutoFilterMode = False
.Range("A2:G2").AutoFilter field:=7, Criteria1:="=", Operator:=xlOr, Criteria2:="=" & ""
End With
'delete blank rows
Range("A2:G2").Select
Range(Selection, Selection.End(xlDown)).EntireRow.Delete
希望这会有所帮助:)