Excel VBA: как отменить фильтрацию только одного диапазона автофильтра за раз? Предоставленный код

Спасибо, что пришли в эту тему.

Что у меня есть:

-Отчет с автофильтром по строкам A:G

Что мне нужно:

- Косвенный код, который отменяет фильтрацию определенного столбца, если на нем есть фильтр.

-Запуск моего кода ниже отфильтровывает весь диапазон A:G.

-В этом случае я хочу, чтобы нефильтрованным был только «F», оставляя любые другие фильтры в покое, если они отфильтрованы.

With Sheets("DATA")
    If .Range("F1").AutoFilter = True Then
        ActiveSheet.Range("$A$1:$G$59826").AutoFilter Field:=6
    Else
    End If
End With

Любые идеи приветствуются! Большое спасибо!


person Nicholas DiMarcello    schedule 31.07.2013    source источник
comment
Ваш код выглядит хорошо для меня, я также проверил его, и когда я попробовал, он делает именно то, о чем вы просите, удаляет автофильтр из одного поля.   -  person user2140261    schedule 31.07.2013
comment
Когда я запускаю код, он полностью удаляет автофильтр.   -  person dendarii    schedule 31.07.2013
comment
Однако он также удаляет другие поля, которые уже были отфильтрованы. Таким образом, автофильтр будет сброшен в столбцах B и C, если они отфильтрованы. На самом деле я ответил на свой вопрос, но у меня недостаточно представителей, чтобы ответить на него. Вот код:Addr = Split(ActiveSheet.UsedRange.Address, $) lastRow = Addr(UBound(Addr)) For r = lastRow To 1 Step -1 If Len(Cells(r, A).Value) Then lastRow = r Выход в конец, если следующий ActiveSheet.Range($A$1:$G & lastRow).Поле автофильтра:=6   -  person Nicholas DiMarcello    schedule 31.07.2013
comment
В качестве примечания: если какие-либо ответы, прошлые или настоящие, ответили на ваш вопрос, обязательно примите их, щелкнув галочку рядом с ними. Это ТАК путь :).   -  person Doug Glancy    schedule 31.07.2013


Ответы (3)


Попробуй это:

Sub UnFilter()
Dim ws As Excel.Worksheet

Set ws = Worksheets("DATA")
With ws
    If .AutoFilterMode = True Then
        If Not Intersect(.AutoFilter.Range, .Range("G1")) Is Nothing Then
            .Range("$A$1:$G$59826").AutoFilter Field:=.Range("G:G").Column
        End If
    End If
End With
End Sub

Эта строка в вашем коде:

If .Range("F1").AutoFilter = True

... фактически отключает фильтрацию для всего листа. Вместо этого мой код проверяет, отфильтрован ли лист с помощью:

If .AutoFilterMode = True Then

Затем он проверяет, включает ли фильтр столбец G с помощью:

If Not Intersect(.AutoFilter.Range, .Range("G1")) Is Nothing Then

Я сделал пару изменений, чтобы сделать ваш код более гибким. Он также включает Intellisense для объекта ws, что очень полезно. (Я всегда нахожу различные свойства и методы, связанные с Filter, сбивающими с толку, особенно без автодополнения.)

person Doug Glancy    schedule 31.07.2013

Это сработало для меня

Sub UnfilterColumn()

    With Worksheets("DATA")
        If Not Worksheets("DATA").AutoFilter Is Nothing Then
                ThisWorkbook.Sheets("DATA").Range("A1").AutoFilter Field:=6
        End If
    End With

End Sub
person dendarii    schedule 31.07.2013
comment
Это не работает для меня. При запуске ничего не меняется. У меня стоит фильтр на другой колонке и на G. - person Doug Glancy; 31.07.2013
comment
Если фильтр, который вы хотите удалить, находится в столбце G, используйте Поле:=7. - person dendarii; 01.08.2013
comment
Ой, вы правы, у меня это было еще на 6. Тем не менее, он по-прежнему терпит неудачу, если фильтр находится в другой части листа, например, в столбце I. Тогда он проходит тест Not is Nothing, но имеет Error 1004 в строке Field:=6` - person Doug Glancy; 01.08.2013
comment
Хм. Если я фильтрую в столбцах 1, 2 и 6, этот код удаляет фильтр в столбце 6, оставляя фильтры в 1 и 2 нетронутыми. Это также работает для меня, если у меня нет фильтра в столбце 6 для запуска. Я использую Excel 2010; Интересно, есть ли разница? - person dendarii; 01.08.2013
comment
Что это у вас фильтр только по колонке I? - person Doug Glancy; 01.08.2013
comment
Кстати, Дуг, я узнал ваше имя из группы microsoft.public.excel.programming - приятно видеть некоторых из старой толпы в SO. - person dendarii; 01.08.2013
comment
Вы правы, это не работает, если фильтруется диапазон, который не включает столбец 6. Ваш код пересечения позаботится об этом, я вижу - person dendarii; 01.08.2013
comment
SO заполнил дыру, оставленную группой microsoft.public.excel.programming, а затем и некоторые другие. Спасибо, что помните! - person Doug Glancy; 02.08.2013

Я просто ввел простой код ниже в модуль, и он отлично сработал для меня. Вы захотите изменить диапазон данных и поле, чтобы они соответствовали вашим данным. Я очищаю фильтр с данными в столбцах от A до M. Поле 8 — это столбец H.

ActiveSheet.Range("$A:$M").AutoFilter Field:=8
person StefD    schedule 08.02.2017