Столкнулся с интересной задачей, есть Olap-куб на основании которого формируется сводная таблица, на нескольких листах разные сформированные таблицы в которых отображена требуемая информация, есть лист "Свод" в котором формулами эта информация собирается в нужную сжатую конечную таблицу.
Возник вопрос, как сделать фильтрацию на всех листах в схожих сводных таблицах по определённым значениям внесённым в ячейки на странице свод, что бы вбив несколько кодов товара дату и заказчика в ячейках G5:I8, во всех сводных фильтрация автоматически настроила сводные таблицы.
Пробовал сделать записью макроса но макрос не работал.
Поставил код на обновление сводных таблиц, работает, указываю ниже, может кому пригодится. [vba]
Код
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables pt.RefreshTable Next pt Next ws End Sub
[/vba]
Добрый день!
Столкнулся с интересной задачей, есть Olap-куб на основании которого формируется сводная таблица, на нескольких листах разные сформированные таблицы в которых отображена требуемая информация, есть лист "Свод" в котором формулами эта информация собирается в нужную сжатую конечную таблицу.
Возник вопрос, как сделать фильтрацию на всех листах в схожих сводных таблицах по определённым значениям внесённым в ячейки на странице свод, что бы вбив несколько кодов товара дату и заказчика в ячейках G5:I8, во всех сводных фильтрация автоматически настроила сводные таблицы.
Пробовал сделать записью макроса но макрос не работал.
Поставил код на обновление сводных таблиц, работает, указываю ниже, может кому пригодится. [vba]
Код
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables pt.RefreshTable Next pt Next ws End Sub
Pelena, Пробовал ими, но получается не удобно, когда слишком большой ассортимент, хотелось бы именно с привязкой к информации в ячейках G5:I8
Pelena, Пробовал ими, но получается не удобно, когда слишком большой ассортимент, хотелось бы именно с привязкой к информации в ячейках G5:I8Bodrichkom
Pelena, нет, макрос который выложил, только обновляет все сводные, а тот что находил в интернете, либо не подходил, либо не работал, а сам я ума не приложу как макросом это воспроизвести, вот и решил совета попросить тут на форуме, вдруг кто уже делал такую задачу или знает как это сделать и направил бы ход мыслей в нужную сторону.
Pelena, нет, макрос который выложил, только обновляет все сводные, а тот что находил в интернете, либо не подходил, либо не работал, а сам я ума не приложу как макросом это воспроизвести, вот и решил совета попросить тут на форуме, вдруг кто уже делал такую задачу или знает как это сделать и направил бы ход мыслей в нужную сторону.Bodrichkom
Pelena, А вот этот вариант, именно то что искал, протестировал на разные возможные ошибки, работает превосходно, Вам ОГРООООМНОЕ Спасибо!!!!)
Pelena, А вот этот вариант, именно то что искал, протестировал на разные возможные ошибки, работает превосходно, Вам ОГРООООМНОЕ Спасибо!!!!)Bodrichkom
Судя по первому скрину, возможно не совпадают названия столбцов на листе Свод в табличке с критериями с названиями столбцов таблицы-источника. С датами тоже возможна проблема из-за разного формата. По поводу OLAP-куба ничего не могу сказать, есть ли там отличия от обычных сводных
Судя по первому скрину, возможно не совпадают названия столбцов на листе Свод в табличке с критериями с названиями столбцов таблицы-источника. С датами тоже возможна проблема из-за разного формата. По поводу OLAP-куба ничего не могу сказать, есть ли там отличия от обычных сводныхPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Pelena, Вложил скрин, названия копировал прям из свода, они идентичные, тоже на это сначала подумал, по поводу даты, попробовал без столбца даты, всё ровно та же ошибка, сижу вот голову ломаю, в чём же дело)
Pelena, Вложил скрин, названия копировал прям из свода, они идентичные, тоже на это сначала подумал, по поводу даты, попробовал без столбца даты, всё ровно та же ошибка, сижу вот голову ломаю, в чём же дело)Bodrichkom
Мне тут подсказали, что запись VBA у куба немного иная чем со сводными, выложу код, если кто знает, как его оформить, что бы заработал на Olap-кубах, прошу поправить или направить на путь истинный) [vba]
Код
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic As Object With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With arrField = Лист2.Range("X4:Y4").Value crit = Лист2.Range("X5:Y14").Value 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables For f = 1 To UBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(crit) If crit(i, f) <> "" Then odic(FDynVal(crit(i, f))) = FDynVal(crit(i, f)) Next i With pt.PivotFields(arrField(1, f)) .ClearAllFilters If odic.Count > 0 Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = True Else .PivotItems(it.Value).Visible = False Next it End If End With Next f Next pt Next ws With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub Public Function FDynVal(FrmContrVal) If Len(FrmContrVal & "") = 0 Then FDynVal = "" Else Select Case VarType(FrmContrVal) Case 5 FDynVal = CStr(FrmContrVal) Case 8 FDynVal = FrmContrVal Case 7 FDynVal = Format(FrmContrVal, "m\/d\/yyyy") End Select End If End Function
[/vba]
Мне тут подсказали, что запись VBA у куба немного иная чем со сводными, выложу код, если кто знает, как его оформить, что бы заработал на Olap-кубах, прошу поправить или направить на путь истинный) [vba]
Код
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic As Object With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With arrField = Лист2.Range("X4:Y4").Value crit = Лист2.Range("X5:Y14").Value 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables For f = 1 To UBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(crit) If crit(i, f) <> "" Then odic(FDynVal(crit(i, f))) = FDynVal(crit(i, f)) Next i With pt.PivotFields(arrField(1, f)) .ClearAllFilters If odic.Count > 0 Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = True Else .PivotItems(it.Value).Visible = False Next it End If End With Next f Next pt Next ws With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub Public Function FDynVal(FrmContrVal) If Len(FrmContrVal & "") = 0 Then FDynVal = "" Else Select Case VarType(FrmContrVal) Case 5 FDynVal = CStr(FrmContrVal) Case 8 FDynVal = FrmContrVal Case 7 FDynVal = Format(FrmContrVal, "m\/d\/yyyy") End Select End If End Function
В случае OLAP-кубов синтаксис другой и есть такое свойство VisibleItemsList, в которое, судя по справке, можно сразу массив критериев подгружать. Посмотрите пример здесь Видимо, вместо [vba]
В случае OLAP-кубов синтаксис другой и есть такое свойство VisibleItemsList, в которое, судя по справке, можно сразу массив критериев подгружать. Посмотрите пример здесь Видимо, вместо [vba]
Нашёл в интернете вот такой вот код, но он тоже не работает [vba]
Код
Sub SKU_2()
Sheets("Куб1").Select
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО СКЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowSKU As Long CountRowSKU = Cells(Rows.Count, 2).End(xlUp).Row - 2
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО БЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowBU As Long CountRowBU = Cells(Rows.Count, 5).End(xlUp).Row - 2
'Для проверки количества строк выводим сообщения (убрать комментирование) 'MsgBox CountRowSKU 'MsgBox CountRowBU
'Далее все относительно СКЮ 'Проверяем наличие в строках СКЮ (если СКЮ нет, то переменная = -1, см. выше) If CountRowSKU <> -1 Then Sheets("Куб1").Select
'Вводим переменную массива с неопределенным размером Dim ArrSKU() 'Определяем размер с помощью переменной ReDim ArrSKU(0 To CountRowSKU)
'Вводим переменную для индексации Dim SKU As Integer
'Определяем количество итераций - столько же, сколько и кодов For SKU = 0 To CountRowSKU 'Определяем значения массива по циклу ArrSKU(SKU) = "[Товар].[_Код товара].&[" & Range("I" & SKU + 2).Value & "]" Next SKU
'Осуществляем выборку из куба, где значениями будут данные из массива Sheets("Куб1").Select ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Товар].[_Код товара].[_Код товара]").VisibleItemsList = ArrSKU End If
'Далее все относится к БЮ. Аналогично СКЮ If CountRowBU <> -1 Then Sheets("Куб1").Select Dim ArrBU() ReDim ArrBU(0 To CountRowBU) Dim BU As Integer
For BU = 0 To CountRowBU ArrBU(BU) = "[Канал продаж].[Канал продаж].&[" & Range("J" & BU + 2).Value & "]" Next BU
'For BU = 0 To 2 'MsgBox ArrBU(BU) ' Next BU
Sheets("Куб1").Select ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Канал продаж].[Канал продаж].[Канал продаж]").VisibleItemsList = ArrBU End If
Нашёл в интернете вот такой вот код, но он тоже не работает [vba]
Код
Sub SKU_2()
Sheets("Куб1").Select
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО СКЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowSKU As Long CountRowSKU = Cells(Rows.Count, 2).End(xlUp).Row - 2
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО БЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowBU As Long CountRowBU = Cells(Rows.Count, 5).End(xlUp).Row - 2
'Для проверки количества строк выводим сообщения (убрать комментирование) 'MsgBox CountRowSKU 'MsgBox CountRowBU
'Далее все относительно СКЮ 'Проверяем наличие в строках СКЮ (если СКЮ нет, то переменная = -1, см. выше) If CountRowSKU <> -1 Then Sheets("Куб1").Select
'Вводим переменную массива с неопределенным размером Dim ArrSKU() 'Определяем размер с помощью переменной ReDim ArrSKU(0 To CountRowSKU)
'Вводим переменную для индексации Dim SKU As Integer
'Определяем количество итераций - столько же, сколько и кодов For SKU = 0 To CountRowSKU 'Определяем значения массива по циклу ArrSKU(SKU) = "[Товар].[_Код товара].&[" & Range("I" & SKU + 2).Value & "]" Next SKU
'Осуществляем выборку из куба, где значениями будут данные из массива Sheets("Куб1").Select ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Товар].[_Код товара].[_Код товара]").VisibleItemsList = ArrSKU End If
'Далее все относится к БЮ. Аналогично СКЮ If CountRowBU <> -1 Then Sheets("Куб1").Select Dim ArrBU() ReDim ArrBU(0 To CountRowBU) Dim BU As Integer
For BU = 0 To CountRowBU ArrBU(BU) = "[Канал продаж].[Канал продаж].&[" & Range("J" & BU + 2).Value & "]" Next BU
'For BU = 0 To 2 'MsgBox ArrBU(BU) ' Next BU
Sheets("Куб1").Select ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Канал продаж].[Канал продаж].[Канал продаж]").VisibleItemsList = ArrBU End If
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic As Object With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With arrField = Лист2.Range("X4:Y4").Value crit = Лист2.Range("X5:Y14").Value 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables For f = 1 To UBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(crit) If crit(i, f) <> "" Then odic("[Товар].[_Код товара].[" & FDynVal(crit(i, f) & "]")) = "[Товар].[_Код товара].[" & FDynVal(crit(i, f) & "]") Next i With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]") .ClearAllFilters If odic.Count > 0 Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = True Else .PivotItems(it.Value).Visible = False Next it End If End With Next f Next pt Next ws With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub Public Function FDynVal(FrmContrVal) If Len(FrmContrVal & "") = 0 Then FDynVal = "" Else Select Case VarType(FrmContrVal) Case 5 FDynVal = CStr(FrmContrVal) Case 8 FDynVal = FrmContrVal Case 7 FDynVal = Format(FrmContrVal, "m\/d\/yyyy") End Select End If End Function
[/vba]
Ошибка в [vba]
Код
With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]")
[/vba]
Pelena, В итоге сейчас код выглядит так [vba]
Код
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic As Object With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With arrField = Лист2.Range("X4:Y4").Value crit = Лист2.Range("X5:Y14").Value 'Шаг 2: Запускаем цикл через каждый лист книги For Each ws In ThisWorkbook.Worksheets 'Шаг 3: Запускаем цикл через все сводные таблицы For Each pt In ws.PivotTables For f = 1 To UBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(crit) If crit(i, f) <> "" Then odic("[Товар].[_Код товара].[" & FDynVal(crit(i, f) & "]")) = "[Товар].[_Код товара].[" & FDynVal(crit(i, f) & "]") Next i With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]") .ClearAllFilters If odic.Count > 0 Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = True Else .PivotItems(it.Value).Visible = False Next it End If End With Next f Next pt Next ws With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub Public Function FDynVal(FrmContrVal) If Len(FrmContrVal & "") = 0 Then FDynVal = "" Else Select Case VarType(FrmContrVal) Case 5 FDynVal = CStr(FrmContrVal) Case 8 FDynVal = FrmContrVal Case 7 FDynVal = Format(FrmContrVal, "m\/d\/yyyy") End Select End If End Function
[/vba]
Ошибка в [vba]
Код
With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]")
[/vba] Заказчик и _Код заказчика поставила наобум, надо изменить на адекватные
Используйте тот код, что нашли, только внесите исправления. Файл имеется в виду, тот, что был приложен. Если критерии расположены по-другому, считайте сами, с какого столбца и с какой строки начинать
По Вашему файлу надо внести исправления. На примере Заказчика [vba]
[/vba] Заказчик и _Код заказчика поставила наобум, надо изменить на адекватные
Используйте тот код, что нашли, только внесите исправления. Файл имеется в виду, тот, что был приложен. Если критерии расположены по-другому, считайте сами, с какого столбца и с какой строки начинатьPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816