Excel changer la formule de tableau
-
19-09-2019 - |
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 ».
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)