Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Дублирование кэша сводной таблицы - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Дублирование кэша сводной таблицы (Макросы/Sub)
Дублирование кэша сводной таблицы
pabchek Дата: Среда, 24.02.2016, 12:18 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте, всем!
Маловато опыта, столкнулся с проблемой. В файле есть два листа со сводными таблицами, ссылающимися на один и тот же кэш (настраиваются по разному). Ранее столкнулся с тем, что выключалась галочка сохранения исходных данных, поэтому напрямую для каждой таблицы прописал включение этой галочки.
[vba]
Код
    R = Sheets("SI").Range("A" & Rows.Count).End(xlUp).Row
        Sheets("Форма").PivotTables("Форма_Свод").ChangePivotCache _
            ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="SI!A1:N" & R)
        Sheets("Форма").PivotTables("Форма_Свод").SaveData = True
        Sheets("Ассортимент").PivotTables("Ассортимент_Свод").ChangePivotCache _
            ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="SI!A1:N" & R)
        Sheets("Ассортимент").PivotTables("Ассортимент_Свод").SaveData = True
[/vba]
Но при этом получил задвоение кэша и, соответственно размера файла. Может кто помочь? Файл не прикладываю, как мне кажется, вопрос общий (если ошибаюсь, припарюсь на создание образца).


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеЗдравствуйте, всем!
Маловато опыта, столкнулся с проблемой. В файле есть два листа со сводными таблицами, ссылающимися на один и тот же кэш (настраиваются по разному). Ранее столкнулся с тем, что выключалась галочка сохранения исходных данных, поэтому напрямую для каждой таблицы прописал включение этой галочки.
[vba]
Код
    R = Sheets("SI").Range("A" & Rows.Count).End(xlUp).Row
        Sheets("Форма").PivotTables("Форма_Свод").ChangePivotCache _
            ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="SI!A1:N" & R)
        Sheets("Форма").PivotTables("Форма_Свод").SaveData = True
        Sheets("Ассортимент").PivotTables("Ассортимент_Свод").ChangePivotCache _
            ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="SI!A1:N" & R)
        Sheets("Ассортимент").PivotTables("Ассортимент_Свод").SaveData = True
[/vba]
Но при этом получил задвоение кэша и, соответственно размера файла. Может кто помочь? Файл не прикладываю, как мне кажется, вопрос общий (если ошибаюсь, припарюсь на создание образца).

Автор - pabchek
Дата добавления - 24.02.2016 в 12:18
_Boroda_ Дата: Среда, 24.02.2016, 12:32 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Если источник одинаков, то (теоретически), достаточно поставить только одну галку (в одной из сводных таблиц).
Я про строку
[vba]
Код
Sheets("Ассортимент").PivotTables("Ассортимент_Свод").SaveData = True
[/vba]
Хотя нет, если ставить макросом, то вторая галка не ставится.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЕсли источник одинаков, то (теоретически), достаточно поставить только одну галку (в одной из сводных таблиц).
Я про строку
[vba]
Код
Sheets("Ассортимент").PivotTables("Ассортимент_Свод").SaveData = True
[/vba]
Хотя нет, если ставить макросом, то вторая галка не ставится.

Автор - _Boroda_
Дата добавления - 24.02.2016 в 12:32
pabchek Дата: Среда, 24.02.2016, 13:53 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
Решил проблему, но не вопрос. Диапазон сводной задал через именованный диапазон
Код
=SI!$A$1:ИНДЕКС(SI!$N:$N;СЧЁТЗ(SI!$A:$A))

И блок назначения галочек сохранения исходных данных убрал совсем. Собственно, это можно было сразу сделать, но очень не люблю такие глобальные ссылки. Тем более что в таблице больше полумиллиона строк.
Тем не менее, если кто знает, как решить первичный вопрос, был бы благодарен за подсказку.


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
СообщениеРешил проблему, но не вопрос. Диапазон сводной задал через именованный диапазон
Код
=SI!$A$1:ИНДЕКС(SI!$N:$N;СЧЁТЗ(SI!$A:$A))

И блок назначения галочек сохранения исходных данных убрал совсем. Собственно, это можно было сразу сделать, но очень не люблю такие глобальные ссылки. Тем более что в таблице больше полумиллиона строк.
Тем не менее, если кто знает, как решить первичный вопрос, был бы благодарен за подсказку.

Автор - pabchek
Дата добавления - 24.02.2016 в 13:53
SLAVICK Дата: Среда, 24.02.2016, 14:04 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
А если так:
[vba]
Код
Sub d()
Dim pc As PivotCache, p1 As PivotTable, p2 As PivotTable
Set pc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets(1).Range("a1:b15000"))

