使用带有标题名称的自动过滤器从空白清除数据的宏

时间:2018-04-25 17:00:48

标签: vba excel-vba excel

我尝试使用宏来清除数据集,使用带有标题而不是列号的自动过滤方法删除空白单元格。如你看到的。此宏中没有单元格编号,也没有。一切都必须是自动的。这就是理念。

我假装90%的代码。我到了水源,但我不能喝。

我收到了最后一行的错误。

  

错误1004:Range类的AutoFilter方法失败。

以下是代码:

Sub DeleteBlank()

Dim WrkS As Worksheet, LsC As Range, FsC As Range, Tab As Range
Dim LsH As Range, RNbr As Long, CNbr As Long, HdrRow As Range, FltCol As Variant


Set WrkS = Worksheets("data")

' Last cells 

Set LsC = Cells(Cells.Find(what:="*", SearchOrder:=xlRows, _
  SearchDirection:=xlPrevious, LookIn:=xlValues).row, _
  Cells.Find(what:="*", SearchOrder:=xlByColumns, _
  SearchDirection:=xlPrevious, LookIn:=xlValues).Column)

' First cells 

Set FsC = Cells(Cells.Find(what:="*", after:=LastCell, SearchOrder:=xlRows, _
  SearchDirection:=xlNext, LookIn:=xlValues).row, _
  Cells.Find(what:="*", after:=LastCell, SearchOrder:=xlByColumns, _
  SearchDirection:=xlNext, LookIn:=xlValues).Column)

FsC.Activate

RNbr = ActiveCell.row

LsC.Activate

CNbr = ActiveCell.Column

'to set the last header 

Set LsH = Cells(RNbr, CNbr)

' to set the header Row

Set HdrRow = Range(FsC, LsH)

Set Tab = WrkS.UsedRAnge  

' to get the Column name in wich i have to delete all blank 

With HdrRow

FltCol = .Find(what:="name", LookAt:=xlWhole).Column

End With

' the problem is below 
' Error 1004: AutoFilter method of Range class failed.
WrkS.Tab.AutoFilter Field:=FltCol, Criteria1:="="

End Sub

2 个答案:

答案 0 :(得分:0)

你能试试吗?我无法声明一个名为" Tab"的变量。由于它已经被定义为WrKS上的范围,因此您不需要AF线上的工作表参考。此外,使用“查找最佳”检查时发现的值可以避免错误。你应该在任何地方使用工作表引用(或者在开头激活工作表)。

Sub DeleteBlank()

Dim WrkS As Worksheet, LsC As Range, FsC As Range, Tab1 As Range
Dim LsH As Range, RNbr As Long, CNbr As Long, HdrRow As Range, FltCol As Variant

Set WrkS = Worksheets("data")

Set LsC = Cells.Find(what:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues)
Set FsC = Cells.Find(what:="*", after:=LastCell, SearchOrder:=xlRows, SearchDirection:=xlNext, LookIn:=xlValues)

If Not FsC Is Nothing Then
    If Not LsC Is Nothing Then
        RNbr = FsC.Row
        CNbr = LsC.Column
        Set LsH = Cells(RNbr, CNbr)
        Set HdrRow = Range(FsC, LsH)
        Set Tab1 = WrkS.UsedRange
        FltCol = HdrRow.Find(what:="name", LookAt:=xlWhole).Column
        Tab1.AutoFilter Field:=FltCol, Criteria1:="="
    End If
End If

End Sub

答案 1 :(得分:0)

也许你可以将它缩短到这个

Option Explicit

Sub DeleteBlank()

    With Worksheets("data").UsedRange ' reference relevant worksheet "usedrange"
        With Intersect(.Rows(1).Find(what:="name", LookAt:=xlWhole).EntireColumn, .Cells) 'reference its column whose top cell content is "name"
            .AutoFilter Field:=1, Criteria1:="=" 'filter referenced column blank cells
            If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete ' if any filtered cells other than first row (header) then delete their entire row
        End With
        .Parent.AutoFilterMode = False
    End With

End Sub