(Excel 2002)格式化数据透视图更新丢失

时间:2009-06-24 04:41:57

标签: excel excel-vba vba

我有一组自动从VBA代码创建的带有自定义格式的数据透视表/图表。

当我从图表的下拉列表中更改要显示的数据选择时,自定义格式将恢复为图表类型的默认显示。基础图表数据不会更改,只会更改图表上显示的内容。每次更改行字段中的轴心项目选择时,我该怎么做才能保留自定义格式?

编辑1:数据透视表的基础数据不会更改。但是,每次我在行,列或页面字段上更改过滤器时,更新的数据透视表都会丢失VBA代码设置的原始格式。

编辑2:这仅适用于早于Excel 2007的Excel版本。

1 个答案:

答案 0 :(得分:1)

对我来说,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