Excel ändern Chart-Formel
-
19-09-2019 - |
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 werdenLö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)