Excel 未删除行

Excel 未删除行,excel,vba,Excel,Vba,下面的代码没有按预期删除行。有人能告诉我有什么问题吗 带有工作表(“警察确认警报”) 对于rw=.Cells(.Rows.Count,“A”).End(xlUp).Row到2步骤-1 选择案例UCase(.Cells(rw,“A”)。值2) 案例“Punna”,“Juleas,” .Rows(rw).EntireRow.Delete i=i-1 结束选择 下一个rw 以 当您使用UCase查找大写字母的文本时,需要匹配大写字母值 改变 Case "Punna,", &quo

下面的代码没有按预期删除行。有人能告诉我有什么问题吗

带有工作表(“警察确认警报”)
对于rw=.Cells(.Rows.Count,“A”).End(xlUp).Row到2步骤-1
选择案例UCase(.Cells(rw,“A”)。值2)
案例“Punna”,“Juleas,”
.Rows(rw).EntireRow.Delete
i=i-1
结束选择
下一个rw
以

当您使用
UCase
查找大写字母的文本时,需要匹配大写字母值

改变

Case "Punna,", "Juleas,"

另外,由于您希望匹配以这些单词开头的单元格,因此可以使用
LIKE
,如下所示

With Worksheets("Alerts Ack By Cops")
    For rw = .Cells(.Rows.Count, "A").End(xlUp).Row To 2 Step -1
        If UCase(.Cells(rw, "A").Value2) Like "PUNNA,*" Or _
           UCase(.Cells(rw, "A").Value2) Like "JULEAS,*" Then
                .Rows(rw).EntireRow.Delete
        End If
    Next rw
End With
另外,使用自动过滤器会更快。你可能想看看。在这里,循环变成了
“=”&strearch&“*”
,而不是
“=*”&strearch&“*”


如果您仍然希望使用循环删除行,那么您可能希望看到
Union
这样做的方式,它将大幅提高大量行的速度。

当您使用
UCase
查找大写字母的文本时,您需要匹配大写字母值

改变

Case "Punna,", "Juleas,"

另外,由于您希望匹配以这些单词开头的单元格,因此可以使用
LIKE
,如下所示

With Worksheets("Alerts Ack By Cops")
    For rw = .Cells(.Rows.Count, "A").End(xlUp).Row To 2 Step -1
        If UCase(.Cells(rw, "A").Value2) Like "PUNNA,*" Or _
           UCase(.Cells(rw, "A").Value2) Like "JULEAS,*" Then
                .Rows(rw).EntireRow.Delete
        End If
    Next rw
End With
另外,使用自动过滤器会更快。你可能想看看。在这里,循环变成了
“=”&strearch&“*”
,而不是
“=*”&strearch&“*”

如果您仍然希望使用循环删除行,那么您可能希望看到
Union
这样做的方式,它将在大量行上大幅提高速度。

使用
AutoFilter
删除行
  • 第一个解决方案说明了两个标准的使用
  • 第二个解决方案演示了如何对数组执行相同的操作。不幸的是,
    AutoFilter
    只能有两个包含通配符的条件。如果添加更多,则不会过滤任何内容
  • 第三种解决方案说明了一种变通方法,允许两个以上的条件包含通配符
代码

Option Explicit

Sub deleteTwoCriteria()
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            .AutoFilter _
                Field:=1, _
                Criteria1:="Punna,*", _
                Operator:=xlOr, _
                Criteria2:="Juleas,*"
            With .Resize(.Rows.Count - 1).Offset(1)
                On Error Resume Next
                .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                On Error GoTo 0
            End With
        End With
        .AutoFilterMode = False
    End With
    Application.ScreenUpdating = True
End Sub

Sub deleteArray()
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            .AutoFilter _
                Field:=1, _
                Criteria1:=Array("Punna,*", "Juleas,*"), _
                Operator:=xlFilterValues
            With .Resize(.Rows.Count - 1).Offset(1)
                On Error Resume Next
                .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                On Error GoTo 0
            End With
        End With
        .AutoFilterMode = False
    End With
    Application.ScreenUpdating = True
End Sub

