2009-10-06 4 views
1

Je génère actuellement des documents Excel à l'aide du modèle objet Office. J'ai un problème avec l'édition de graphiques. Dans un fichier modèle I a obtenu un diagramme à barres qui utilise la source suivante:Formule Excel de modification de graphique

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 $

Lorsque, par exemple la la colonne '2009' est vide, je ne veux pas montrer la barre dans le graphique. Donc, je veux changer la formule à quelque chose comme: = feuille2! A $ 1: D $ 5; feuille2! C $ 1: C $ 5

Je sais qu'il existe une méthode setSourceData, mais j'ai besoin d'obtenir la formule ou la gamme actuelle premier.

Ma question est; Comment puis-je obtenir la formule du graphique? Ou peut-être existe-t-il une autre façon de faire ce que je veux? J'ai également essayé quelque chose avec des plages dynamiques dans Excel, mais cela semble fonctionner uniquement avec les colonnes qui sont ajoutées ou supprimées de la fin de la plage, pas dans la colonne du milieu comme '2009'.

Répondre

1

J'ai créé le code suivant pour résoudre mon problème. Il reconstruit toutes les formules de séries d'existences. Cela ne fonctionnera pas pour tous les graphiques possibles, mais il le fait pour ceux que j'ai actuellement. Dans le futur je vais probablement le regarder encore et essayer de l'améliorer. Les suggestions pour le code ci-dessous sont les bienvenues.

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

      } 

     } 
0

Aucune propriété ne contient la plage de données complète d'un graphique. Cependant, chaque Series contient des informations sur sa portée.

Le code ci-dessous liste toutes les séries, puis supprime la seconde.

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, le code affichera cette

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

La série se compose de quatre arguments:

(Nom de série, XValues, valeurs, ordre de tracé)

+0

Merci, mais dans mon exemple les lignes A, B, C et D sont la série. Je veux supprimer une catégorie (2008,2009,2010) s'il n'y a pas de données pour cela. – user168998

Questions connexes