Set p1 = Sheets(2).PivotTables("Сводная таблица1")
Set p2 = Sheets(2).PivotTables("Сводная таблица2")

With p1
    .SaveData = False
    .ChangePivotCache pc
End With

With p2
    .SaveData = False
    .CacheIndex = p1.CacheIndex
    .SaveData = True
End With
End Sub
[/vba]

Фишка в том, что для второй сводной нужно просто применить CacheIndex 1-й сводной ;)
Почитать можно тут :D
Если источник одинаков, то (теоретически), достаточно поставить только одну галку

Таки да. Главное чтобы CacheIndex одинаковый был

ЗЫ проверить количество кешей можно так:
[vba]
Код
Sub d1()
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
    Debug.Print pc.Index; " "; pc.SourceData; " "; pc.Parent.Name
Next
End Sub
[/vba]
К сообщению приложен файл: 7470034.xlsm (23.0 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 24.02.2016, 14:15
 
Ответить
СообщениеА если так:
[vba]
Код
Sub d()
Dim pc As PivotCache, p1 As PivotTable, p2 As PivotTable
Set pc = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets(1).Range("a1:b15000"))

Set p1 = Sheets(2).PivotTables("Сводная таблица1")
Set p2 = Sheets(2).PivotTables("Сводная таблица2")

With p1
    .SaveData = False
    .ChangePivotCache pc
End With

With p2
    .SaveData = False
    .CacheIndex = p1.CacheIndex
    .SaveData = True
End With
End Sub
[/vba]

Фишка в том, что для второй сводной нужно просто применить CacheIndex 1-й сводной ;)
Почитать можно тут :D
Если источник одинаков, то (теоретически), достаточно поставить только одну галку

Таки да. Главное чтобы CacheIndex одинаковый был

ЗЫ проверить количество кешей можно так:
[vba]
Код
Sub d1()
Dim pc As PivotCache
For Each pc In ActiveWorkbook.PivotCaches
    Debug.Print pc.Index; " "; pc.SourceData; " "; pc.Parent.Name
Next
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 24.02.2016 в 14:04
pabchek Дата: Среда, 24.02.2016, 14:31 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
CacheIndex 1-й сводной
Да, до этого додуматься мне пока сложновато))
проверить количество кешей
... я проверяю в Immediate
Код
? ActiveWorkbook.PivotCaches.Count


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
Сообщение
CacheIndex 1-й сводной
Да, до этого додуматься мне пока сложновато))
проверить количество кешей
... я проверяю в Immediate
Код
? ActiveWorkbook.PivotCaches.Count

Автор - pabchek
Дата добавления - 24.02.2016 в 14:31
SLAVICK Дата: Среда, 24.02.2016, 14:37 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
до этого додуматься мне пока сложновато))

Так я же ссылку дал на почитать :D . Там вроде все понятно написано.
... я проверяю в Immediate

Ну дык мой не только количество выдает а еще и лист и диапазон yes


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
до этого додуматься мне пока сложновато))

Так я же ссылку дал на почитать :D . Там вроде все понятно написано.
... я проверяю в Immediate

Ну дык мой не только количество выдает а еще и лист и диапазон yes

Автор - SLAVICK
Дата добавления - 24.02.2016 в 14:37
pabchek Дата: Среда, 24.02.2016, 14:40 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 931
Репутация: 218 ±
Замечаний: 0% ±

Excel 2007
Так я же ссылку дал
Не... после ссылки уже проще додуматься, без нее сложнее :)
а еще и лист и диапазон
Ну да, я ж не против (даже заплюсовал уже), просто мне надо было посчитать количество кэшей их и посчитал)))


"Учиться, учиться и еще раз учиться!"
WM: R399923528092
 
Ответить
Сообщение
Так я же ссылку дал
Не... после ссылки уже проще додуматься, без нее сложнее :)
а еще и лист и диапазон
Ну да, я ж не против (даже заплюсовал уже), просто мне надо было посчитать количество кэшей их и посчитал)))

Автор - pabchek
Дата добавления - 24.02.2016 в 14:40
RAN Дата: Среда, 24.02.2016, 14:40 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Там вроде все понятно написано.

Ну, насмешил! :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Там вроде все понятно написано.

Ну, насмешил! :D

Автор - RAN
Дата добавления - 24.02.2016 в 14:40
_Boroda_ Дата: Среда, 24.02.2016, 15:08 | Сообщение № 9
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Диапазон сводной задал через именованный диапазон ... но очень не люблю такие глобальные ссылки

