Frage

Ich bin Erzeugung derzeit Excel-Dokumente auf das Objektmodell mit Office. Ich habe ein Problem mit Diagrammen bearbeiten. In einer Vorlagendatei bekam ich ein Balkendiagramm, das die folgende Quelle verwendet:

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

Die Tabelle hat die folgende Formel: = Sheet2 $ A $ 1: $ D $ 5

Wenn zum Beispiel der Spalte ‚2009‘ leer ist, ich will nicht die Balken im Diagramm zeigen. Deshalb möchte ich, wie die Formel etwas ändern: = Sheet2 A $ 1: $ D 5; sheet2 C $ 1: C $ 5

!

Ich weiß, es ist eine Methode setSourceData, aber ich muss zuerst die aktuelle Formel oder einen Bereich erhalten.

Meine Frage ist; Wie kann ich die Grafik Formel erhalten? Oder vielleicht gibt es eine andere Art und Weise zu tun, was ich will?

Ich hat auch etwas mit dynamischen Bereichen in Excel versucht, aber dies scheint nur die Arbeit mit Spalten, die vom Ende des Bereichs, nicht in der Mitte wie Spalte ‚2009‘.

hinzugefügt oder entfernt werden
War es hilfreich?

Lösung

Ich habe den folgenden Code, mein Problem zu lösen. Es baut alle existings Serie Formeln. Dies wird für alle möglichen Diagramme nicht funktionieren, aber es hat für die, die ich im Moment haben. In Zukunft werde ich wahrscheinlich es auch dreht wieder und versuchen, es zu verbessern. Vorschläge, um den Code unten sind willkommen.

(sorry für den Mangel an Code-Kommentaren)

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

            }

        }

Andere Tipps

Es ist keine Eigenschaft, die den vollständigen Datenbereich eines Diagramms hält. Doch jeder Serie enthält Informationen über das Sortiment.

Der folgende Code wird alle Serien auflisten und dann die zweite löschen.

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

Auf der Basis Ihrer Beispieldaten, die Code gibt diese

= SERIES (Sheet1 $ B $ 1, Sheet1 $ A $ 2:! 5 $ A $, 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)

Die Serie aus vier Argumenten aus:

(Reihen-Name, XValues, Werte, Plot-Auftrag)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top