Страницы: 1
RSS
Как автоматически обновлять сводные таблицы?
 
На листе несколько сводных таблиц. Исходные данные на другом. Как сделать чтобы при изменении исходных данных автоматически обновлялись все сводные таблицы?
 
На листе несколько сводных таблиц. Исходные данные на другом. Как сделать чтобы при изменении исходных данных автоматически обновлялись все сводные таблицы?
 
В код листа с исходными данными:  
Private Sub Worksheet_Change(ByVal Target As Range)  
Sheets("Лист2").PivotTables("СводнаяТаблица1").PivotCache.Refresh  
End Sub  
где Лист2 - лист со сводной таблицей  
СводнаяТаблица1 - имя сводной.  
Или все таблицы листа:  
Private Sub Worksheet_Change(ByVal Target As Range)  
For Each PvTable In Sheets("Лист2").PivotTables  
   PvTable.PivotCache.Refresh  
Next  
End Sub
 
Дисклеймер!  
Всмы, Ахтунг!  
при большом объеме данных, большом количестве сводных таблиц можно смотреть целый день, как XL обновляет  
Еще рекомендую. Если у сводных один источник данных, то и строить их надо одну на основе другой - обновляются одновременно и кеш (а значит и размер файла) уменьшается в разы.
 
Дисклеймер!  
Всмы, Ахтунг!  
при большом объеме данных, большом количестве сводных таблиц можно смотреть целый день, как XL обновляет  
Еще рекомендую. Если у сводных один источник данных, то и строить их надо одну на основе другой - обновляются одновременно и кеш (а значит и размер файла) уменьшается в разы.
 
спасибо,Лузер!
 
Спасибо!  
А можно как-нибудь при таком обновлении ещё и сортировку по алфавиту осуществлять? А то при таком автоматическом обновлении сортировка не производится, а если все делать вручную - то сортировка по алфавиту делается.
 
Подскажите, пожалуйста, по автоматическому обновлению сводных при изменении данных на текущем листе:  
 
1) обновляю 6 сводных таблиц, источником данных для которых являются 2 листа (~10k строк на лист), следующим кодом:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 Worksheets("pivot_sheet1").PivotTables("pivot1_1").PivotCache.Refresh  
 Worksheets("pivot_sheet1").PivotTables("pivot1_2").PivotCache.Refresh  
 Worksheets("pivot_sheet1").PivotTables("pivot1_3").PivotCache.Refresh  
 Worksheets("pivot_sheet2").PivotTables("pivot2_1").PivotCache.Refresh  
 Worksheets("pivot_sheet2").PivotTables("pivot2_2").PivotCache.Refresh  
 Worksheets("pivot_sheet2").PivotTables("pivot2_3").PivotCache.Refresh  
End Sub  
 
Возможно можно как-то оптимизировать и ускорить обновление? Поиском нашел тему про принудительное использование одного кэша для всех сводных таблиц, но не смог применить это к нескольким источникам сводных:  
http://www.planetaexcel.ru/forum.php?thread_id=26093  
 
2) как задать обновление только при изменении а)определенной ячееки б)диапазона(выделен желтым в примере) в)столбца, так как сейчас все обновляется при изменении любой ячейки листа, что несколько неудобно.  
 
зы: на всякий случай пример во вложении
 
возможно описание сверху несколько сумбурно, попробую изложить просьбу проще..  
 
на листе data есть код который при изменении данных на листе обновляет 6 сводных на листах pivot_sheet1 и pivot_sheet2. Собственно сам код:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
Worksheets("pivot_sheet1").PivotTables("pivot1_1").PivotCache.Refresh  
Worksheets("pivot_sheet1").PivotTables("pivot1_2").PivotCache.Refresh  
Worksheets("pivot_sheet1").PivotTables("pivot1_3").PivotCache.Refresh  
Worksheets("pivot_sheet2").PivotTables("pivot2_1").PivotCache.Refresh  
Worksheets("pivot_sheet2").PivotTables("pivot2_2").PivotCache.Refresh  
Worksheets("pivot_sheet2").PivotTables("pivot2_3").PivotCache.Refresh  
End Sub  
 
вопрос 1 (основной)  
сейчас как сделать обновление сводных при изменении только:  
а) определенной ячееки (например B3)  
б) диапазона (например B3:C4)    
в) столбца (например B)  
 
вопрос 2 (побочный)  
можно ли как-то увеличить скорость обновления сводных?
 
по первому вопросу:  
обратите внимание, что у обработчика события Worksheet_Change есть аргумент - ByVal Target As Range.  
если ваша справка по VBA перестала быть бесплатной или другие какие капризы у неё в данный момент, то я вам поясняю: это как раз и есть ссылка на ячейку или диапазон, изменение значения в которой (котором) вызвало данный обработчик.  
 
для решения вашей задачи нужно анализировать (проверять) этот диапазон на пересечение с нужным вам диапазоном и, в зависимости от результата сравнения выполнять те или иные действия (или не выполнять никакие)  
 
например:  
а) if not intersect(target, me.[b3]) is nothing then ...
б) if not intersect(target, me.[b3:c4]) is nothing then ...
в) if not intersect(target, me.columns(2)) is nothing then ...  
 
ps всё-таки рекомендую один раз заплатить справке, чем мучиться :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=user0}{date=29.07.2012 04:24}{thema=}{post}...можно ли как-то увеличить скорость обновления сводных?{/post}{/quote}Уверен что нельзя.    
 
Обновить сразу все сводные можно так:  
Private Sub Worksheet_Change(ByVal Target As Range)  
ActiveWorkbook.RefreshAll  
End Sub
 
ikki, Serge 007  
Спасибо  
 
Я бы с удовольствием почитал справку по VBA, но к сожалению на данном этапе я мало что там пойму, а так я только за самобразование )    
 
Еще раз спасибо!
 
у меня не получается вставить код обновления всех данных в книге при изменении данных в исходном листе: после ввода данных вылезает вот что:
 
Потому что эта процедура уже описана выше.
 
но все равно не работают варианты -:((
 
...
Учимся сами и помогаем другим...
 
Получилось все!!!!!!!!!!  
 
только эту строчку сунуть пришлось не после End If, а в начале всех записей, иначе первый макрос не работал!  
 
 
очень большое спасибо!!!!
Страницы: 1
Читают тему
Loading...