如果一个范围内的单元格和它旁边的单元格都等于一个常量,如何在VBA中编写一个将删除一行的循环?

时间:2013-09-16 13:19:00

标签: excel vba excel-vba excel-2007

[这是在Excel 2007中]

换句话说,循环将循环遍历单列范围内的所有活动单元格(rngAddressName),如果范围中的单元格和直接位于其左侧的单元格包含字符串“#N / A” “,然后它将删除该行。

不幸的是,我没有尝试过任何实际效果。这是我最好的选择:

i = 1
For counter = 1 To rngSC2A.Rows.Count
Contents = rngSC2A.Cells(i).Value
If Contents = "#N/A" Then
If rngAddressName.Cells(i).CellOffset(0, -1).Value = "#N/A" Then
rngAddressName.Cells(i).EntireRow.Delete
Else
End If
Else
i = i + 1
End If
Next

但是这似乎没有找到满足条件的任何行(即使工作表中存在这样的行)。 我认为这可能与我正在查看Cell.Value这一事实有关,但我不确定。

2 个答案:

答案 0 :(得分:2)

您可以自动过滤范围,删除符合条件的所有行,然后关闭自动过滤器。这是一种比循环更有效的方法。

以下示例适用于Sheet1中的A列和B列。修改变量以引用工作簿中的范围和工作表。

Sub DeleteDoubleNA()
    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    Set rng = ws.Range("A1:B" & lastRow)

    ' filter and delete all but header row
    With rng
        .AutoFilter field:=1, Criteria1:="#N/A"
        .AutoFilter field:=2, Criteria1:="#N/A"
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    ' turn off the filters
    ws.AutoFilterMode = False
End Sub

答案 1 :(得分:0)

这是对@Jon Crowell发布的优秀答案的不同看法。

如果您使用Excel表,则可以使用表的ListObject来获取自动排除页眉和页脚行的数据范围。

这可以避免有时不正确的计算搜索最后一行。

您还希望清除数据上任何预先存在的过滤器,这样您就不会忽略任何行。

Dim myTable As Object
Set myTable = ActiveSheet.ListObjects(1) ' Works if worksheet contains only one table

' Clear pre-existing filters on the table
myTable.AutoFilter.ShowAllData

' Filter the table
With myTable.DataBodyRange
    .AutoFilter field:=1, Criteria1:="#N/A"
    .AutoFilter field:=2, Criteria1:="#N/A"
End With

' Delete visible cells in the filtered table
myTable.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete

' Clear filters on the table
myTable.AutoFilter.ShowAllData

(1)中的ListObjects(1)是工作表中的第一个(仅在我的情况下)表。 DataBodyRange指的是该表的数据范围,不包括页眉和页脚行。