Столкнулся с интересной задачей, есть Olap-куб на основании которого формируется сводная таблица, на нескольких листах разные сформированные таблицы в которых отображена требуемая информация, есть лист "Свод" в котором формулами эта информация собирается в нужную сжатую конечную таблицу.
Возник вопрос, как сделать фильтрацию на всех листах в схожих сводных таблицах по определённым значениям внесённым в ячейки на странице свод, что бы вбив несколько кодов товара дату и заказчика в ячейках G5:I8, во всех сводных фильтрация автоматически настроила сводные таблицы.
Пробовал сделать записью макроса но макрос не работал.
Поставил код на обновление сводных таблиц, работает, указываю ниже, может кому пригодится.
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 EndSub
Добрый день!
Столкнулся с интересной задачей, есть Olap-куб на основании которого формируется сводная таблица, на нескольких листах разные сформированные таблицы в которых отображена требуемая информация, есть лист "Свод" в котором формулами эта информация собирается в нужную сжатую конечную таблицу.
Возник вопрос, как сделать фильтрацию на всех листах в схожих сводных таблицах по определённым значениям внесённым в ячейки на странице свод, что бы вбив несколько кодов товара дату и заказчика в ячейках G5:I8, во всех сводных фильтрация автоматически настроила сводные таблицы.
Пробовал сделать записью макроса но макрос не работал.
Поставил код на обновление сводных таблиц, работает, указываю ниже, может кому пригодится.
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 EndSub
Pelena, Пробовал ими, но получается не удобно, когда слишком большой ассортимент, хотелось бы именно с привязкой к информации в ячейках G5:I8
Pelena, Пробовал ими, но получается не удобно, когда слишком большой ассортимент, хотелось бы именно с привязкой к информации в ячейках G5:I8Bodrichkom
Pelena, нет, макрос который выложил, только обновляет все сводные, а тот что находил в интернете, либо не подходил, либо не работал, а сам я ума не приложу как макросом это воспроизвести, вот и решил совета попросить тут на форуме, вдруг кто уже делал такую задачу или знает как это сделать и направил бы ход мыслей в нужную сторону.
Pelena, нет, макрос который выложил, только обновляет все сводные, а тот что находил в интернете, либо не подходил, либо не работал, а сам я ума не приложу как макросом это воспроизвести, вот и решил совета попросить тут на форуме, вдруг кто уже делал такую задачу или знает как это сделать и направил бы ход мыслей в нужную сторону.Bodrichkom
Pelena, А вот этот вариант, именно то что искал, протестировал на разные возможные ошибки, работает превосходно, Вам ОГРООООМНОЕ Спасибо!!!!)
Pelena, А вот этот вариант, именно то что искал, протестировал на разные возможные ошибки, работает превосходно, Вам ОГРООООМНОЕ Спасибо!!!!)Bodrichkom
Судя по первому скрину, возможно не совпадают названия столбцов на листе Свод в табличке с критериями с названиями столбцов таблицы-источника. С датами тоже возможна проблема из-за разного формата. По поводу OLAP-куба ничего не могу сказать, есть ли там отличия от обычных сводных
Судя по первому скрину, возможно не совпадают названия столбцов на листе Свод в табличке с критериями с названиями столбцов таблицы-источника. С датами тоже возможна проблема из-за разного формата. По поводу OLAP-куба ничего не могу сказать, есть ли там отличия от обычных сводныхPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Pelena, Вложил скрин, названия копировал прям из свода, они идентичные, тоже на это сначала подумал, по поводу даты, попробовал без столбца даты, всё ровно та же ошибка, сижу вот голову ломаю, в чём же дело)
Pelena, Вложил скрин, названия копировал прям из свода, они идентичные, тоже на это сначала подумал, по поводу даты, попробовал без столбца даты, всё ровно та же ошибка, сижу вот голову ломаю, в чём же дело)Bodrichkom
Мне тут подсказали, что запись VBA у куба немного иная чем со сводными, выложу код, если кто знает, как его оформить, что бы заработал на Olap-кубах, прошу поправить или направить на путь истинный)
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic AsObject With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual EndWith
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 = 1ToUBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1ToUBound(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 > 0Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = TrueElse .PivotItems(it.Value).Visible = False Next it EndIf EndWith Next f Next pt Next ws With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True EndWith EndSub PublicFunction FDynVal(FrmContrVal) IfLen(FrmContrVal & "") = 0Then
FDynVal = "" Else SelectCaseVarType(FrmContrVal) Case5
FDynVal = CStr(FrmContrVal) Case8
FDynVal = FrmContrVal Case7
FDynVal = Format(FrmContrVal, "m\/d\/yyyy") EndSelect EndIf EndFunction
Мне тут подсказали, что запись VBA у куба немного иная чем со сводными, выложу код, если кто знает, как его оформить, что бы заработал на Olap-кубах, прошу поправить или направить на путь истинный)
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic AsObject With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual EndWith
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 = 1ToUBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1ToUBound(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 > 0Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = TrueElse .PivotItems(it.Value).Visible = False Next it EndIf EndWith Next f Next pt Next ws With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True EndWith EndSub PublicFunction FDynVal(FrmContrVal) IfLen(FrmContrVal & "") = 0Then
FDynVal = "" Else SelectCaseVarType(FrmContrVal) Case5
FDynVal = CStr(FrmContrVal) Case8
FDynVal = FrmContrVal Case7
FDynVal = Format(FrmContrVal, "m\/d\/yyyy") EndSelect EndIf EndFunction
В случае OLAP-кубов синтаксис другой и есть такое свойство VisibleItemsList, в которое, судя по справке, можно сразу массив критериев подгружать. Посмотрите пример здесь Видимо, вместо
В случае OLAP-кубов синтаксис другой и есть такое свойство VisibleItemsList, в которое, судя по справке, можно сразу массив критериев подгружать. Посмотрите пример здесь Видимо, вместо
Нашёл в интернете вот такой вот код, но он тоже не работает
Sub SKU_2()
Sheets("Куб1").Select
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО СКЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowSKU AsLong
CountRowSKU = Cells(Rows.Count, 2).End(xlUp).Row - 2
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО БЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowBU AsLong
CountRowBU = Cells(Rows.Count, 5).End(xlUp).Row - 2
'Для проверки количества строк выводим сообщения (убрать комментирование) 'MsgBox CountRowSKU 'MsgBox CountRowBU
'Далее все относительно СКЮ 'Проверяем наличие в строках СКЮ (если СКЮ нет, то переменная = -1, см. выше) If CountRowSKU <> -1Then
Sheets("Куб1").Select
'Вводим переменную массива с неопределенным размером Dim ArrSKU() 'Определяем размер с помощью переменной ReDim ArrSKU(0To CountRowSKU)
'Вводим переменную для индексации Dim SKU AsInteger
'Определяем количество итераций - столько же, сколько и кодов For SKU = 0To CountRowSKU 'Определяем значения массива по циклу
ArrSKU(SKU) = "[Товар].[_Код товара].&[" & Range("I" & SKU + 2).Value & "]" Next SKU
'Осуществляем выборку из куба, где значениями будут данные из массива
Sheets("Куб1").Select
ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Товар].[_Код товара].[_Код товара]").VisibleItemsList = ArrSKU EndIf
'Далее все относится к БЮ. Аналогично СКЮ If CountRowBU <> -1Then
Sheets("Куб1").Select Dim ArrBU() ReDim ArrBU(0To CountRowBU) Dim BU AsInteger
For BU = 0To CountRowBU
ArrBU(BU) = "[Канал продаж].[Канал продаж].&[" & Range("J" & BU + 2).Value & "]" Next BU
Нашёл в интернете вот такой вот код, но он тоже не работает
Sub SKU_2()
Sheets("Куб1").Select
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО СКЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowSKU AsLong
CountRowSKU = Cells(Rows.Count, 2).End(xlUp).Row - 2
'Вводим переменную КОЛИЧЕСТВА СТРОК ПО БЮ и считаем количество не пустых строк для дальнейших циклов Dim CountRowBU AsLong
CountRowBU = Cells(Rows.Count, 5).End(xlUp).Row - 2
'Для проверки количества строк выводим сообщения (убрать комментирование) 'MsgBox CountRowSKU 'MsgBox CountRowBU
'Далее все относительно СКЮ 'Проверяем наличие в строках СКЮ (если СКЮ нет, то переменная = -1, см. выше) If CountRowSKU <> -1Then
Sheets("Куб1").Select
'Вводим переменную массива с неопределенным размером Dim ArrSKU() 'Определяем размер с помощью переменной ReDim ArrSKU(0To CountRowSKU)
'Вводим переменную для индексации Dim SKU AsInteger
'Определяем количество итераций - столько же, сколько и кодов For SKU = 0To CountRowSKU 'Определяем значения массива по циклу
ArrSKU(SKU) = "[Товар].[_Код товара].&[" & Range("I" & SKU + 2).Value & "]" Next SKU
'Осуществляем выборку из куба, где значениями будут данные из массива
Sheets("Куб1").Select
ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields( _ "[Товар].[_Код товара].[_Код товара]").VisibleItemsList = ArrSKU EndIf
'Далее все относится к БЮ. Аналогично СКЮ If CountRowBU <> -1Then
Sheets("Куб1").Select Dim ArrBU() ReDim ArrBU(0To CountRowBU) Dim BU AsInteger
For BU = 0To CountRowBU
ArrBU(BU) = "[Канал продаж].[Канал продаж].&[" & Range("J" & BU + 2).Value & "]" Next BU
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic AsObject With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual EndWith
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 = 1ToUBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1ToUBound(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 > 0Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = TrueElse .PivotItems(it.Value).Visible = False Next it EndIf EndWith Next f Next pt Next ws With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True EndWith EndSub PublicFunction FDynVal(FrmContrVal) IfLen(FrmContrVal & "") = 0Then
FDynVal = "" Else SelectCaseVarType(FrmContrVal) Case5
FDynVal = CStr(FrmContrVal) Case8
FDynVal = FrmContrVal Case7
FDynVal = Format(FrmContrVal, "m\/d\/yyyy") EndSelect EndIf EndFunction
Ошибка в
With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]")
Pelena, В итоге сейчас код выглядит так
Sub ОбновлениеСводной() 'Шаг 1: Объявляем переменные Dim ws As Worksheet Dim pt As PivotTable, crit, i&, f&, it As PivotItem, arrField Dim odic AsObject With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual EndWith
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 = 1ToUBound(arrField, 2) Set odic = CreateObject("Scripting.Dictionary") For i = 1ToUBound(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 > 0Then For Each it In .PivotItems If odic.Exists(it.Value) Then .PivotItems(it.Value).Visible = TrueElse .PivotItems(it.Value).Visible = False Next it EndIf EndWith Next f Next pt Next ws With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True EndWith EndSub PublicFunction FDynVal(FrmContrVal) IfLen(FrmContrVal & "") = 0Then
FDynVal = "" Else SelectCaseVarType(FrmContrVal) Case5
FDynVal = CStr(FrmContrVal) Case8
FDynVal = FrmContrVal Case7
FDynVal = Format(FrmContrVal, "m\/d\/yyyy") EndSelect EndIf EndFunction
Ошибка в
With pt.PivotFields("[Товар].[_Код товара].[" & arrField(1, f) & "]")
Заказчик и _Код заказчика поставила наобум, надо изменить на адекватные
Используйте тот код, что нашли, только внесите исправления. Файл имеется в виду, тот, что был приложен. Если критерии расположены по-другому, считайте сами, с какого столбца и с какой строки начинать
По Вашему файлу надо внести исправления. На примере Заказчика
Заказчик и _Код заказчика поставила наобум, надо изменить на адекватные
Используйте тот код, что нашли, только внесите исправления. Файл имеется в виду, тот, что был приложен. Если критерии расположены по-другому, считайте сами, с какого столбца и с какой строки начинатьPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816