如何在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
指的是不包括页眉和页脚行的数据范围。