【问题标题】:VBA Delete all rows with blank space and delete rows will cell that contains stringVBA删除所有带有空格的行并删除行将包含字符串的单元格
【发布时间】:2021-05-12 08:49:33
【问题描述】:

所有,我有一些 VBA 可以删除 C 列为空白的任何行。它还会删除 A 列以“名称”或“条形名称”开头的行。问题是当我一起运行这些时,它只运行前两个步骤。此外,它实际上并没有关闭它正在使用的过滤,而是在删除数据后过滤工作表。

知道如何让它作为一个步骤运行,这似乎只能识别第一张工作表的 VBA?

Sub WB()
With ThisWorkbook.Worksheets("Geez")
Application.ScreenUpdating = False
Columns("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True
End With
End Sub

Sub WC()
With ThisWorkbook.Worksheets("Geez")
    .AutoFilterMode = False
    With Range("a1", Range("a" & Rows.Count).End(xlUp))
        .AutoFilter 1, "*Bar Name*"
        On Error Resume Next
        .Offset(1).SpecialCells(12).EntireRow.Delete
    End With
    .AutoFilterMode = False
End With
End Sub

Sub WE()
With ThisWorkbook.Worksheets("Class")
Application.ScreenUpdating = False
Columns("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Application.ScreenUpdating = True
End With
End Sub


Sub WF()
With ThisWorkbook.Worksheets("Class")
    .AutoFilterMode = False
    With Range("a1", Range("a" & Rows.Count).End(xlUp))
        .AutoFilter 1, "*Name*"
        On Error Resume Next
        .Offset(1).SpecialCells(12).EntireRow.Delete
    End With
    .AutoFilterMode = False
End With
End Sub

我尝试使用以下命令全部运行并分配给一个按钮,但它仅在前两个步骤中运行。它还会过滤第一张纸,但实际上并没有删除过滤器。

Sub Run1()
Call WB
Call WC
Call WE
Call WF
End Sub

【问题讨论】:

  • 一方面,您在范围(With)前面省略了很多点。

标签: excel vba error-handling


【解决方案1】:

删除空并过滤

  • 如果您为空单元格执行一个过程,另一个过程用于过滤一个值,您可以轻松地在另一个过程中使用它们。
  • 注意所有出现的ws:如果您打算使用With statement,它们会显示您必须放置点的位置(.):通常在RowsColumns、@前面987654326@, Cells...
  • 使用On Error Resume Next(延迟错误处理(忽略错误))时,您必须使用“关闭”On Error Goto 0(关闭错误处理)。
  • Resize 可以轻松处理定义范围时的“轻微错误”:您不一定要删除范围下方的行。
  • 使用12 而不是xlCellTypeVisible 会不必要地降低代码的可读性。

守则

Option Explicit

Sub doAll()
    
    Application.ScreenUpdating = False
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets("Geez")
    doEmpty ws
    doFilter ws, "*Bar Name*"
    
    Set ws = ThisWorkbook.Worksheets("Class")
    doEmpty ws
    doFilter ws, "*Name*"
    
    Application.ScreenUpdating = True

End Sub

Sub doEmpty(ws As Worksheet)
    ws.AutoFilterMode = False
    ws.Columns("C:C").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Sub doFilter(ws As Worksheet, ByVal FilterPattern As String)
    ws.AutoFilterMode = False
    With ws.Range("A1", ws.Range("A" & ws.Rows.Count).End(xlUp))
        .AutoFilter 1, FilterPattern
        On Error Resume Next
        .Resize(.Rows.Count - 1).Offset(1) _
            .SpecialCells(xlCellTypeVisible).EntireRow.Delete
        On Error GoTo 0
    End With
    ws.AutoFilterMode = False
End Sub

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多