Автоматическое обновление сводной таблицы Excel 2007 после обновления данных на отдельном листе из БД SQL Server - PullRequest
2 голосов
/ 12 января 2011

Фон:

У меня есть три листа в Excel.

  1. Сводная таблица с сводной таблицей, которая извлекает данные из # 2 ниже
  2. Таблица данных, которая извлекает данные из БД SQL Server.(Извлекает тип категории и значение в долларах)
  3. Лист, содержащий кнопку для обновления как данных, так и в идеале сводной таблицы.

Проблема: Когда я нажимаю на кнопку, таблица данных обновляется правильно, а сводная таблица - нет.Эта рабочая книга автоматически запускается в 5 часов утра и отправляет результаты людям в формате PDF, поэтому мне нужно найти способ обновить эту сводную таблицу перед созданием, отправкой и закрытием рабочей книги.

Что я пробовал: Во-первых, когда нажимается кнопка, она запускается:

ActiveWorkbook.RefreshAll
Application.CalculateFull

Она правильно обновляет таблицу данных, только не сводку.

У меня естьпробовал:

  • Добавление следующих команд между двумя командами выше и после обеих безрезультатно:
Sheets("Summary").PivotTables("PivotTable6").PivotCache.Refresh
Sheets("Summary").PivotTables("PivotTable6").RefreshTable
  • Я попытался выполнить обе эти командыдважды (спина к спине), например:
ActiveWorkbook.RefreshAll
Application.CalculateFull
ActiveWorkbook.RefreshAll
Application.CalculateFull

В надежде, что он получит данные при первом запуске и успешно обновит сводку во втором.Не сработало.

  • Я пытался обмануть Excel, заставив его подумать, что я закрыл и снова открыл книгу, а затем повторно запустил обновления:
 ThisWorkbook.Saved = True
 Workbooks(1).Activate
 ActiveWorkbook.RefreshAll
 Application.CalculateFull

Причина, по которой я пыталсяэто потому, что после запуска книги (сводка не обновляется) я сохраняю и закрываю.Я снова открываю (поворот по-прежнему неверен, данные верны), я повторно запускаю (данные снова и снова верны), и теперь сводка верна.Так что я надеялся смоделировать это.

На данный момент я не могу думать ни о чем другом.Я нахожусь в точке, где я не думаю, что Excel может сделать это.Еще кое-что.Первоначально у нас были данные, поступающие непосредственно в сводную таблицу из БД SQL Server, но мы постоянно получали эти ошибки, поэтому собирались использовать другой подход:

  • Удаленная часть: /xl/pivotTables/pivotTable1.xml часть.(Представление сводной таблицы)
  • Удаленная часть: /xl/pivotTables/pivotTable5.xml часть.(Сводная таблица)
  • Удаленные записи: Свойства рабочей книги из /xl/workbook.xml part (Workbook)
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
     <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <logFileName>error014800_01.xml</logFileName> 
        <summary>Errors were detected in file 'T:\Reports\RP\Archive\Historical Excel\01-11\RP_01-07-11.xlsm'</summary> 

        <removedParts summary="Following is a list of removed parts:">
            <removedPart>Removed Part: /xl/pivotTables/pivotTable1.xml part. (PivotTable view)</removedPart> 
            <removedPart>Removed Part: /xl/pivotTables/pivotTable5.xml part. (PivotTable view)</removedPart> 
        </removedParts>

        <removedRecords summary="Following is a list of removed records:">
           <removedRecord>Removed Records: Workbook properties from /xl/workbook.xml part (Workbook)</removedRecord> 
        </removedRecords>
     </recoveryLog>

Любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Вы можете использовать событие изменения листа для запуска обновления в сводной таблице.

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo ErrHandler
    Application.EnableEvents = False

    'Check to see if the worksheet range raising this event overlaps the range occupied by our data dump
    If (Not (Intersect(Target, ActiveSheet.ListObjects("DATA_TABLE_NAME_HERE").Range) Is Nothing)) Then

        'If it does, then refesh the pivot tables that depend on this data (not automatic, name each table pivot table explicity)
        ActiveSheet.PivotTables("PIVOT_TABLE_NAME_HERE").RefreshTable

    End If

ErrHandler:
    Application.EnableEvents = True
End Sub

Возможно, вам придется заменить ActiveSheet на Sheets("whatever") в зависимости от того, как будет выглядеть ваша рабочая книга.

1 голос
/ 19 апреля 2012

Я был в такой же ситуации и обнаружил, что это связано с включением фонового запроса для соединения.

Я включил следующее в большинство моих листов с этой конфигурацией, чтобы заставить параметры запретить фоновые запросы.

Sub SetNoBackgroundQuery()
      Dim i As Integer
      Dim j As Integer
      i = ThisWorkbook.Connections.Count
      If i = 0 Then End
      For j = 1 To i
        ThisWorkbook.Connections(j).ODBCConnection.BackgroundQuery = False
    '    Debug.Print ThisWorkbook.Connections(j).Name

  Next j
End Sub
0 голосов
/ 14 января 2011

Не думаю, что это хорошая идея - вам действительно следует использовать службы Analysis Services для обновления данных.

Насколько велика база данных / запрос?

IВы использовали сводные таблицы Excel для баз данных 5 ТБ, и это всегда дает результаты менее секунды.Потому что я пользовался службами аналитики.

...