数据透视表手动更新不工作(Pivot Table Manual Update Not Working

2019-10-21 09:42发布

我有一个数据透视表,和我想选择基于阵列中的值一定枢纽项目。 我需要这个过程走得更快,所以我一直在使用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

Answer 1:

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



文章来源: Pivot Table Manual Update Not Working