2011-01-11 8 views
2

Hintergrund:Auto Refresh Excel 2007 Pivot-Tabelle nach Daten in separatem Blatt aktualisiert von SQL Server DB

Ich habe drei Blätter in Excel.

  1. Eine Zusammenfassung mit einem Drehtisch, die Daten von # 2 unten
  2. ein Datenblatt, das Datum zieht aus einer SQL Server DB zieht. (Zieht einen Kategorietyp und einen Dollarwert)
  3. Ein Blatt, das über eine Schaltfläche verfügt, um sowohl die Daten als auch im Idealfall die Pivot-Tabelle zu aktualisieren.

Problem: Wenn ich auf die Schaltfläche klicken, frischt das Datenblatt richtig, aber die Pivot-Tabelle nicht. Diese Arbeitsmappe wird automatisch um 5 Uhr morgens ausgeführt und sendet die Ergebnisse als PDF an Personen. Daher muss ich herausfinden, wie diese Pivot-Tabelle aktualisiert werden kann, bevor die PDF generiert, gesendet und die Arbeitsmappe geschlossen wird.

Was ich versucht habe: Zuerst wird, wenn die Schaltfläche geklickt wird es läuft:

ActiveWorkbook.RefreshAll 
Application.CalculateFull 

Es macht den Datenblatt aktualisieren richtig, nur nicht der Schwenk.

Ich habe versucht:

  • die folgenden Befehle zwischen den beiden oben genannten Befehle und nachdem beide ohne Erfolg Hinzufügen:
Sheets("Summary").PivotTables("PivotTable6").PivotCache.Refresh 
Sheets("Summary").PivotTables("PivotTable6").RefreshTable 
  • ich versucht habe, zweimal diese beiden Befehle ausführen (Rücken an Rücken) so:
ActiveWorkbook.RefreshAll 
Application.CalculateFull 
ActiveWorkbook.RefreshAll 
Application.CalculateFull 

In der Hoffnung, dass es Daten im ersten Lauf erhalten würde, und eine erfolgreiche Pivot-Aktualisierung in der Sekunde haben. Hat nicht funktioniert.

  • Ich habe versucht, Excel zu denken, zu betrügen ich geschlossen und wieder geöffnet, die Arbeitsmappe und reran dann die Auffrischungen: erfrischend
ThisWorkbook.Saved = True 
Workbooks(1).Activate 
ActiveWorkbook.RefreshAll 
Application.CalculateFull 

Der Grund, warum ich versuchte, dies liegt daran, dass nach der Arbeitsmappe ausgeführt wird (Pivot nicht) Ich spare und schließe. Ich öffne wieder (Pivot ist immer noch falsch, Daten sind richtig), ich wiederhole es, (Daten sind wieder richtig und gleich) und jetzt ist der Pivot korrekt. Also habe ich gehofft, das zu simulieren.

An diesem Punkt kann ich an nichts anderes denken. Ich bin an dem Punkt, an dem ich nicht glaube, dass Excel das kann. Eine Sache noch. Ursprünglich hatten wir die Daten direkt in die Pivot-Tabelle von SQL Server DB kommen, aber wir haben immer wieder diese Fehler, so dass wir einen anderen Ansatz nehmen wollten:

  • entfernt Teil: /xl/pivotTables/pivotTable1.xml Teil. (PivotTable-Ansicht)
  • entfernte Teil: /xl/pivotTables/pivotTable5.xml Teil.(Pivottable-Ansicht)
  • entfernt Aufzeichnungen: Arbeitsmappe Eigenschaften von /xl/workbook.xml Teil (Arbeitsmappe)
<?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> 

Jede Hilfe wird sehr geschätzt.

+0

Obwohl es interessant wäre zu sehen, ob es eine Lösung gab. Ich fand heraus, warum der Pivot-Tisch immer wieder kaputt ging. Ich habe ein Datumsfeld aus der Abfrage entfernt und die Pivot-Tabelle nicht mehr geöffnet. Grundsätzlich Versuch und Irrtum, alle Felder zu entfernen und zurück zu addieren, bis es brach. Nicht sicher, was an diesem einen Feld seltsam war. – Mark

Antwort

0

Ich denke nicht, dass dies eine gute Idee ist - Sie sollten wirklich Analysis Services verwenden, um die Daten zu aktualisieren.

Wie groß ist die Datenbank/Abfrage?

Ich habe Excel-Pivot-Tabellen für 5tb-Datenbanken verwendet und es liefert immer Ergebnisse von unter einer Sekunde. Weil ich Analysis Services verwendet habe.

+0

danke für die Antwort Aaron. Ich bin nicht mit Analyseservices vertraut, da ich in Excel normalerweise nicht viel mache und diesen Prozess geerbt habe. Die Datenbanktabellen sind 15MM-Zeilen, ziehen jedoch nur einige tausend basierend auf Abfragekriterien ein. Ich werde Analysedienste nachschlagen. Haben Sie Empfehlungen, um mehr Informationen zu erhalten? – Mark

1

Sie können das geänderte Arbeitsblatt-Ereignis verwenden, um eine Aktualisierung für Ihre Pivot-Tabelle auszulösen.

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 

Möglicherweise müssen ActiveSheet mit Sheets("whatever") ersetzen, je nachdem wie Ihre Arbeitsmappe Rahmen auf.

1

Ich war in der gleichen Situation, und ich fand heraus, dass es aufgrund der Aktivierung der Hintergrundabfrage auf der Verbindung war.

Ich füge in die meisten meiner Blätter mit dieser Konfiguration die folgenden ein, um zu erzwingen, dass die Einstellungen Hintergrundabfragen verbieten.

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