VBA自动筛选-删除可见的单元格(似乎代码应该可以,但不能)

时间:2019-02-19 11:31:09

标签: excel vba

使用VBA删除某些行时遇到麻烦。

我在A到K列的行中组织了数据。在K列中有一个计数器。当它超过1时,需要删除整行。我设置以下代码;并期望它对超过1的任何内容在K列上进行过滤。如果发现多于1行(行1是标题),它将删除可见的任何内容,否则只会从过滤器中删除条件。

但是,第一个消息框返回的值为2900(正确),然后第二个消息框返回的值为1,我不知道为什么。因此,K列超过1(大约2,000)的行都不会被删除。

可见行在宏的开头定义为Long。

        With MySheet

        'Find new lastrow
        lRowDbMsNew = .Cells.Find(What:="*", _
            After:=Range("A1"), _
            LookAt:=xlPart, _
            LookIn:=xlFormulas, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlPrevious, _
            MatchCase:=False).ROW

        .Range("A:K").Calculate

        MsgBox ("The last row in the data is " & lRowDbMsNew)

        .Range("A1:A" & lRowDbMsNew).AutoFilter Field:=11, Criteria1:=">1"

            VisibleRows = .Range("A1:A" & lRowDbMsNew).SpecialCells(xlCellTypeVisible).Rows.Count

            MsgBox ("Number of visible rows: " & VisibleRows)

            If VisibleRows > 1 Then

                .Range("A2:A" & lRowDbMsNew).SpecialCells(xlCellTypeVisible).EntireRow.Delete
                .Range("A1:K" & lRowDbMsNew).AutoFilter Field:=11

                Else

                .Range("A1:K" & lRowDbMsNew).AutoFilter Field:=11

            End If

        End With

1 个答案:

答案 0 :(得分:1)

更改计算可见行数的行

VisibleRows = .Range("A1:A" & lRowDbMsNew).SpecialCells(xlCellTypeVisible).Count

(删除.rows)。
.SpecialCells函数返回不连续的Range(在您的情况下,包含A列中所有可见的单元格),例如$A$1,$A$4:$A$6...
如果您检查该范围的Rows-propery(本身也是Range),则会获得相同的地址,但是,使用Count-Property会返回仅该范围的第一个所谓的Area中的像元数。

使用此CDE进行检查:

Dim r As Range
Set r = ThisWorkbook.Sheets(1).Range("A1:A" & lRowDbMsNew).SpecialCells(xlCellTypeVisible)
Debug.Print r.Address
Debug.Print r.Count
Dim r2
Set r2 = r.Rows
Debug.Print r2.Address
Debug.Print r2.Count