我有一组从 VBA 代码自动创建的具有自定义格式的数据透视表/图表。
当我从图表的下拉列表中更改要显示的数据选择时,自定义格式将恢复为图表类型的默认显示。基础图表数据不会改变,只会改变图表上显示的内容。每次更改行字段中的数据透视项目选择时,我必须做些什么来保留该自定义格式?
编辑 1:数据透视表的基础数据不会改变。但是,每次我更改行、列或页面字段上的过滤器时,更新的数据透视图都会丢失 VBA 代码设置的原始格式。
编辑 2:这仅适用于 Excel 2007 之前的 Excel 版本。
最佳答案
在我看来,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
关于excel - (Excel 2002) 数据透视图更新时格式丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1036438/