[这是在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这一事实有关,但我不确定。
答案 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
指的是该表的数据范围,不包括页眉和页脚行。