Sub deleteList()
    Const CriteriaList As String = "Punna,*|Juleas,*|R2*"
    Dim Criteria() As String: Criteria = Split(CriteriaList, "|")
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            If .Cells.Count > 1 Then
                Dim Data As Variant: Data = .Value
                Dim dict As Object
                Set dict = CreateObject("Scripting.Dictionary")
                dict.CompareMode = vbTextCompare
                Dim i As Long
                Dim n As Long
                For i = 2 To UBound(Data, 1)
                    For n = 0 To UBound(Criteria)
                        If LCase(Data(i, 1)) Like LCase(Criteria(n)) Then
                            dict(Data(i, 1)) = Empty
                            Exit For
                        End If
                    Next n
                Next i
                If dict.Count > 0 Then
                    .AutoFilter _
                        Field:=1, _
                        Criteria1:=dict.Keys, _
                        Operator:=xlFilterValues
                    With .Resize(.Rows.Count - 1).Offset(1)
                        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                    End With
                    .Worksheet.AutoFilterMode = False
                End If
            End If
        End With
    End With
    Application.ScreenUpdating = True
End Sub
使用
AutoFilter
  • 第一个解决方案说明了两个标准的使用
  • 第二个解决方案演示了如何对数组执行相同的操作。不幸的是,
    AutoFilter
    只能有两个包含通配符的条件。如果添加更多,则不会过滤任何内容
  • 第三种解决方案说明了一种变通方法,允许两个以上的条件包含通配符
代码

Option Explicit

Sub deleteTwoCriteria()
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            .AutoFilter _
                Field:=1, _
                Criteria1:="Punna,*", _
                Operator:=xlOr, _
                Criteria2:="Juleas,*"
            With .Resize(.Rows.Count - 1).Offset(1)
                On Error Resume Next
                .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                On Error GoTo 0
            End With
        End With
        .AutoFilterMode = False
    End With
    Application.ScreenUpdating = True
End Sub

Sub deleteArray()
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            .AutoFilter _
                Field:=1, _
                Criteria1:=Array("Punna,*", "Juleas,*"), _
                Operator:=xlFilterValues
            With .Resize(.Rows.Count - 1).Offset(1)
                On Error Resume Next
                .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                On Error GoTo 0
            End With
        End With
        .AutoFilterMode = False
    End With
    Application.ScreenUpdating = True
End Sub

Sub deleteList()
    Const CriteriaList As String = "Punna,*|Juleas,*|R2*"
    Dim Criteria() As String: Criteria = Split(CriteriaList, "|")
    Application.ScreenUpdating = False
    With Worksheets("Alerts Ack By Cops")
        .AutoFilterMode = False
        With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
            If .Cells.Count > 1 Then
                Dim Data As Variant: Data = .Value
                Dim dict As Object
                Set dict = CreateObject("Scripting.Dictionary")
                dict.CompareMode = vbTextCompare
                Dim i As Long
                Dim n As Long
                For i = 2 To UBound(Data, 1)
                    For n = 0 To UBound(Criteria)
                        If LCase(Data(i, 1)) Like LCase(Criteria(n)) Then
                            dict(Data(i, 1)) = Empty
                            Exit For
                        End If
                    Next n
                Next i
                If dict.Count > 0 Then
                    .AutoFilter _
                        Field:=1, _
                        Criteria1:=dict.Keys, _
                        Operator:=xlFilterValues
                    With .Resize(.Rows.Count - 1).Offset(1)
                        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
                    End With
                    .Worksheet.AutoFilterMode = False
                End If
            End If
        End With
    End With
    Application.ScreenUpdating = True
End Sub
1.问题的标题不是用来提问的。使用柱体。还要清楚你在问什么,并缩进你的代码2。需要进行适当的标记,以便能够接触到正确的受众。:)欢迎来到stackoverflow<代码>“Punna”和
“Juleas”
只是他们单元格文本的一部分。您需要使用
Left
提取文本的该部分,然后再尝试进行比较。1。问题的标题不是用来提问的。使用柱体。还要清楚你在问什么,并缩进你的代码2。需要进行适当的标记,以便能够接触到正确的受众。:)欢迎来到stackoverflow<代码>“Punna”和
“Juleas”
只是他们单元格文本的一部分。您需要使用
Left
提取文本的该部分,然后再尝试比较它们。