1

[这是在 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 的事实有关,但我不确定。

4

2 回答 2

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
于 2013-09-16T13:48:15.390 回答
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)in是工作表中的ListObjects(1)第一个(仅在我的情况下)表。 DataBodyRange指该表的数据范围,不包括页眉和页脚行。

于 2016-12-21T23:08:49.973 回答