Excel VBA:必须有一个更好的方法来使用循环删除基于单元格内容的行

报告会生成如下所示的表单:

图1:启动数据 格式是从源数据inheritance的,数据是A,D和G列,A合并ABC,D自己合并DEF和G.

我只想保留用蓝色突出显示的行。 我希望macros检查G:G的内容,如果Cell.Text =“”,然后wholerow.delete,否则保持独立。

唯一的问题是,当它删除第2行,然后第3行成为第2行,这意味着它不会删除它,因为它已经检查第2行。第4行现在成为第3行,这是下一个检查,和它看到文本在那里不删除,移动到第四行,删除它,第5行成为第4行,保持未选中,它移动到第6行(现在第5行),看到这是空白,删除它,但第7行现在成为第6行,不会被删除…等等。

我发现周围的唯一方法是使用GOTO重新启动循环,然后使用另一个GOTO早日退出循环。 我明白,这可能不是最优雅的解决scheme。

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 Range Range in declarations at the 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 

如果有人知道解决scheme,也可以为外行解释,我会很感激。 解决scheme需要是dynamic的,因为每次生成的原始纸张长度都不同,每次都有不同数量的空白和蓝色单元格。

我search了一下,但是我没有完全理解答案,或者他们似乎给了我同样的问题。

看看下面的内容,它的工作原理是从符合条件的单元格中构build一个范围,然后一次删除所有的单元格。 在进行testing时,请务必在原件的副本上进行testing,以确保结果符合预期,然后再将其永久保存

 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 

您应该在G列上使用自动筛选来select空白行,然后删除这些行,因此可以将所有那些行放在G中有文本的位置。这将删除列G具有空白单元格的所有行。 新行需要添加,即虚拟行,以便作为参考点进一步select和删除行

 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 

希望这可以帮助 :)