ошибка автофильтра - PullRequest
0 голосов
/ 27 июня 2019

Я хочу создать макрос автофильтра для листа Excel, который отфильтрует все строки, которые не содержат "ballroom*" в Column E, но также оставит все строки, где Column E пусто

Иметь базовые знания по программированию, научил себя тому, что я знаю до сих пор в VBA

Это то, что у меня сейчас

Sub row_deleter()

    Dim ws As Worksheet
    Dim rng As Range
    Dim lastrow As Long

    ''setting varibles
    Set ws = ActiveSheet

    lastrow = ws.Range("E" & ws.Rows.count).End(xlUp).Row

    Set rng = ws.Range("E1:E" & lastrow)

    ''actual filter function

    With rng
        .AutoFilter field:=5, Criteria1:=IsEmpty(rng), Operator:=xlAnd, Criteria2:="=*ballroom*"
        .SpecialCells(xlCellTypeVisible).EntireRow.delete
    End With

    ''turn off filters
    ws.AutoFilterMode = False


End Sub

When I try to run this code it gives me a 1004 error saying `AutoFilter` method of range class failed, and the debug points to the `AutoFilter` line. Have tried a few things thus far with syntax etc and nothing seems to be working.

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Во-первых, давайте удостоверимся, что ваш стол имеет AutoFilter.Кроме того, ваши критерии не должны относиться ни к какому диапазону, а только к тому, что фильтруется.Кроме того, я считаю, что ваши критерии должны быть xlOr - клетка не может быть пустой и иметь бальный зал.Попробуйте это:

Sub row_deleter()

    Dim ws As Worksheet
    Dim rng As Range
    Dim lastrow As Long

    ''setting varibles
    Set ws = ActiveSheet

    lastrow = ws.Range("E" & ws.Rows.Count).End(xlUp).Row

    Set rng = ws.Range("E1:E" & lastrow)

    ''turn on autofilter if it's off
    If ws.AutoFilterMode = False Then
        ws.UsedRange.AutoFilter
    End If

    ''actual filter function
    With rng
        .AutoFilter Field:=1, Criteria1:="=", Operator:=xlOr, Criteria2:="=*ballroom*"
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    ''turn off filters
    ws.AutoFilterMode = False

End Sub
1 голос
/ 27 июня 2019

Хотя у вас есть ответ и из-за вашего комментария (вы хотите удалить каждую строку, которая не соответствует вашим критериям), я изменил ваш код, чтобы было проще читать и выполнять то, что вы на самом деле хотите:

Option Explicit
Sub row_deleter()

    Dim lastrow As Long

    ''setting varibles
    'you can use a With ActiveSheet and avoid the use of ws Thought I wouldn't recommend using ActiveSheet unless you attach
    'this macro to a button on the sheet itself.
    With ActiveSheet
        lastrow = .Range("E" & .Rows.Count).End(xlUp).Row
        ''actual filter function
        .UsedRange.AutoFilter Field:=5, Criteria1:="<>", Operator:=xlOr, Criteria2:="<>*ballroom*"
        .Range("A2:A" & lastrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        ''turn off filters
        .AutoFilterMode = False
    End With

End Sub
1 голос
/ 27 июня 2019

field:= - это смещение, и у вас есть только один столбец в качестве диапазона.Вы хотите, чтобы это было field:=1

Вы также используете xland, который хотите xlor.Не может быть и пустой клетки, и камеры с бальным залом.

.AutoFilter Field:=1, Criteria1:=IsEmpty(rng), Operator:=xlOr, Criteria2:="=*ballroom*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...