Daniel
Daniel

Reputation: 31

SetSourceData for Chart returns HRESULT E_FAIL for PivotTable (Excel C#)

I want to create several PivotTables in a Sheet and from each PivotTable a Chart. The First PivotTable and the first Charts are created normaly. After I create the second PivotTable, I want to add a second Chart with the Source from the secound PivotTable, but this retuns than HRESULT E_FAIL and the second Chart has the source of the first PivotTable, which I am not able to change.

        string pitpivotNam1 = "table1";
        Dictionary<String, Excel.PivotField> pFields = new Dictionary<String, Excel.PivotField>();
        Excel.PivotTable pivotTable1 = null;
        Excel.Range pivotDest = excelApp.Worksheets["PivotTable"].Cells[1, 1];

        excelApp.Worksheets[sheetData].Activate();
        int countColmn = excelApp.Cells[1, 1].End(Excel.XlDirection.xlToRight).Column;
        var headerNam = excelApp.Range[excelApp.Cells[1, 1], excelApp.Cells[1, countColmn]].Value;

        // Data Source for PivotTable
        Excel.Range pivotData = excelApp.Worksheets[sheetData].usedRange;
        Excel.PivotCache pivotcache = excelApp.ActiveWorkbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, pivotData.Address/*, Excel.XlPivotTableVersionList.xlPivotTableVersion15*/);
        excelApp.Worksheets[sheetDest].Activate();
        pivotTable1 = excelApp.Worksheets[sheetDest].PivotTables.Add(pivotcache, pivotDest, pitpivotNam1, useDefault/*, Excel.XlPivotTableVersionList.xlPivotTableVersion15*/);

        // Create Dynamically PivotFields
        for (int i = 1; i <= headerNam.Length - 1; i++)
        {

            pFields.Add("test" + i.ToString(), (Excel.PivotField)pivotTable1.PivotFields(i));

        }

        pFields["test20"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields["test20"].Function = Excel.XlConsolidationFunction.xlAverage;
        pFields["test43"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields["test43"].Function = Excel.XlConsolidationFunction.xlAverage;
        pFields["test66"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields["test66"].Function = Excel.XlConsolidationFunction.xlAverage;
        pFields["test20"].Name = "DVP & R Progress";

        // First Chart
        excelApp.ActiveSheet.Shapes.AddChart.Select();
        excelApp.ActiveChart.SetSourceData(pivotTable1.TableRange1);

        // Second PivotTable
        string pitpivotNam2 = "table2";
        Excel.PivotTable pivotTable2 = null;
        Dictionary<String, Excel.PivotField> pFields2 = new Dictionary<String, Excel.PivotField>();
        Excel.Range pivotDest2 = excelApp.Worksheets["PivotTable"].Cells[20, 1];

        excelApp.Worksheets[sheetData].Activate();
        int countColmn2 = excelApp.Cells[1, 1].End(Excel.XlDirection.xlToRight).Column;
        var headerNam2 = excelApp.Range[excelApp.Cells[1, 1], excelApp.Cells[1, countColmn2]].Value;

        // Data Source for PivotTable
        Excel.Range pivotData2 = excelApp.Worksheets[sheetData].usedRange;
        Excel.PivotCache pivotcache2 = excelApp.ActiveWorkbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, pivotData2.Address/*, Excel.XlPivotTableVersionList.xlPivotTableVersion15*/);
        excelApp.Worksheets[sheetDest].Activate();
        pivotTable2 = excelApp.Worksheets[sheetDest].PivotTables.Add(pivotcache2, pivotDest2, pitpivotNam2, useDefault/*, Excel.XlPivotTableVersionList.xlPivotTableVersion15*/);

        // Create Dynamically PivotFields
        for (int i = 1; i <= headerNam2.Length - 1; i++)
        {

            pFields2.Add("test" + i.ToString(), (Excel.PivotField)pivotTable2.PivotFields(i));

        }

        pFields2["test17"].Orientation = Excel.XlPivotFieldOrientation.xlColumnField;
        Excel.PivotField dataField = pivotTable2.DataPivotField;
        pFields2["test17"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields2["test17"].Function = Excel.XlConsolidationFunction.xlCount;
        pFields2["test40"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields2["test40"].Function = Excel.XlConsolidationFunction.xlCount;
        pFields2["test63"].Orientation = Excel.XlPivotFieldOrientation.xlDataField;
        pFields2["test63"].Function = Excel.XlConsolidationFunction.xlCount;
        dataField.Orientation = Excel.XlPivotFieldOrientation.xlRowField;

        // Secound Chart
        excelApp.ActiveSheet.Shapes.AddChart.Select();
        excelApp.ActiveChart.SetSourceData(pivotTable2.TableRange1);

Thanks for your help in advance.

Regards,

Daniel

Upvotes: 2

Views: 268

Answers (1)

Vittorio Sozzi
Vittorio Sozzi

Reputation: 123

I had a similar problem in a VSTO C# project.

In my case what I had to do was selecting the pivot range before creating the chart.

I discovered that, if a cell of the first pivot is selected when you create the chart, the chart is bound to that pivot and you can't change the source data (as a matter of fact, you cannot do this even in Excel, the source range of the chart is grey).

I solved by selecting the pivot cells before creating the chart.

Range rangePivot2 = pivotTable2.TableRange1;
rangePivot2.Select();
Chart chart = sheet.Controls.AddChart(cellsWhereTheChartWillBeDrawn, "secondChart");
chart.SetSourceData(rangePivot2); /* this won't give you E_FAIL... but it's not really needed */

My code sample is VSTO pseudo-code but I believe a similar approach works on pure Excel COM automation as well.

Upvotes: 1

Related Questions