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

时间:2017-03-31 08:52:02

标签: excel vba excel-vba foreach

报告生成一个如下所示的表格:

Fig1: Starting Data 格式继承自源数据,数据位于列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

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

我已经搜索了一下,但要么我没有完全理解答案,要么他们似乎给我同样的问题。

2 个答案:

答案 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

希望这会有所帮助:)