VBA-根据列值删除行

时间:2019-01-12 21:13:57

标签: excel vba command delete-row

我正在尝试为ActiveX控件按钮编写一小段代码。我在VBA上不是最好的,并且只能在空闲时间这样做,所以请您留心一点...我有一个“主库存”电子表格。列“ B”到“ N”包含有关库存的数据。发货后,在“ N”列中用“ Y”表示(代表“是”)。

  1. 我希望我的Activex控件按钮仅删除列“ N” =“ Y”的行(B3:N98)。
  2. 我不希望删除格式或公式-只有值。
  3. 我希望在删除行之后将数据压缩并推到列表顶部。

我在#2上取得了成功,但在#1或#3上却没有。我正在删除所有行,但似乎无法正确显示“ If”语句以仅识别那些“ Y”值。

非常感谢您的帮助。

Private Sub CommandButton1_Click()
    On Error Resume Next
    For I = 3 To 498
        If Range(I, "N").Text = "Y" Then
            Range("B3:N27").SpecialCells(xlCellTypeConstants).ClearContents
        End If
    Next I
End Sub

2 个答案:

答案 0 :(得分:0)

删除行时,您需要从底部开始并向上进行操作,以使其余行号保持不变。列“ N”为14,因此您可以使用这样的逻辑。

Sub DeleteRows()
Dim I As Long
For I = 498 To 3 Step -1
If Cells(I, 14).Value = "Y" Then
Rows(I).EntireRow.Delete
End If
Next I
End Sub

答案 1 :(得分:0)

一种更快的方法是创建一个范围对象,以保存标记为删除的所有行,然后在最后一次全部删除。在Excel中,在循环中一一删除行可能会非常缓慢,特别是随着行数的增加而增加。

尝试一下:

Public Sub DeleteRowsWithRange()

Dim rngLoop As Range
Dim rngMyRange As Range

    For Each rngLoop In Columns("N").Cells

    If rngLoop.Value = "" Then ' This is your exist clause. You can change this depending on your worksheet structure.
        Exit For  
    ElseIf rngLoop.Value = "N" Then
        If rngMyRange Is Nothing Then
            Set rngMyRange = rngLoop.EntireRow
        Else
            Set rngMyRange = Union(rngMyRange, rngLoop.EntireRow)
        End If
    End If

    Next rngLoop

    rngMyRange.Delete xlShiftUp

    Set rngLoop = Nothing
    Set rngMyRange = Nothing

End Sub