Использование «Формат таблицы» для фильтрации строк является медленным - PullRequest
0 голосов
/ 17 февраля 2020

В настоящее время у меня есть лист с 1381 строкой и 128 столбцами (тип информации по строкам, страна по столбцам). Над данными у меня есть несколько кнопок, которые скрывают только указанные c строки, принадлежащие группе или разделу. Меня попросили оставить несколько видимых разделов, и я вставил 1 столбец, заполнил его именем раздела, использовал «Формат как таблицу» только в этой строке, создал срез из этой таблицы, и это позволяет использовать Slicer для скрытия / отображения строк с одинаковым именем раздела. Проблема в том, что он очень медленный, если я использую его таким образом, я выбираю раздел из слайсера или фильтра, и обработка занимает 2-3 минуты ... Я преобразовал таблицу в нормальный диапазон, сгенерировал фильтр, и это почти мгновенно, но я теряю функциональность среза, если я делаю это таким образом.

Единственная формула, которую я использую для единственного столбца, преобразованного в таблицу:

=CHOOSE(--SWITCH_REG+1,OffChar,OnChar) & " " & "Site contracting"

"SWITCH_" и конечная строка изменяется для каждого раздела, но они генерируются вручную, поэтому я не понимаю, почему таблица такая медленная.

Я что-то не так делаю, что фильтр таблиц такой медленный?

1 Ответ

0 голосов
/ 18 февраля 2020

Я решил проблему, выполнив следующие действия:

  1. Преобразование таблицы в диапазон.
  2. Создана сводная таблица с 1 полем из указанного диапазона.
  3. Создан слайсер из сводной таблицы.
  4. Добавлен макрос-триггер при изменении сводной таблицы, чтобы получить значения фильтра из среза и применить их в качестве фильтра к начальному диапазону. Код ниже:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

    Dim rngTableAll As Range, filterField, arrFilterValues
    Dim firstCol, lastCol, sectionI     

    'UPDATE FILTER WHEN SLICER IS UPDATED
    If Target.NAME = "CatPiv" Then
        With Inputs_03
            Set rngTableAll = .Range("_FilterDatabase")
            filterField = 1
            arrFilterValues = GETSLICERITEMS_ARRAY("Slicer_SubCat")
            rngTableAll.AutoFilter Field:=filterField, Criteria1:=arrFilterValues, Operator:=xlFilterValues, VisibleDropDown:=False

            'HIDE ARROWS 'CAREFULL, IT'S SLOW
'            Application.Calculation = xlCalculationManual
'            For filterField = 2 To rngTableAll.Columns.Count - 2
'                rngTableAll.AutoFilter Field:=filterField, VisibleDropDown:=False
'            Next
'            Application.Calculation = xlCalculationAutomatic
        End With

    End If

End Sub
Public Function GETSLICERITEMS_ARRAY(SlicerName As String)
    'https://www.excelforum.com/excel-general/1178647-trigger-event-on-slicer-selection-update.html
    Dim arrItems, strItems

    strItems = GETSLICERITEMS(SlicerName)
    arrItems = Split(strItems, ", ")

    GETSLICERITEMS_ARRAY = arrItems
End Function

Как получить предметы для нарезки: 'https://www.excelforum.com/excel-general/1178647-trigger-event-on-slicer-selection-update.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...