2014-12-11 4 views
1

У меня сводная таблица, и я пытаюсь выбрать определенные опорные элементы на основе значений в массиве. Мне нужно, чтобы этот процесс работал быстрее, поэтому я попытался использовать application.calculation = xlcalculationmanual и pivottables.manualupdate = true, но, похоже, они не работают; сводная таблица все еще пересчитывает каждый раз, когда я меняю элемент поворота.Обновление таблицы сводных таблиц не работает

Есть ли что-то, что я могу сделать по-другому, чтобы 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 

ответ

0

pivottable.ManualUpdate [= настройка]
Правда вызывает RefreshTable для удаления данных из сводной таблицы, а не освежает его
Ложные позволяет RefreshTable нормально работать ,
По умолчанию False.
Это свойство сбрасываются на значение False автоматически после процедуры вызова концов (важно)

Это свойство должно быть установлено истине только, прежде чем сделать обновление (например, изменение поворота элемент 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, вы можете проверить следующее:
Pivot Refresh vs. Update – is there a real difference?

Ссылки:
Название: Программирование Excel с VBA и .NET
По : Jeff Webb, Steve Saunders
Печать ISBN: 978-0-596-00766-9 | ISBN 10: 0-596-00766-3
Ebook ISBN: 978-0-596-15951-1 | ISBN 10: 0-596-15951-X

Смежные вопросы