(Excel 2002) Обновление форматирования, потерянного в сводной диаграмме - PullRequest
2 голосов
/ 24 июня 2009

У меня есть набор сводных таблиц / диаграмм, автоматически созданных из кода VBA с пользовательским форматированием.

Когда я меняю выбор данных, отображаемых в раскрывающемся списке на диаграмме, пользовательское форматирование возвращается к отображению по умолчанию для типа диаграммы. Базовые данные диаграммы не изменяются, а отображаются только те, которые отображаются на графике. Что мне нужно делать, чтобы сохранять это пользовательское форматирование каждый раз, когда я изменяю выбор элемента сводки в поле строки?

Редактировать 1: Базовые данные для сводной таблицы не изменяются. Однако каждый раз, когда я меняю фильтр в строке, столбце или поле страницы, обновленная сводная диаграмма теряет исходный формат, установленный кодом VBA.

Редактировать 2: это относится только к версиям Excel, более ранним, чем Excel 2007.

1 Ответ

1 голос
/ 24 июня 2009

Мне кажется, что код VBA генерирует сводную таблицу / диаграмму, а затем вы пытаетесь настроить ее позже. К сожалению, в VBA, когда вы обновляете сводную таблицу / диаграмму, все пользовательское форматирование теряется. Excel в основном создает новый каждый раз.

Если вы выполнили форматирование вручную в Excel, я думаю, что Excel отследит это и сохранит ваше форматирование при изменении данных. Пример, который я могу вспомнить, - это если вы случайно удалили лист, который вы отменили, однако, если вы удалите лист в VBA, то отменить это невозможно.

Я бы попробовал это как решение.

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

Sub GeneratePivotTable(rng as Range, var1 as Variant, var2 as Variant)
    ' Code here that makes your Pivot Table
    ' pass whatever you need to get the job done
End Sub

Sub FormatPivotTable(rng as Range, var1 as Variant, var2 as Variant)
    ' Code here to format pivot table given range and other information
    ' You might even be able to just directly pass a PivotTable object :D
End Sub

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

Sub GenerateAndFormatPivotTable(rng as Range, var1 as Variant, var2 as Variant)
    Call GeneratePivotTable(rng, var1, var2)
    ' Maybe some processing here to set up the next call
    Call FormatPivotTable(rng, var1, var2)
End Sub

Если вы хотите передать сводную таблицу как объект, вы можете сделать что-то аккуратное, как ....

Function GeneratePivotTable(variables as Variant) as PivotTable
    ' Generate your pivot table and return it
    GeneratePivotTable = myPivotTableThatIMade
End Function

Sub FormatPivotTable(aPivotTableThatYouMake as PivotTable)
    ' Code that formats your PivotTable
End Sub

Sub GenerateAndFormatPivotTable(rng as Range, var1 as Variant, var2 as Variant
    Call FormatPivotTable(GeneratePivotTable(variables as Variant)
End Sub

Вы делаете все это, поэтому, если вы создаете таблицу, а затем должны ее настроить, вы можете использовать эту FormatPivotTable для форматирования обновленной таблицы.

Для дополнительного безумия, пусть лист с огнем сводной таблицы - это Worksheet.Change или Worksheet.Activate для поиска сводной таблицы и вызова функции форматирования: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...