动态 VBA 根据不包含部分文本的单元格删除
Dynamic VBA Delete based on cell not containing Part of a text
正在尝试对 C 列中不包含 CY* 的值执行动态行删除。我有以下代码,但不断收到 If Block 错误。任何人都知道如何使这项工作?
Dim ContainWord As String
On Error Resume Next
Range("C2:C" & lrow).Select
ContainWord = "CY*"
If Not Cell.Find(ContainWord) Then ActiveCell.EntireRow.Delete.Row
End If
lrow 在我的代码前面定义为:
昏暗的行一样长
lrow = 范围("A" & Rows.Count).End(xlUp).Row
您可以使用自动筛选器,然后删除可见单元格
Option Explicit
Public Sub test()
Dim lRow As Long
With ActiveSheet
.AutoFilterMode = False
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
With .Range("A1:Y" & lRow)
.AutoFilter Field:=3, Criteria1:="<>CY*"
On Error Resume Next
.Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).EntireRow.Delete
On Error GoTo 0
End With
.AutoFilterMode = False
End With
End Sub
据我所知,找到单元格并不意味着它是活动单元格。
对于 sheet
中的任何单元格
Public Sub Test()
Sheet1.Cells.Find("CY*").EntireRow.Delete
End Sub
您的案例(只需检查 C 列到第 lrow 行)
Public Sub Test()
ActiveSheet.Range("C2:C" & lrow).Find("CY*").EntireRow.Delete
End Sub
这应该适合小型数据集。如果您使用更大的设置,自动过滤器会更快。
With ("C2:C" & 1row)
Do
Set rngFind = .Find(What:="CY*", After:=.Cells(1, 1), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not rngFind Is Nothing Then Exit Do
rngFind.EntireRow.Delete
Loop
End With
这是我刚刚测试过的另一个解决方案。它适用于多张纸,可根据您的需要进行修改。
Sub FindCY()
Dim WS As Worksheet
Dim Rng1 As Range
Dim cell As Range
Dim CYFind As Variant
CYFind = "CY*"
On Error Resume Next
For Each WS In ActiveWorkbook.Worksheets
Set Rng1 = WS.Range("C1").EntireColumn
For Each cell In Rng1
If cell.Value = CYFind Then
Rng1.EntireRow.Delete
End If
Next cell
Next WS
End Sub
正在尝试对 C 列中不包含 CY* 的值执行动态行删除。我有以下代码,但不断收到 If Block 错误。任何人都知道如何使这项工作?
Dim ContainWord As String
On Error Resume Next
Range("C2:C" & lrow).Select
ContainWord = "CY*"
If Not Cell.Find(ContainWord) Then ActiveCell.EntireRow.Delete.Row
End If
lrow 在我的代码前面定义为: 昏暗的行一样长 lrow = 范围("A" & Rows.Count).End(xlUp).Row
您可以使用自动筛选器,然后删除可见单元格
Option Explicit
Public Sub test()
Dim lRow As Long
With ActiveSheet
.AutoFilterMode = False
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
With .Range("A1:Y" & lRow)
.AutoFilter Field:=3, Criteria1:="<>CY*"
On Error Resume Next
.Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).SpecialCells(xlCellTypeVisible).EntireRow.Delete
On Error GoTo 0
End With
.AutoFilterMode = False
End With
End Sub
据我所知,找到单元格并不意味着它是活动单元格。
对于 sheet
中的任何单元格Public Sub Test()
Sheet1.Cells.Find("CY*").EntireRow.Delete
End Sub
您的案例(只需检查 C 列到第 lrow 行)
Public Sub Test()
ActiveSheet.Range("C2:C" & lrow).Find("CY*").EntireRow.Delete
End Sub
这应该适合小型数据集。如果您使用更大的设置,自动过滤器会更快。
With ("C2:C" & 1row)
Do
Set rngFind = .Find(What:="CY*", After:=.Cells(1, 1), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not rngFind Is Nothing Then Exit Do
rngFind.EntireRow.Delete
Loop
End With
这是我刚刚测试过的另一个解决方案。它适用于多张纸,可根据您的需要进行修改。
Sub FindCY()
Dim WS As Worksheet
Dim Rng1 As Range
Dim cell As Range
Dim CYFind As Variant
CYFind = "CY*"
On Error Resume Next
For Each WS In ActiveWorkbook.Worksheets
Set Rng1 = WS.Range("C1").EntireColumn
For Each cell In Rng1
If cell.Value = CYFind Then
Rng1.EntireRow.Delete
End If
Next cell
Next WS
End Sub