如果单元格包含值VBA,则无法删除

时间:2019-03-03 21:36:04

标签: excel vba

我有一个文件,其中A列(1500)中有一堆单元格,如下所示:

Perfect Imperfection;"Kevin Gates";"Luca Brasi 2: Gangsta Grillz";1

Perfect Imperfection;"Kevin Gates";"Luca Brasi 2: Gangsta Grillz";0

我正在尝试删除以;1结尾的单元格

请注意,某些歌曲标题中包含1,而另一些歌曲则采用以下形式:
Perfect Imperfection;;;1

我正在使用以下代码,这些代码来自我稍作编辑的另一个Stack Overflow帖子:

Sub DeleteRowsWithX()

maxRow = ActiveSheet.UsedRange.Rows.Count
MsgBox (maxRow)
For i = 1 To maxRow
    Do While (StrComp(ActiveSheet.Cells(i, 1).Text, ";1", vbTextCompare) = 0)
        Rows(i).Select
        Selection.Delete Shift:=xlUp
        MsgBox ("Deleted")
   Loop
Next

End Sub

如果有帮助,请参见以下文件示例:

Perfect Imperfection;"Kevin Gates";"Luca Brasi 2: Gangsta Grillz";1
Perfect Strangers;"Lil Wayne";"Tha Carter V";1
Perplexing Pegasus;"Rae Sremmurd";;1
Phone Numbers Wiz Khalifa;;;0
Piano Man;"Billy Joel";;1
Picasso Baby Jay Z;;;0
Pick Up the Phone ft Young Thug Travis Scott;;;0
Picture;"Kid Rock";;1
Pillowtalk  Conor Maynard;;;1
Pimp Juice;Nelly;Nellyville;1
Pinball Wizard;"The Who";;1
Pink Toes  Childish Gambino;;;1

应如下所示:

Phone Numbers Wiz Khalifa;;;0
Picasso Baby Jay Z;;;0
Pick Up the Phone ft Young Thug Travis Scott;;;0

但是,什么也没有删除。有人可以建议吗?注意-不需要在VBA中完成此操作,我只想删除以1结尾的行

3 个答案:

答案 0 :(得分:0)

要求:删除第1列中以“; 1”结尾的整行值

对于这种要求,建议使用AutoFilterSpecialCells一次删除所有目标行。

尝试一下:

 Sub AutoFilter_To_DeleteRows()
    With ActiveSheet
        Application.Goto .Cells(1), 1
        Rem Add a temporary header to avoid indiscriminate deletion of the first row.
        .Cells(1).EntireRow.Insert
        .Cells(1).Value2 = "Temporary Header"
        Rem Filter values ending with ";1"
        .Columns(1).AutoFilter Field:=1, Criteria1:="=*;1"
        Rem Delete all resulting rows
        .Columns(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    End Sub

答案 1 :(得分:-1)

将答案保持在您编写的代码附近。

您需要从列表的底部到顶部循环。这样,当删除行时,您不会跳过行。这可以在您的 For 循环中完成,方法是从列表的底部开始,然后使用步骤-1 返回到第一行。

功能可用于测试单元格值的最后两个字符,以查看它们是否与; 1 匹配。

可以删除执行时间

MsgBox 已得到扩展,可以在测试时提供更多详细信息。一旦您对代码的运行方式感到满意,便可以将它们注释掉。

Sub DeleteRowsWithX()

maxRow = ActiveSheet.UsedRange.Rows.Count
MsgBox "No. of Rows: " & maxRow

    For i = maxRow To 1 Step -1
        ValOfCell = ActiveSheet.Cells(i, 1).Value2
            If Right(ValOfCell, 2) = ";1" Then
                Rows(i).Delete Shift:=xlUp
                MsgBox "Row: " & i & vbCrLf & "Value: " & ValOfCell & vbCrLf & "has been deleted."
            End If
    Next

End Sub

答案 2 :(得分:-2)

Jerry,我无法让 StrComp 以我想要的方式工作,所以我使用 Mid Len 来完成所需的工作。这将起作用,因为所有歌曲名称均以“;?”结尾。另外,我没有添加代码,但请考虑做所有不使用 Select 方法的事情-这会导致复杂化。

Sub DeleteRowsWithX()

Dim maxrow As Integer
Dim i As Integer
maxrow = ActiveSheet.UsedRange.Rows.Count
For i = 1 To maxrow
    Do While Mid(Cells(i, 1).Text, Len(Cells(i, 1).Text) - 1, 2) = ";1"
        Rows(i).Select
        Selection.Delete Shift:=xlUp
        MsgBox ("Deleted")
   Loop
Next

结束子