我有一个数据透视表,和我想选择基于阵列中的值一定枢纽项目。 我需要这个过程走得更快,所以我一直在使用application.calculation = xlcalculationmanual和pivottables.manualupdate =真正的尝试,但都似乎工作; 数据透视表仍每个更改枢轴项目时间重新计算。
有什么我可以做的不同,以防止Excel每次重新计算?
这里是我的代码:
Application.Calculation = xlCalculationManual
'code to fill array with list of companies goes here
dim PT As Excel.PivotTable
Set PT = Sheets("LE Pivot Table").PivotTables("PivotTable1")
Sheets("LE Pivot Table").PivotTables("PivotTable1").ManualUpdate = True
dim pivItem As PivotItem
'compare pivot items to array. If pivot item matches an element of the array, make it visible=true, otherwise, make it visible=false
For Each pivItem In PT.PivotFields("company").PivotItems
pivItem.Visible = False 'initially make item unchecked
For Each company In ArrayOfCompanies()
If pivItem.Value = company Then
pivItem.Visible = True
End If
Next company
Next pivItem
pivottable.ManualUpdate [=设定]
真正的原因RefreshTable从透视表中清除数据,而不是刷新它
假允许RefreshTable正常工作。
默认为false。
调用过程结束后会自动将此属性重置为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属性更改不留长(在我的测试中,我看得出来,它得到尽快恢复到假的,所以这就是为什么我建议你把它设置为true,每当你想做出改变用于枢轴项)
有关拿什么在Excel中更新的详细信息,您可以检查以下内容:
透视刷新与升级-有没有真正的区别?
参考文献:
标题: 用VBA和.NET编程的Excel
由: 杰夫·韦伯,史蒂夫·桑德斯
打印ISBN:978-0-596-00766-9 | ISBN 10:0-596-00766-3
电子图书的ISBN:978-0-596-15951-1 | ISBN 10:0-596-15951-X