2011-01-11 28 views
2

背景:自動更新Excel 2007のピボットテーブルSQL ServerのDBから更新別々のシート内のデータの後に

私はExcelで3枚を持っています。

  1. SQLサーバDBからデータをプルデータシート
  2. 以下#2からデータをプルし、ピボットテーブルとサマリーシート。
  3. データと理想的にはピボットテーブルの両方をリフレッシュするためのボタンがあるシートです(カテゴリタイプとドル値を引き出します)。

問題:私はボタンをクリックすると 、データシートを正しく更新しますが、ピボットテーブルにはありません。このブックは自動的に午前5時に実行され、その結果がPDFとして人々に送信されるので、PDFが生成、送信、およびブックが閉じられる前に、ピボットテーブルを更新する方法を見つけなければなりません。 まず、ボタンがクリックされたときに、それが実行されます:

ActiveWorkbook.RefreshAll 
Application.CalculateFull 

それだけではないピボット、正しくデータシートを更新しないし、私が試してみました何

私が試した:私は二回これらのコマンドの両方を実行しようとしている

Sheets("Summary").PivotTables("PivotTable6").PivotCache.Refresh 
Sheets("Summary").PivotTables("PivotTable6").RefreshTable 
    • は上記と無駄に両方の後に2つのコマンドの次のコマンドを追加します(背中合わせに)このように:
    ActiveWorkbook.RefreshAll 
    Application.CalculateFull 
    ActiveWorkbook.RefreshAll 
    Application.CalculateFull 
    

    最初の実行でデータを取得し、2回目にピボットリフレッシュが成功することを期待しています。うまくいきませんでした。

ThisWorkbook.Saved = True 
Workbooks(1).Activate 
ActiveWorkbook.RefreshAll 
Application.CalculateFull 

ワークブックを実行した後(ピボットがリフレッシュしていないので、私はこれを試した理由は次のとおりです。私は私を閉じて再び開いたブックをして、リフレッシュをreran考えにExcelを騙ししようとしてい

  • )私は保存して閉じます。私は再び開きます(ピボットはまだ間違っています、データは正しいです)、私は再実行しました(データはまったく同じです)。そしてピボットは正しいです。だから私はこれをシミュレートすることを望んでいた。

    この時点では、他のことは考えられません。 Excelがこれを行うことができないと私は考えています。もう一つ。もともと私たちは、SQL ServerのDBからのピボットテーブルに直接来るデータを持っていましたが、我々は異なるアプローチを取るつもりだったので、我々は継続的にこれらのエラーを得た:削除

    • パート:/xl/pivotTables/pivotTable1.xml一部。 (ピボットテーブルビュー)
    • 削除された部分:/xl/pivotTables/pivotTable5.xml部分。(ピボットテーブルビュー)
    • 削除レコード:/xl/workbook.xml一部(ブック)
    <?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> 
    

    からワークブックのプロパティは、任意の助けを大幅に高く評価されています。

+0

修正があるかどうかは興味深いでしょうが、なぜピボットテーブルが壊れていたのか分かりました。私はクエリから日付フィールドを削除し、私のピボットテーブルの破壊を停止しました。基本的には試行錯誤してすべてのフィールドを削除し、壊れるまで追加し直してください。この1つのフィールドについて何が奇妙であったかはわかりません。 – Mark

答えて

0

これは良い考えではありません。実際には、データを更新するためにAnalysis Servicesを使用する必要があります。

データベース/クエリの量はどれくらいですか?

私はExcelのピボットテーブルを5tbのデータベースに対して使用しました。これは常に1秒未満の結果を示しています。 Analysis Servicesを使用していたためです。

+0

応答アーロンに感謝します。私は分析サービスに精通していません。なぜなら、通常はExcelで多くのことをやっておらず、このプロセスを継承しているからです。データベーステーブルは15MMの行ですが、クエリ基準に基づいて数千にしかなりません。私は分析サービスを調べます。あなたはより多くの情報を得るための勧告を持っていますか? – Mark

1

ワークシート変更イベントを使用して、ピボット・テーブルのリフレッシュをトリガーできます。

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 

あなたのワークブックがアップフレーム方法に応じSheets("whatever")ActiveSheetを交換する必要があるかもしれません。

1

私は同じ状況に陥りましたが、その理由は接続に関するバックグラウンドクエリが有効になっていることが原因であることがわかりました。

バックグラウンドクエリを禁止する設定を強制するために、この設定を使用しているほとんどのシートに次のものを含めます。

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 
関連する問題