День добрый!
Подскажите, пожалуйста-
Есть малюсенький макрос, но очень удобный:
ActiveSheet.ShowAllData
Он выключает все автофильтры и отображает все строки.
Но, если нет активных фильтров, то он даёт ошибку-
«Run time error 1004
Метод ShowAllData из класса Worksheet завершен неверно»
И естественно — завершить/исправить/читай мануал.
Будьте любезны, подскажите, как вывести вместо ошибки окно с текстом- «активных фильтров нет» или вообще чтобы ничего не выводилось.
Заранее, спасибо.
Here is the working solution I went with :
Public Sub UnFilter_DB()
Dim ActiveS As String, CurrScreenUpdate As Boolean
CurrScreenUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
ActiveS = ActiveSheet.Name
Sheets("DB").Activate
Sheets("DB").Range("A1").Activate
On Error Resume Next
If Sheets("DB").FilterMode = True Then Sheets("DB").ShowAllData
On Error GoTo 0
DoEvents
Sheets(ActiveS).Activate
Application.ScreenUpdating = CurrScreenUpdate
End Sub
And a more efficient version I wrote to be reusable easily with Named Ranges :
How to use it :
Private Sub TEST_UnFilter_Table()
Dim tB As Workbook, _
Sh As Worksheet
Set tB = ThisWorkbook
Set Sh = tB.Sheets("DB")
Call UnFilter_Table(Sh, "Db_Val")
End Sub
And the proper function with optimisation (if you have big tables) :
Public Function UnFilter_Table(ByRef SheetWithTable As Worksheet, ByVal RangeName As String) As Boolean
On Error GoTo ErrHdlr
Dim aWB As Workbook, _
ActiveSH As Worksheet, _
ScreenUpdateState As Boolean, _
StatusBarState As Boolean, _
CalcState As XlCalculation, _
EventsState As Boolean, _
DisplayPageBreakState As Boolean
Set aWB = ActiveWorkbook
Set ActiveSH = aWB.ActiveSheet
DisplayPageBreakState = ActiveSH.DisplayPageBreaks
ActiveSH.DisplayPageBreaks = False
With Application
ScreenUpdateState = .ScreenUpdating
StatusBarState = .DisplayStatusBar
CalcState = .Calculation
EventsState = .EnableEvents
.ScreenUpdating = False
.DisplayStatusBar = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
SheetWithTable.Activate
SheetWithTable.Range(RangeName).Cells(1, 1).Activate
On Error GoTo 0
On Error Resume Next
If SheetWithTable.FilterMode Then SheetWithTable.ShowAllData
On Error GoTo 0
On Error GoTo ErrHdlr
DoEvents
ActiveSH.Activate
ActiveSH.DisplayPageBreaks = DisplayPageBreakState
With Application
.ScreenUpdating = ScreenUpdateState
.DisplayStatusBar = StatusBarState
.Calculation = CalcState
.EnableEvents = EventsState
End With
UnFilter_Table = True
On Error GoTo 0
Exit Function
ErrHdlr:
UnFilter_Table = False
Debug.Print "Error in unfiltering sheet " & SheetWithTable.Name & " !" & vbCrLf & _
"Error n° " & Err.Number & vbCrLf & _
Err.Description
End Function
I have just experienced the same problem. After some trial-and-error I discovered that if the selection was to the right of my filter area AND the number of shown records was zero, ShowAllData would fail.
A little more context is probably relevant. I have a number of sheets, each with a filter. I would like to set up some standard filters on all sheets, therefore I use some VBA like this
Sheets("Server").Select
col = Range("1:1").Find("In Selected SLA").Column
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE"
This code will adjust the filter on the column with heading «In Selected SLA», and leave all other filters unchanged. This has the unfortunate side effect that I can create a filter that shows zero records. This is not possible using the UI alone.
To avoid that situation, I would like to reset all filters before I apply the filtering above. My reset code looked like this
Sheets("Server").Select
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Note how I did not move the selected cell. If the selection was to the right, it would not remove filters, thus letting the filter code build a zero-row filter. The second time the code is run (on a zero-row filter) ShowAllData will fail.
The workaround is simple: Move the selection inside the filter columns before calling ShowAllData
Application.Goto (Sheets("Server").Range("A1"))
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
This was on Excel version 14.0.7128.5000 (32-bit) = Office 2010
На чтение 4 мин. Просмотров 14.9k.
Итог: узнайте, как очистить все фильтры и фильтры в одном столбце с помощью макросов VBA. Включает примеры кода для регулярных диапазонов и таблиц Excel.
Уровень мастерства: Средний
Содержание
- Скачать файл
- Очистить все фильтры из диапазона
- Ошибка метода ShowAllData
- Очистить все фильтры из таблицы Excel
- Очистить все фильтры во всех таблицах на листе
- Очистить фильтры в одной колонке
- Фильтры и типы данных
Скачать файл
Файл Excel, содержащий код, можно скачать ниже. Этот файл содержит код для фильтрации различных типов данных и типов фильтров. Пожалуйста, ознакомьтесь с моей статьей Фильтрация сводной таблицы или среза по самой последней дате или периоду для более подробной информации.
VBA AutoFilters Guide.xlsm (100.5 KB)
Очистить все фильтры из диапазона
Мы используем метод ShowAllData, чтобы очистить все фильтры,
примененные к диапазону.
Это аналогично нажатию кнопки «Очистить» на вкладке «Данные»
на ленте (сочетание клавиш: Alt, A, C)
К рабочему листу может быть применен только один диапазон
фильтров, поэтому мы на самом деле очищаем фильтры на листе.
Sub Clear_All_Filters_Range() ' Для очистки всех фильтров используйте метод ShowAllData ' для листа. Добавьте обработку ошибок, чтобы обойти ошибку, если ' фильтры не применяются. Не работает для таблиц. On Error Resume Next Sheet1.ShowAllData On Error GoTo 0 End Sub
Ошибка метода ShowAllData
Если к любому столбцу не применены фильтры, метод ShowAllData вызовет ошибку. Это ошибка времени выполнения ‘1004 с описанием:
Method ‘ShowAllData’ of object ‘_Worksheet’ failed.
Следующая строка On Error Resume Next будет игнорировать эту
ошибку. При ошибке GoTo 0 сбрасывается, поэтому ошибки возникают в любых
строках кода ниже.
Примечание. Когда метод ShowAllData упоминается как элемент листа, он НЕ очищает фильтры, которые применяются к таблицам Excel (ListObjects), если в таблице не выбрана ячейка. Поэтому лучше всего использовать приведенный ниже код для таблиц.
Чтобы очистить все фильтры таблицы Excel (ListObject), мы
также используем метод ShowAllData. В этом случае ShowAllData является членом
свойства AutoFilter объекта ListObject.
Sub Clear_All_Filters_Table() Dim lo As ListObject ' Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) ' Очистить все фильтры для всей таблицы lo.AutoFilter.ShowAllData End Sub
Очистить все фильтры во всех таблицах на листе
Приведенный выше код удаляет фильтры только для одной
таблицы. Мы можем просмотреть таблицы на листе, чтобы удалить все фильтры из
каждой таблицы.
Sub Clear_All_Table_Filters_On_Sheet() Dim lo As ListObject ' Перебрать все таблицы на листе For Each lo In Sheet1.ListObjects ' Очистить все фильтры для всей таблицы lo.AutoFilter.ShowAllData Next lo End Sub
Очистить фильтры в одной колонке
Чтобы очистить фильтры для одного столбца, мы используем
метод AutoFilter. Мы ссылаемся только на параметр Field и устанавливаем
значение для номера столбца, который мы хотим очистить.
Sub Clear_Column_Filter_Range() ' Чтобы очистить фильтр от одного столбца, укажите ' Только номер поля и никаких других параметров Sheet1.Range("B3:G1000").AutoFilter Field:=4 End Sub
Поле — это номер столбца диапазона, к которому применяются
фильтры, а не номер столбца рабочего листа.
Тот же метод используется для очистки фильтров, примененных
к столбцу в таблице. В этом случае метод AutoFilter является членом объекта
Range объекта ListObject.
Sub Clear_Column_Filter_Table() Dim lo As ListObject ' Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) ' Очистить фильтр в столбце одной таблицы, ' указав только параметр поля lo.Range.AutoFilter Field:=4 End Sub
Фильтры и типы данных
Параметры
раскрывающегося меню фильтра изменяются в зависимости от типа данных в столбце.
У нас есть разные фильтры для текста, чисел, дат и цветов. Это создает МНОГО
различных комбинаций операторов и критериев для каждого типа фильтра.
Я создал отдельные статьи для каждого из этих типов фильтров. Статьи содержат пояснения и примеры кода VBA.
- Как фильтровать числа с помощью VBA
- Как отфильтровать пустые и непустые ячейки
- Как фильтровать текст с помощью VBA
- Как отфильтровать даты по VBA
- Как отфильтровать цвета и значки с помощью VBA
Файл в разделе загрузок выше содержит все эти примеры кода в одном месте. Вы можете добавить его в свою личную книгу макросов и использовать макросы в своих проектах.
Пожалуйста, оставьте
комментарий ниже с любыми вопросами или предложениями. Спасибо!
-
#1
ActiveSheet.ShowAllData failing — 1004
the worksheet («TPRs»).activate line is right before and seems to work because I can see the activesheet object in watch window.
the TPRs worksheet has 1 list object and 1 pivottable whose cache is the list the listobject on the same worksheet.
the sheet is unprotected.
other worksheets that have pivottables and charts based upon the cache from the list object on the TPRs worksheet are also unprotected.
I cn manually select all cells on the TPRs sheet and rightclick and unhide. If I record that action I get
Cells.Select
Selection.EntireRow.Hidden = False
Is that not the same thing? Would rather use ShowAllData, but guess I could go with that…
I am using excell 2007- any thoughts why the basic command isnt working for me? thank you!