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
提取文本的该部分,然后再尝试比较它们。