in

Зависает Excel при применении фильтра. Что делать?

Слишком много данных

Как известно, все наши беды от таблиц. В лучшем случае от их объема. А еще они имеют неприятное свойство зависать. Выгрузки по 100 и более строк с трудом перемалываются памятью и ЦП, а нам остаётся только ждать. Доколе?

Первый способ — разделить файлы (можно не в ручную)

Можно просто сплитануть файлы на несколько частей и тем самым дать шанс своему ПК обработать файлы. Не обязательно делать это вручную. Во-первых, есть специальные сервисы (вроде Aspose), Во-вторых, можно использовать макрос для разделения

Sub Splitbook()
'Updateby20140612
Dim xPath As String
xPath = Application.ActiveWorkbook.Path
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each xWs In ThisWorkbook.Sheets
    xWs.Copy
    Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWs.Name & ".xlsx"
    Application.ActiveWorkbook.Close False
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Второй способ — использовать макрос, вместо фильтра

При обработке «напрямую», Excel актуализирует все ячейки, даже если они не задействованы. В свою очередь VBA будет выдавать информацию и менять ее, только ту, которая используется.

Для начала, определимся с параметрами фильтрации. Предположим, у нас есть таблица с данными, содержащая заголовки столбцов в первой строке, и мы хотим отфильтровать значения в столбцах «Имя» и «Возраст». В качестве условия будем использовать значение «Андрей» в столбце «Имя».

Пример макроса:

Sub FilterData()
    Dim ws As Worksheet
    Set ws = ActiveSheet 'или можно указать конкретный лист: Set ws = ThisWorkbook.Worksheets("Лист1")
    
    'определяем диапазон данных
    Dim lastRow As Long, lastCol As Long
    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column
    Dim dataRange As Range
    Set dataRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
    
    'задаем параметры фильтрации
    Dim filterRange As Range
    Set filterRange = ws.Range("A1").CurrentRegion 'диапазон данных с заголовками
    filterRange.AutoFilter Field:=1, Criteria1:="Андрей" 'фильтруем по столбцу "Имя"
    filterRange.AutoFilter Field:=3, Criteria1:=">=18", Operator:=xlAnd, Criteria2:="<=30" 'фильтруем по столбцу "Возраст"
End Sub

Этот макрос фильтрует данные в выбранных столбцах по заданным условиям. В данном примере мы фильтруем данные по имени «Андрей» в столбце «Имя» и возрасту от 18 до 30 лет в столбце «Возраст». Вы можете изменить эти параметры согласно вашим потребностям.

Для запуска макроса необходимо нажать Alt + F8, выбрать макрос и нажать кнопку «Выполнить».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *