2011-11-21 12 views
7

既存のピボットテーブルデータソースを更新する方法を知りたいと思います。私はMicrosoft.Office.Interop.Excelを使用しており、Excel 2010のユーザーをターゲットにしています。C#を使用してピボットテーブルデータソースを更新する方法は?

現在、ピボットテーブルを更新することはできますが、さらに多くの行が追加されるとピボットテーブルのデータソースにこれらの行を含めたい場合があります。たとえば、Excelで表示されたピボットテーブルのデータソースはDataSourceWorksheet!$A$2:$U$26で、アップデート/リフレッシュのExcelファイルコードが実行された後、DataSourceWorksheet!$A$2:$U$86(60行以上)に変更したいと考えています。

は、ここに私のコード

Application excelApplication = new Application(); 
Workbooks workbooks = excelApplication.Workbooks; 
wrkBook = workbooks.Open(EXCEL_DOCUMENT_PATH, Missing.Value, false, Missing.Value, 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, true, Missing.Value, Missing.Value, 
        Missing.Value, Missing.Value, Missing.Value); 

/* update data source worksheet code here (omitted for example) */ 

Worksheet pivotWorkSheet = (Worksheet)wrkBook.Sheets[PIVOT_SHEET_NAME]; 
PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

/* I would like to update the pivot tables data source here... 

    I could use Range object from data source worksheet... 

    Basically just want to tell pivot table, use these cells now... */ 

pivot.RefreshTable(); 

/* cleanup code here (omitted for example) */ 

だけwrkBook.PivotTableWizard(...)を使用して再度ピボットテーブルを再生成することであろう、働くかもしれソリューションの簡易版です。ただし、選択したフィールド、行、列などを変更してピボットテーブルを変更したいと思うので、私の状況では機能しません。データソースワークシートが変更されたときに更新するだけで済みます。

+1

これがなぜ投票されたのか分かりませんが、私にとっては妥当な質問のようです。 – neontapir

+0

ええ、これは私がMSDNや類似のリソースで簡単に見つけたものではありません。 –

答えて

2

この問題の解決策は、ピボットテーブルデータソースのExcelでDynamic Named Rangeを使用することでした。ダイナミックレンジ命名式がOFFSET functionなどのようなCOUNTA functionの組み合わせを使用しています。

=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1) 

上記の式は、A2内のセルの範囲になります:データを持っているA1000。私の場合は、複数の列が必要でしたが、データをチェックするためにはより広い範囲の行が必要でした。私は単純に文字列値を渡す

Names wrkBookNames = wrkBook.Names; 
string dynamicRangeFormula = "=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1)"; 
wrkBookNames.Add("MyNamedRange", dynamicRangeFormula); 

をして、新しいピボットテーブルを作成するときに、データソースとしてその名前付き範囲を指定するには:

は今すぐ名前付き範囲を作成するには、C#で、私は次のように使用しましたPivotTableWizard方法に範囲名:行がDataSourceWorkSheet内で追加または削除されたとき

//get range for pivot table destination 
Range pivotDestinationRange = pivotWorkSheet.get_Range("A1", Type.Missing); 

wrkBook.PivotTableWizard(
        XlPivotTableSourceType.xlDatabase, 
        "MyNamedRange", 
        pivotDestinationRange, 
        pivotTableName, 
        true, 
        true, 
        true, 
        true, 
        Type.Missing, 
        Type.Missing, 
        false, 
        false, 
        XlOrder.xlDownThenOver, 
        0, 
        Type.Missing, 
        Type.Missing 
        ); 

すぐピボットテーブルのみ名前付き範囲を使用して、データ値を持つセルを参照します。ピボットテーブルを更新することは、今ちょうど期待通りに動作しますが、RefreshTableのを呼び出すことによって:

PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

pivot.RefreshTable(); 

全体的に、これは新しいExcelブックを作成したり、既存のワークブックを更新するために、メソッド内で起こってしまいます。既存のワークブックに対してこのメ​​ソッドを呼び出すには、動的な名前付き範囲を使用して既存のピボット・テーブルが作成され、それに応じて更新されるという事実に依存するようになりました。

+0

他のSOユーザーがこの情報を参考にしたり、実際の例を見たい場合は、お知らせください。 –

5

その非常にシンプルな...

pivot.SourceData = "SheetName!R1C1:R18C18" 
pivot.RefreshTable(); 

ザッツすべて..

は常に我々が行と列の形式を与える必要があり、覚えておいてください。

など。そのような

"SheetName!" + R + Rowstartingnumber + C + Column StartingNumber : R + Rowendnumber + C + Column Endnumber. 

すなわち "SheetName!R1C1:R12C13"

このように"SheetName!$A$1:$Q$18"を指定しても機能しません。

関連する問題