Question

Je génère actuellement des documents Excel utilisant le modèle d'objet Office. J'ai un problème avec des cartes d'édition. Dans un fichier de modèle que je suis un graphique à barres qui utilise la source suivante:

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

Le tableau a la formule suivante: = Sheet2 $ A $ 1: $ D 5 $

Quand par exemple la colonne « 2009 » est vide, je ne veux pas afficher la barre dans le tableau. Donc, je veux changer la formule à quelque chose comme: = Sheet2 A $ 1:! D 5 $ sheet2 C $ 1: C $ 5

Je sais qu'il ya une méthode SetSourceData, mais je dois obtenir la formule actuelle ou première gamme.

Ma question est; Comment puis-je obtenir la formule de tableau? Ou peut-être il y a une autre façon de faire ce que je veux?

J'ai aussi essayé quelque chose avec des gammes dynamiques dans Excel, mais cela semble seulement travailler avec des colonnes qui sont ajoutées ou retirées de la fin de la plage, pas au milieu comme la colonne « 2009 ».

Était-ce utile?

La solution

J'ai fait le code suivant pour résoudre mon problème. Il reconstitue toutes les formules de série existings. Cela ne fonctionnera pas pour toutes les cartes possibles, mais il le fait pour ceux que j'ai actuellement. À l'avenir, je regarderai probablement à nouveau et essayer de l'améliorer. Suggestions du code ci-dessous sont les bienvenus.

(désolé pour le manque de commentaires de code)

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

            }

        }

Autres conseils

Il n'y a pas une propriété qui contient la gamme complète des données d'un graphique. Toutefois, chaque Série contient des informations sur sa gamme.

Le code ci-dessous la liste toutes les séries, puis supprimer le second.

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

Sur la base de vos données par exemple, la sortie volonté de code ce

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

Série se compose de quatre arguments:

(Nom de la série, XValues, valeurs, terrain ordre)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top