pivottable.ManualUpdate [ = setting ]
True 导致 RefreshTable 从数据透视表中清除数据,而不是刷新它
False 允许 RefreshTable 正常工作。
默认为假。
调用过程结束后,此属性自动重置为 False(重要)
在进行更新之前,应将此属性设置为 true(例如,更改数据透视项 Visible 属性)
下面是一些用 C# 编写的代码作为示例:
private void FilterByPivotItems(PivotField pf, List<string> pivotItemNames)
{
PivotItems pis = pf.ChildItems;
if (pf.Orientation != 0)
{
int oldAutoSortOrder = 0;
if (pf.AutoSortOrder != (int)Constants.xlManual)
{
oldAutoSortOrder = pf.AutoSortOrder;
pf.AutoSort((int)Constants.xlManual, pf.Name);
}
int pivotItemsCount = pf.PivotItems().Count;
for (int i = 1; i <= pivotItemsCount; i++)
{
PivotItem pi = pf.PivotItems(i);
// check if current pivot item needs to be hidden (if it exists in pivotItemNames)
var match = pivotItemNames.FirstOrDefault(stringToCheck => stringToCheck.Equals(pi.Value));
if (match == null)
{
TryFilterPivotItems(pi, false, true);
}
else
{
TryFilterPivotItems(pi, true, true);
}
}
if (oldAutoSortOrder != 0)
{
pf.AutoSort(oldAutoSortOrder, pf.Name);
}
PivotTable pt = pf.Parent as PivotTable;
if (pt != null)
{
// changing a pivot item triggers pivot table update
// so a refresh should be avoided cause it takes a lot and is unnecessary in this case
pt.Update();
}
}
}
private void TryFilterPivotItems(PivotItem currentPI, bool filterValue, bool deferLayoutUpdate = false)
{
try
{
PivotField pf = currentPI.Parent;
PivotTable pt = pf.Parent as PivotTable;
if (currentPI.Visible != filterValue)
{
if (deferLayoutUpdate == true && pt != null)
{
// just keep these three lines stick together, no if, no nothing (otherwise ManualUpdate will reset back to false)
pt.ManualUpdate = true;
currentPI.Visible = filterValue;
// this may be redundant since setting Visible property of pivot item, resets ManualUpdate to false
pt.ManualUpdate = false;
}
else
{
currentPI.Visible = filterValue;
}
}
}
catch (Exception ex)
{
}
}
private void TryFilterPivotItems(PivotField pf, string itemValue, bool filterValue, bool deferLayoutUpdate = false)
{
try
{
PivotItem currentPI = pf.PivotItems(itemValue);
TryFilterPivotItems(currentPI, filterValue, deferLayoutUpdate);
}
catch (Exception ex)
{
}
}
作为结论,ManualUpdate 属性更改不会持续很长时间(在我的测试中,我可以看到它会尽快重置为 false,因此我建议您在想要进行更改时将其设置为 true对于枢轴项目)
有关 Excel 中更新意味着什么的更多信息,您可以查看以下内容:
数据透视刷新与更新 - 有真正的区别吗?
参考:
标题:使用 VBA 和 .NET 编程 Excel
作者:Jeff Webb、Steve Saunders
打印 ISBN:978-0-596-00766-9 | ISBN 10:0-596-00766-3
电子书 ISBN:978-0-596-15951-1 | 国际标准书号 10:0-596-15951-X