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

[这是在Excel 2007中]

换句话说,循环将循环遍历单列范围内的所有活动单元格(rngAddressName),如果范围中的单元格与其左侧的单元格直接包含string“#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 

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

您可以自动筛选您的范围,删除符合条件的行,然后closures自动filter。 这是比循环更有效的方法。

下面的示例在Sheet1中的列A和B上工作。 修改variables以引用工作簿中的范围和工作表。

 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 

对于@Jon Crowell发布的优秀答案,这是另外一回事。

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

这可以避免有时对最后一行进行不正确的计算search。

您还需要清除数据上的任何预先存在的filter,以便不会忽略任何行。

 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 

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