Excel 如果右值为零,则删除两列

Excel 如果右值为零,则删除两列,excel,vba,Excel,Vba,我有两个专栏。第一列包含代码,第二列包含空值(0) 如果第二列的值等于零,有没有办法删除这两列 我尝试使用它,但它只删除第二列中的零值 Sub ClearZero() For Each cell In Range("C6:D4005") If cell.Value = "0" Then cell.Clear Next End Sub 您可以这样做: Sub ClearZero() For Each cell In Ra

我有两个专栏。第一列包含代码,第二列包含空值(0)

如果第二列的值等于零,有没有办法删除这两列

我尝试使用它,但它只删除第二列中的零值

Sub ClearZero()
    For Each cell In Range("C6:D4005")
        If cell.Value = "0" Then cell.Clear
    Next
End Sub

您可以这样做:

Sub ClearZero()

For Each cell In Range("D6:D4005")
 If cell.Value = "0" Then 
    cell.Clear
    cell.offset(0, -1).Clear
 End If

 Next

End Sub

另一种无需循环即可实现所需的方法

逻辑:

  • 确定要使用的工作表
  • 删除任何自动过滤器
  • 检查列
    D
    是否有
    0
    位置
  • 在列
    D
    中。优于硬编码
    D4005
  • 构建你的范围
  • 基于
    0
    筛选列
    D
  • 确定过滤范围
  • 清除两列中的单元格而不循环
  • 代码:

    这就是你想要的吗?我已经对代码进行了注释,因此您理解代码应该不会有问题,但如果您这样做,只需问:)

    之前:

    之后:


    校正-对范围(“D6:D4005”)中的每个单元格使用
    ,因为否则,如果C列中的单元格计算结果为0,则将从B列中删除一个单元格。即使这种情况在这个数据集中永远不会发生,它也值得考虑,而且它将使循环长度减半。谢谢@SpencerBarnes,这一点很好。我已经更新了答案。
    Option Explicit
    
    Sub Sample()
        Dim ws As Worksheet
        Dim lRow As Long
        Dim FilteredRange As Range
        
        '~~> Set this to the relevant sheet
        Set ws = Sheet1
        
        With ws
            '~~> Remove any filters
            .AutoFilterMode = False
            
            '~~> Find last row
            lRow = .Range("D" & .Rows.Count).End(xlUp).Row
            
            '~~> Check if the column D has 0 anywhere
            If Application.WorksheetFunction.CountIf(.Range("D1:D" & lRow), 0) Then
               '~~> Filter column D on 0
               .Range("D1:D" & lRow).AutoFilter Field:=1, Criteria1:=0
                
                '~~> Identify your range
                Set FilteredRange = .AutoFilter.Range
                
                '~~> Clear the range in 1 go!
                FilteredRange.Offset(1, 0).Resize(FilteredRange.Rows.Count - 1).Clear
                FilteredRange.Offset(1, -1).Resize(FilteredRange.Rows.Count - 1).Clear
            End If
            
            '~~> Remove any filters
            .AutoFilterMode = False
        End With
    End Sub