Мне кажется, что код 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