我正在开发一个 Excel 宏,以便在两列中的任何一列包含 #N/A 时从表中删除行。该表名为 TrialData,位于工作表 Trial Sheet 上。如果 Dog 或 Partner Dog 列包含 #N/A,则代码应删除整行。然而,该代码似乎只删除 A-C 列,而不是整行。谁能帮我弄清楚为什么会发生这种情况?
这是当前代码:
Sub DeleteRowsBasedOnNA()
Dim ws As Worksheet
Dim tbl As ListObject
Dim rng As Range
Dim cell As Range
Dim delRng As Range
' Set worksheet and table
Set ws = ThisWorkbook.Worksheets("Trial Sheet")
Set tbl = ws.ListObjects("TrialData") ' Ensure the table is named 'TrialData'
' Activate worksheet (optional)
ws.Activate
' Clear any existing filters
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
' Loop through each row in the table to find #N/A in columns 2 (Dog) and 3 (Partner Dog)
For Each cell In tbl.ListColumns(2).DataBodyRange
If IsError(cell.Value) Or IsError(cell.Offset(0, 1).Value) Then
If delRng Is Nothing Then
Set delRng = cell.EntireRow
Else
Set delRng = Union(delRng, cell.EntireRow)
End If
End If
Next cell
' Delete the identified rows
If Not delRng Is Nothing Then
delRng.Delete
End If
' Clear filters and reset AutoFilter mode
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
End Sub
请尝试下一个更简单的代码变体,不涉及任何迭代:
Sub deleteTableErrorRows()
Dim sh As Worksheet: Set sh = ThisWorkbook.Worksheets("Trial Sheet")
Dim tbl As ListObject: Set tbl = sh.ListObjects("TrialData")
Dim rngDel As Range
On Error Resume Next
Set rngDel = tbl.ListColumns(2).DataBodyRange.Resize(, 2).SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End Sub
您的代码应该可以工作。即使如此,不将所有行保留在
Union
范围内会更有效。您可以尝试仅将找到的单元格放入范围中,然后在末尾删除,如上所示rngDel.EntireRow.Delete
。