根据多个值删除整行
Delete entire rows according to many values
我有一个很长的 excel 文件,我需要从中删除列 A 中包含某些值的整行。
该列包含从 [PAR001 到 PAR0023247] 的值,我需要删除属于 [PAR002537 到 PAR005214] 的值
哪种方法最快?
尝试在范围内搜索“PAR”并使用 val() 方法比较整数的不同长度,而不必搜索可能是右侧整数一部分的“0”。
倒数整个范围很重要。此外,如果您在相关列表上方有任何以“PAR”开头的单元格,则可能存在问题。
这对我有用。希望对你有用。
Public Sub DeleteRows()
Dim arr As Range
Dim tester As String
Dim NumElements As Long
Set arr = Range(Range("A1"), Cells(Rows.Count, 1).End(xlUp))
NumElements = arr.Cells.Count
For i = NumElements To 1 Step -1
If Left(arr(i), 3) = "PAR" Then
tester = Right(arr(i), Len(arr(i)) - 3)
If Val(tester) >= 2537 And Val(tester) <= 5214 Then
Cells(i, 1).EntireRow.Delete
End If
End If
Next i
End Sub
说实话,我觉得@haplo76 的回答还不错
如果您的数据按这些 PARxxxx 值升序排序,我的回答将仅有效。如果没有,则使用@haplo76 answer
此解决方案的唯一优点是您无需循环,也无需在一行代码中删除所有行。
在我的测试中,我删除了行 [PAR03 到 PAR010]
Sub TEST()
Dim i_row As Long
Dim e_row As Long
'In e_row you want to match the value AFTER the last one you want to to delete
' so if you want to delete from PAR003 to PAR010
' i_row will search for PAR003 but e-row need to search for PAR011!!!
With Application.WorksheetFunction
i_row = .Match("PAR003", Range("A:A"), 0)
e_row = .Match("PAR011", Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
执行代码后我得到:
另一个优点是您可以轻松地将此子程序转换为通用子程序,仅要求删除 PARxx 值:
Sub TEST()
DELETE_ROWS "PAR003", "PAR011" 'this will delete [PAR003 to PAR010]
End Sub
Sub DELETE_ROWS(ByVal ini_val As String, end_val As String)
Dim i_row As Long
Dim e_row As Long
With Application.WorksheetFunction
i_row = .Match(ini_val, Range("A:A"), 0)
e_row = .Match(end_val, Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
但正如我一开始所说,只有当您的数据按 A 列升序排序时,这才有效。此外,如果您键入未找到的“PAR00xx”值,则会引发错误。
我有一个很长的 excel 文件,我需要从中删除列 A 中包含某些值的整行。 该列包含从 [PAR001 到 PAR0023247] 的值,我需要删除属于 [PAR002537 到 PAR005214] 的值 哪种方法最快?
尝试在范围内搜索“PAR”并使用 val() 方法比较整数的不同长度,而不必搜索可能是右侧整数一部分的“0”。
倒数整个范围很重要。此外,如果您在相关列表上方有任何以“PAR”开头的单元格,则可能存在问题。
这对我有用。希望对你有用。
Public Sub DeleteRows()
Dim arr As Range
Dim tester As String
Dim NumElements As Long
Set arr = Range(Range("A1"), Cells(Rows.Count, 1).End(xlUp))
NumElements = arr.Cells.Count
For i = NumElements To 1 Step -1
If Left(arr(i), 3) = "PAR" Then
tester = Right(arr(i), Len(arr(i)) - 3)
If Val(tester) >= 2537 And Val(tester) <= 5214 Then
Cells(i, 1).EntireRow.Delete
End If
End If
Next i
End Sub
说实话,我觉得@haplo76 的回答还不错
如果您的数据按这些 PARxxxx 值升序排序,我的回答将仅有效。如果没有,则使用@haplo76 answer
此解决方案的唯一优点是您无需循环,也无需在一行代码中删除所有行。
在我的测试中,我删除了行 [PAR03 到 PAR010]
Sub TEST()
Dim i_row As Long
Dim e_row As Long
'In e_row you want to match the value AFTER the last one you want to to delete
' so if you want to delete from PAR003 to PAR010
' i_row will search for PAR003 but e-row need to search for PAR011!!!
With Application.WorksheetFunction
i_row = .Match("PAR003", Range("A:A"), 0)
e_row = .Match("PAR011", Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
执行代码后我得到:
另一个优点是您可以轻松地将此子程序转换为通用子程序,仅要求删除 PARxx 值:
Sub TEST()
DELETE_ROWS "PAR003", "PAR011" 'this will delete [PAR003 to PAR010]
End Sub
Sub DELETE_ROWS(ByVal ini_val As String, end_val As String)
Dim i_row As Long
Dim e_row As Long
With Application.WorksheetFunction
i_row = .Match(ini_val, Range("A:A"), 0)
e_row = .Match(end_val, Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
但正如我一开始所说,只有当您的数据按 A 列升序排序时,这才有效。此外,如果您键入未找到的“PAR00xx”值,则会引发错误。