1

現在、Officeオブジェクトモデルを使用してExcelドキュメントを生成しています。グラフの編集に問題があります。テンプレートファイルで、次のソースを使用する棒グラフを取得しました。

    2008    2009    2010
A   10%     25%     15%
B   20%     25%     35%
C   30%     25%     45%
D   40%     25%     5%

グラフの式は次のとおりです。=sheet2!$ A $ 1:$ D $ 5

たとえば、「2009」列が空の場合、グラフにバーを表示したくありません。したがって、数式を次のように変更します:= sheet2!A $ 1:D $ 5; sheet2!C $ 1:C $ 5

setSourceDataメソッドがあることは知っていますが、最初に現在の数式または範囲を取得する必要があります。

私の質問は; チャート式を取得するにはどうすればよいですか?それとも、私がやりたいことをする別の方法がありますか?

Excelでダイナミックレンジを使って何かを試しましたが、これは範囲の最後から追加または削除された列でのみ機能し、列「2009」のように中央では機能しないようです。

4

2 に答える 2

1

問題を解決するために次のコードを作成しました。既存のすべてのシリーズ式を再構築します。これは、考えられるすべてのチャートで機能するわけではありませんが、現在持っているチャートでは機能します。将来、私はおそらくそれをもう一度見て、それを改善しようとします。以下のコードへの提案は大歓迎です。

(コードのコメントがなくてすみません)

        foreach (Excel.ChartObject chart in (Excel.ChartObjects)sheet.ChartObjects(Type.Missing))
        {
            IDictionary<int, Boolean> colHasValues = new Dictionary<int, Boolean>(); 
            ArrayList seriesFormulas = new ArrayList(); 

            foreach (Excel.Series series in (Excel.SeriesCollection)chart.Chart.SeriesCollection(Type.Missing))
            {
                seriesFormulas.Add(series.Formula);

                Array sValues = (Array)series.Values;
                int i = 1;
                foreach (Object o in sValues)
                {
                    if(!colHasValues.Keys.Contains(i)) colHasValues.Add(i, false);                        
                    if (o != null)
                    {
                        colHasValues[i] = true;                             
                    }
                    i++;
                }
            }

            if (!colHasValues.Values.Contains(true))
            {   
                chart.Delete();
            }
            else if (colHasValues.Values.Contains(false) && seriesFormulas.Count > 1)
            {    

                ArrayList newSeriesFormulas = new ArrayList(); 

                foreach (String formula in seriesFormulas)
                {

                    String[] formulaBits = formula.Split(";".ToCharArray());
                    if (formulaBits.Length == 4)
                    { 

                        for (int arrNr = 1; arrNr <= 2; arrNr++)
                        {   //1 = XValues, 2 = Values
                            int indexFirstChar = formulaBits[arrNr].IndexOf(':');
                            int indexLastChar = formulaBits[arrNr].LastIndexOf('$', indexFirstChar) + 1;

                            String firstRow = formulaBits[arrNr].Substring(indexLastChar, indexFirstChar - indexLastChar);
                            String firstColumn = formulaBits[arrNr].Substring(indexLastChar - 2, 1);

                            formulaBits[arrNr] = "";

                            foreach (KeyValuePair<int, Boolean> cat in colHasValues)
                            {
                                if (cat.Value == true)
                                {
                                    formulaBits[arrNr] += "overzichten!$" + getExcelColumnName((getExcelColumnNumber(firstColumn) + cat.Key - 1)) + "$" + firstRow + ":$" + getExcelColumnName((getExcelColumnNumber(firstColumn) + cat.Key - 1)) + "$" + firstRow + ";";
                                }
                            }
                            formulaBits[arrNr] = formulaBits[arrNr].TrimEnd(";".ToCharArray());
                            if (formulaBits[arrNr].Contains(';')) 
                            {
                                formulaBits[arrNr] = "(" + formulaBits[arrNr] + ")";
                            }
                        }

                        newSeriesFormulas.Add(String.Join(";", formulaBits));

                    }

                }

                int seriesid = 0;
                foreach (Excel.Series series in (Excel.SeriesCollection)chart.Chart.SeriesCollection(Type.Missing))
                {
                    series.Formula = newSeriesFormulas[seriesid].ToString();
                    seriesid++;
                }

            }

        }
于 2009-10-09T08:50:42.897 に答える
0

グラフの全データ範囲を保持するプロパティはありません。ただし、各シリーズはその範囲に関する情報を保持しています。

以下のコードは、すべてのシリーズを一覧表示してから、2 番目のシリーズを削除します。

Sub ChartRanges()

Dim lngSeries As Long

    ActiveSheet.ChartObjects("Chart 1").Select

    For lngSeries = 1 To ActiveChart.SeriesCollection.Count
        Debug.Print ActiveChart.SeriesCollection(lngSeries).Formula
    Next lngSeries
'List out series in chart

    ActiveChart.SeriesCollection(2).Delete
'Delete a series from the chart

End Sub

サンプルデータに基づいて、コードはこれを出力します

=SERIES(Sheet1!$B$1,Sheet1!$A$2:$A$5,Sheet1!$B$2:$B$5,1) =SERIES(Sheet1!$C$1,Sheet1!$A$2:$A$5, Sheet1!$C$2:$C$5,2) =SERIES(Sheet1!$D$1,Sheet1!$A$2:$A$5,Sheet1!$D$2:$D$5,3)

Seriesは 4 つの引数から構成されます。

(系列名、XValues、値、プロット順序)

于 2009-10-06T13:38:23.150 に答える