質問
私は現在、発電Excel文書類を事務所のオブジェクトモデルです。している問題を編集します。テンプレートファイルしたバーチャを用い、以下のソース:
2008 2009 2010
A 10% 25% 15%
B 20% 25% 35%
C 30% 25% 45%
D 40% 25% 5%
の図では、以下の式:=sheet2!$あ$1:$D$5
場合例えば、カラム2009年度は空にしてはならないようにしたいショーのバーの表の通りです。していきたいなと思っていますの変更の式のようなもの:=sheet2!あ$1:D$5;sheet2!C$1:C$5
知っている方法があsetSourceDataがりさんの現在の式または範囲です。
私の質問ではありませんが、あるかつての図式?というかもう一つの方法があり、僕欲しがっているのか?
もしもダイナミックレンジラインは、このようにのみに列を追加または削除が行われたときの範囲は中間のようにカラム2009年度'.
解決
私は私の問題を解決するために、次のコードを作りました。これは、すべてのexistingsシリーズ式を再構築します。これは、すべての可能なチャートでは動作しませんが、それは私が現在持っているもののために行います。将来的には私はおそらく再びそれを見て、それを改善しようとするでしょう。以下のコードへの提案を歓迎します。
(コードのコメントの不足のため申し訳ありません)。
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++;
}
}
}
他のヒント
目指すは世界中に存在する財産を保持する"ブレクスピプラゾール"の範囲ます。しかし各 シリーズ 保有に関する情報です。
以下のコードについてもシリーズを削除しますた。
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
に基づく例のデータをもとに、コードを出力しますこの
=シリーズ(Sheet1!$B$1,Sheet1!$$2$A$5,Sheet1!$B$2:$B$5,1) =シリーズ(Sheet1!$C$1,Sheet1!$$2$A$5,Sheet1!$C$2:$C$5,2) =シリーズ(Sheet1!$D$1,Sheet1!$$2$A$5,Sheet1!$D$2:$D$5,3)
の シリーズ あらかの引数:
シリーズ名、XValues、価値観、プロット順)