79539639

Date: 2025-03-27 17:39:25
Score: 2.5
Natty:
Report link

У меня было три таблицы по первой сделан срез

В меню макросов в листе вставлен код по отслеживанию изменений на листе в срезе и потом если изменения есть запускается процедура по приведению других таблиц к срезу в первой

' Флаг для предотвращения рекурсии
Private IsSyncing As Boolean

' Переменная для хранения предыдущего состояния среза
Private previousSelectedValues As String

Private Sub Worksheet_Calculate()
    ' ЭТОТ КОД ДОЛЖЕН БЫТЬ В МОДУЛЕ ЛИСТА
    Dim sc As SlicerCache
    Set sc = ThisWorkbook.SlicerCaches("Срез_РЦ") ' Укажите имя вашего кэша
    
    If sc Is Nothing Then Exit Sub
    
    ' Получаем текущие выбранные значения
    Dim currentSelectedValues As String
    currentSelectedValues = GetSelectedSlicerItems(sc)
    
    ' Сравниваем с предыдущим состоянием
    If currentSelectedValues <> previousSelectedValues Then
        previousSelectedValues = currentSelectedValues
        
        ' Запускаем синхронизацию фильтров
        If Not IsSyncing Then
            IsSyncing = True
            СинхронизироватьФильтры
            IsSyncing = False
        End If
    End If
End Sub

Function GetSelectedSlicerItems(sc As SlicerCache) As String
    Dim result As String
    Dim si As SlicerItem
    
    For Each si In sc.SlicerItems
        If si.Selected Then
            result = result & si.Value & vbCrLf
        End If
    Next si
    
    GetSelectedSlicerItems = result
End Function

и потом с помощью процедуры в модуле вставлен код приведения срезов талбицы

' Этот код должен быть в ОБЫЧНОМ МОДУЛЕ (например, Module1)
Sub СинхронизироватьФильтры()
    ' Эта процедура отображается в списке макросов (Alt + F8)
    Dim sc As SlicerCache
    Set sc = ThisWorkbook.SlicerCaches("Срез_РЦ") ' Укажите имя кэша среза
    
    If Not sc Is Nothing Then
        ' Собираем выбранные элементы
        Dim selectedItems As Collection
        Set selectedItems = New Collection
        
        Dim si As SlicerItem
        For Each si In sc.SlicerItems
            If si.Selected Then selectedItems.Add si.Value
        Next si
        
        ' Применяем фильтры к таблицам
        ApplyFilterToTable "План", "РЦ", selectedItems
        ApplyFilterToTable "Выполнение", "РЦ", selectedItems
        
        'MsgBox "Фильтры синхронизированы!", vbInformation
    Else
        MsgBox "Срез не найден!", vbExclamation
    End If
End Sub

Sub ApplyFilterToTable(tableName As String, field As String, items As Collection)
    ' Процедура для фильтрации таблиц
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Показатели запрос") ' Укажите имя листа
    
    Dim lo As ListObject
    Set lo = ws.ListObjects(tableName)
    
    ' Находим индекс столбца
    Dim colIndex As Integer
    colIndex = lo.ListColumns(field).Index
    
    ' Снимаем текущий фильтр
    On Error Resume Next
    lo.Range.AutoFilter field:=colIndex
    On Error GoTo 0
    
    ' Применяем новый фильтр
    If items.Count > 0 Then
        Dim criteria() As String
        ReDim criteria(1 To items.Count)
        
        Dim i As Integer
        For i = 1 To items.Count
            criteria(i) = CStr(items(i))
        Next i
        
        ' Используем константу 7 (xlFilterValues для русской версии)
        lo.Range.AutoFilter _
            field:=colIndex, _
            Criteria1:=criteria, _
            Operator:=7
    End If
End Sub

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • No latin characters (3):
  • Low reputation (1):
Posted by: Юрий Щ