Что-то в этом роде можно.
[vba]
Код
pcs_ = Sheets("Лист2").PivotTables("СводнаяТаблица2").PivotCache.SourceData
Sheets("Лист1").PivotTables("СводнаяТаблица1").ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create(SourceType:=xlDatabase, SourceData:=pcs_)
[/vba]
Пока отвлекли на работе, Славик уже практически аналогичное сделал


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Диапазон сводной задал через именованный диапазон ... но очень не люблю такие глобальные ссылки

Что-то в этом роде можно.
[vba]
Код
pcs_ = Sheets("Лист2").PivotTables("СводнаяТаблица2").PivotCache.SourceData
Sheets("Лист1").PivotTables("СводнаяТаблица1").ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create(SourceType:=xlDatabase, SourceData:=pcs_)
[/vba]
Пока отвлекли на работе, Славик уже практически аналогичное сделал

Автор - _Boroda_
Дата добавления - 24.02.2016 в 15:08
SLAVICK Дата: Среда, 24.02.2016, 16:26 | Сообщение № 10
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Не... после ссылки уже проще додуматься, без нее сложнее :)

Так проще додуматься или без нее сложнее :D
Ну, насмешил!

А я между строк читаю не вчитываясь lol
Что-то в этом роде можно.

Может я что то не так сделал - но у меня с таким подходом кеши задваиваются -
см. Файл - запустите сначала d а потом d1 :o
А вот если раскомментировать строку:
[vba]
Код
.CacheIndex = p1.CacheIndex
[/vba] - то все пучком :)
На сколько я понял из ссылки - excel сам не сравнивает кэши и их адреса - поэтому при обычном ChangePivotCache сначала разрывает связи со старым кешем а потом создает новый кэш. Чего не происходит если ему тыкнуть принудительно нужный кэш.
К сообщению приложен файл: 7470034-3-.xlsm (23.1 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 24.02.2016, 16:40
 
Ответить
Сообщение
Не... после ссылки уже проще додуматься, без нее сложнее :)

Так проще додуматься или без нее сложнее :D
Ну, насмешил!

А я между строк читаю не вчитываясь lol
Что-то в этом роде можно.

Может я что то не так сделал - но у меня с таким подходом кеши задваиваются -
см. Файл - запустите сначала d а потом d1 :o
А вот если раскомментировать строку:
[vba]
Код
.CacheIndex = p1.CacheIndex
[/vba] - то все пучком :)
На сколько я понял из ссылки - excel сам не сравнивает кэши и их адреса - поэтому при обычном ChangePivotCache сначала разрывает связи со старым кешем а потом создает новый кэш. Чего не происходит если ему тыкнуть принудительно нужный кэш.

Автор - SLAVICK
Дата добавления - 24.02.2016 в 16:26
_Boroda_ Дата: Среда, 24.02.2016, 16:36 | Сообщение № 11
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Ярослав, у меня твои макросы вообще не работают. Ругаются на .SaveData = False. Предположу, что зависит от версии Excel (вернее, версии сводной). Я делал в 2013, а в 2007 (как у Виктора) сейчас не могу поиграться, только дома.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЯрослав, у меня твои макросы вообще не работают. Ругаются на .SaveData = False. Предположу, что зависит от версии Excel (вернее, версии сводной). Я делал в 2013, а в 2007 (как у Виктора) сейчас не могу поиграться, только дома.

Автор - _Boroda_
Дата добавления - 24.02.2016 в 16:36
SLAVICK Дата: Среда, 24.02.2016, 16:42 | Сообщение № 12
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Александр - я перевложил файл :) попробуй.
.SaveData = False - можно вообще удалить - это я проверял изменение галочки при одинаковом кэше. :)
Я делал в 2013,

Ну дык а я в 2016-м - так что должно быть одинаково.


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеАлександр - я перевложил файл :) попробуй.
.SaveData = False - можно вообще удалить - это я проверял изменение галочки при одинаковом кэше. :)
Я делал в 2013,

Ну дык а я в 2016-м - так что должно быть одинаково.

Автор - SLAVICK
Дата добавления - 24.02.2016 в 16:42
_Boroda_ Дата: Среда, 24.02.2016, 17:16 | Сообщение № 13
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16666
Репутация: 6478 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Да, действительно, похоже, что его нужно именно носом ткнуть.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеДа, действительно, похоже, что его нужно именно носом ткнуть.

Автор - _Boroda_
Дата добавления - 24.02.2016 в 17:16
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Дублирование кэша сводной таблицы (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!