【问题标题】:Delete entire rows when cells in multiple columns are blank or 0当多列中的单元格为空白或 0 时删除整行
【发布时间】:2018-04-14 08:12:11
【问题描述】:

我正在尝试编写一个基本上查看第 13-33 行的代码,如果 B-M 列中的单元格全部为空白且 A 列不为空白,则删除整行。

我在下面编写的第一个代码仅在 B 列中的单元格为空白时删除整行,但我需要 B-M 中的所有单元格为空白才能删除整行。

Sub scheduleA()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Sheets("Schedule A Template").Select

Dim RowstoDelete As Long
x = 33
For RowstoDelete = Cells(x, 2).End(xlUp).Row To 13 Step -1

If (Cells(RowstoDelete, 2).Value = "0") And (Cells(RowstoDelete, 1).Value <> "") Then
        Rows(RowstoDelete).Delete Shift:=xlUp
    End If


Next RowstoDelete
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

我也尝试在下面的代码中以不同的方式编写它,但无法达到预期的结果。

Sub DeleteRows()


Dim i As Integer

For i = 33 To 13 Step -1
  If WorksheetFunction.CountA(Range("B" & i, "M" & i)) = 0 And WorksheetFunction.CountA(Range("A" & i)) <> "" Then
     Rows(i).EntireRow.Delete
    End If

Next i

End Sub

请帮忙!

【问题讨论】:

  • 而不是 And WorksheetFunction.CountA(Range("A" &amp; i)) &lt;&gt; "" 只是做 And Range("A" &amp; i) &lt;&gt; ""

标签: vba excel


【解决方案1】:

您删除行的条件是:A 列不为空,B 到 M 列为空。那么这样的事情应该可以解决问题:

Sub ScheduleA()
    On Error GoTo errHandler

    Const TOP_ROW As Long = 13
    Const BOTTOM_ROW As Long = 33

    Dim rowIndex As Long

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    With ThisWorkbook.Worksheets("Schedule A Template")
        For rowIndex = .Cells(BOTTOM_ROW, "A").End(xlUp).Row To TOP_ROW Step -1
            If Not IsEmpty(.Cells(rowIndex, "A").Value2) Then '...column A is not blank.
                If Application.WorksheetFunction.CountA(.Range(.Cells(rowIndex, "B"), .Cells(rowIndex, "M"))) = 0 Then '...all cells on row rowIndex from columns B to M are blank.
                    .Rows(rowIndex).Delete Shift:=xlUp
                End If
            End If
        Next
    End With

Cleanup:
    On Error Resume Next
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Exit Sub

errHandler:
    MsgBox Err.Description, vbExclamation + vbOKOnly, "Error"
    Resume Cleanup
End Sub

注意.Select 不见了;你几乎不需要选择任何东西来完成工作。不依赖选择将使您的代码更加健壮。在上面的代码中,With 块告诉其中的代码在表达式以句点开头时引用目标工作表,例如 .Cells

此外,在关闭 ScreenUpdatingCalculation 时,系统地包括错误处理以重新打开它们。这样,如果出现问题,您的代码不会使 Excel 处于不良状态。

最后,您可以在工作表的(名称)属性下的“属性”窗口中,直接使用它们的代码名(从 VBA 编辑器中看到)来引用它们,而不是通过其选项卡的名称来引用它们(按 Ctrl+R 显示 Project Explorer,单击 Microsoft Excel Objects 节点下的工作表,然后按 F4 显示 Properties 窗口)。您可以更改此值;我通常会将其更改为 shtScheduleATemplate。然后,With 行可以重写为:

With shtScheduleATemplate

...即使您从 Excel 更改了工作表的名称,它仍然有效。

编辑:在您的问题代码中,您在确定在哪个底行索引处开始循环时检查 B 列。但是,这样做可能会遗漏一些应该删除的行。我已将答案更改为在 A 列中进行检查:

For rowIndex = .Cells(BOTTOM_ROW, "A").End(xlUp).Row To TOP_ROW Step -1

【讨论】:

  • 感谢您提供符合父工作表的解决方案!
  • @Excelosaurus 感谢您的帮助,但是当我运行此宏时,我收到一条错误消息..但是出现的对话框是空白的并且什么也没说。知道为什么会这样
  • 我的错。在 Cleanup 部分的末尾添加 Exit Sub。我已经编辑了我的答案。
  • @Excelosaurus 感谢您的回复。所以这仍然没有删除行......但可能是因为这些单元格是基于公式的吗?例如,B-M 行中的单元格从另一张表中提取。因此,如果它在另一张纸上为“0”,则在这张纸上它将为 0,我想删除它们。现在,此代码删除所有在 B-M 列中包含空白且基于非公式的单元格的行。
  • CountA 会计算包含公式的单元格。只需修改最里面的If 以满足您的需要。如果值要么全为空白,要么全为正,要么全为负,您可以使用Sum(...) = 0 作为删除条件(如果混合有正负,您将面临总和为零的风险)。如果条件比较复杂,可以添加一个最内层循环来扫描行的单元格。您还可以在工作表中放置一个公式,例如在 N 列,该公式将使用您在 VBA 中检查的值标记要删除的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多