Автофильтр VBA - удаление видимых ячеек (кажется, код должен работать, но не работает) - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблемы с удалением некоторых строк с помощью VBA.

У меня есть данные, организованные в строки в столбцах A - K. В столбце K есть счетчик;когда он превышает 1, необходимо удалить всю строку.Я установил следующий код;и ожидал, что он отфильтрует столбец K для чего-либо, превышающего 1. Если он обнаружит, что имеется более 1 строки (строка 1 является заголовком), он удалит все видимое, в противном случае он просто удалит критерии из фильтра.

Однако первое окно сообщения возвращает значение 2900 (правильное значение), а второе окно сообщения возвращает значение 1, и я понятия не имею, почему.Следовательно, ни одна из строк со столбцом K, превышающим 1 (их около 2000), не удаляется.

Видимые строки в начале макроса определены как 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 голосов
/ 19 февраля 2019

Измените строку, в которой вы подсчитываете количество видимых строк, на

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

(удалите .rows).
Функция .SpecialCells возвращает несмежное Range (в вашем случае, содержащем все ячейки из видимого столбца A, например, $A$1,$A$4:$A$6....
Если вы проверите Rows -предоставление этого диапазона (который также является Range), вы получитеоднако тот же адрес (а) с использованием свойства Count возвращает количество ячеек только в первом так называемом Area диапазоне.

Проверьте это с помощью куска кода:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...