문제

현재 Office Object 모델을 사용하여 Excel-Documents를 생성하고 있습니다. 차트를 편집하는 데 문제가 있습니다. 템플릿 파일에서 다음 소스를 사용하는 바 차트가 있습니다.

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

차트에는 다음 공식이 있습니다. = Sheet2! $ $ 1 : $ d $ 5

예를 들어 '2009'열이 비어 있으면 차트에 막대를 표시하고 싶지 않습니다. 그래서 나는 공식을 다음과 같은 것들로 바꾸고 싶습니다 : = sheet2! a $ 1 : d $ 5; sheet2! c $ 1 : c $ 5

SetSourcedata 메소드가 있다는 것을 알고 있지만 현재 공식 또는 범위를 먼저 가져와야합니다.

내 질문은; 차트 공식을 어떻게 얻을 수 있습니까? 아니면 내가 원하는 것을 할 수있는 또 다른 방법이 있습니까?

또한 Excel에서 동적 범위를 가진 무언가를 시도했지만 이것은 '2009'열이 아니라 범위의 끝에서 추가 또는 제거 된 열에서만 작동하는 것 같습니다.

도움이 되었습니까?

해결책

내 문제를 해결하기 위해 다음 코드를 만들었습니다. 모든 존재 시리즈 공식을 재구성합니다. 이것은 가능한 모든 차트에 대해서는 효과가 없지만 현재 가지고있는 차트에는 적용됩니다. 앞으로 나는 아마 그것을 다시보고 그것을 개선하려고 노력할 것입니다. 아래 코드에 대한 제안을 환영합니다.

(코드 댓글 부족에 대해 죄송합니다)

        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++;
                }

            }

        }

다른 팁

차트의 전체 데이터 범위를 보유하는 속성은 없습니다. 그러나 각각 시리즈 범위에 대한 정보를 보유합니다.

아래 코드는 모든 시리즈를 나열한 다음 두 번째 시리즈를 삭제합니다.

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

예제 데이터를 기반으로 코드가이를 출력합니다.

= 시리즈 (Sheet1! $ B $ 1, Sheet1! $ 2 : $ 2 : $ 5, Sheet1! $ B $ 2 : $ B $ 5,1) = Series (Sheet1! $ C $ 1, Sheet1! $ 2 : $ A $ 5, Sheet1! $ c $ 2 : $ c $ 5,2) = 시리즈 (Sheet1! $ d $ 1, sheet1! $ a $ 2 : $ 5, Sheet1! $ d $ 2 : $ d $ 5,3)

그만큼 시리즈 네 가지 주장으로 구성됩니다.

(시리즈 이름, xvalues, 값, 플롯 순서)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top