• ベストアンサー
  • すぐに回答を!

Excel chartの系列の追加

  • 質問No.1911488
  • 閲覧数2623
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 83% (5/6)

エクセルのグラフの系列を追加したいのですが,どうしても例外エラーが発生します.
型の不一致と出るので,型を調べていろいろキャストしたりやってみてもどうやっても例外がでてしまいます.
処理はなされているようで,グラフにはちゃんと反映はされるので,その部分をtry-catch文でスルーさせると系列も追加されていて,やりたいことはできて正常終了するのですが,このやり方は明らかに良くないと思うので,是非解決させたいです.
型宣言を省いたcodeは↓のようにしてます

charts=(Excel.ChartObjects)oSheet.ChartObjects(Type.Missing);
chartObj=charts.Add(100, 100, 700, 400);
chart=chartObj.Chart;
chart.ChartType=Excel.XlChartType.xlXYScatterLines;
chartRange1=oSheet.get_Range("B2","B50");
chart.SetSourceData(chartRange1,Excel.XlRowCol.xlColumns);
seriesCollection=(Excel.SeriesCollection)chart.SeriesCollection(Type.Missing);
chartRange2=oSheet.get_Range("A2","A50");
seriesCollection.Item(1).XValues=chartRange2;
chartRange3=oSheet.get_Range("C2","C5");
chartRange4=oSheet.get_Range("A2","A5");

/*try
{
*/

seriesCollection.Add(chartRange3,Excel.XlRowCol.xlColumns,0,0,1).XValues=chartRange4; //ここで下の例外が発生します

/*}
catch
{}
*/


'System.InvalidCastException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : OleAut が型の不一致をレポートしました。


となります.
コメント化してるtry-catch部分をコメントから外して処理させると無事にやりたいことが実行されてます.
この例外エラーはどういう意味なのでしょうか?

よろしくお願いします.

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 77% (132/170)

環境やバージョンは明記したほうがいいですよ(^^;)
1点だけ。『やりたいことはできて正常終了する』とのことですが、XValues(質問文ではchartRange4)はチャートに反映されていますか?

というのも...
XP(SP2)/VC#2005Express/Excel2000で試してみました(以下の記述はすべてこの環境での話です)が、やはりInvalidCastExceptionが発生し、どうやっても消せませんでした(^^;)。ただし、新規系列は追加されていましたが、XValuesは反映されていませんでした。
で、Excel/VBAで同様のコードを書いて試してみたところ、次の記述は実行時エラー424「オブジェクトが必要です」になります。新規系列は追加されており、chartRange4は反映されていない、C#の時とまったく同じ結果になります。

 seriesCollection1.Add(chartRange3).XValues = chartRange4

しかし、次の記述は正常に実行されます。

 seriesCollection1.Add chartRange3
 seriesCollection1.Item(2).XValues = chartRange4

オブジェクトブラウザを見るとSeriesCollectionのAddはSeriesを返すことになっていますが、この結果を見ると、どうも返していないように思われます(Excel(TypeLib)のバグ)。Add自体は成功するが、返値(Seriesオブジェクト)がないので".Xvalues"が実行できず、値の設定ができないというわけです。あくまでも想像ですけど。

残念ながらC#で問題のコードをVBAのように分割しても、依然としてAddでInvalidCastExceptionが発生してしまいます。これも想像になりますが、C#は共通ランタイムの上で動作しており、COM(OLE)とはマーシャリングと呼ばれるメカニズムを介してデータをやり取りしているようですから、ユーザプログラムが返値を使用していなくても、共通ランタイムの中で型変換した上でユーザプログラムに返しているのかもしれません。Addの返値(nullとか??)をSeriesにキャストしようとして「型の不一致」を検出したのではないかなと思います。
想像ばっかりで間違っているかもしれませんが…

(余談ですが、上記のような次第で、私ならAddよりNewSeriesを使います。)
(さらに余談ですが、この件は GotDotNet Japan 掲示板( http://www.gdncom.jp/general/bbs/ )や Visual Studio User Group( http://vsug.jp/ )のフォーラムなどの方が的確な回答を得られるような気がします)
お礼コメント
uni12345

お礼率 83% (5/6)

たいへん詳しい解説をしていただきありがとうございます.納得ができました.
私も書き込みした後いろいろとやってみたところ,確かに.XValues = chartRange4 の部分は反映されておりませんでした.
この部分を消して実行したところご指摘のようにseriesCollection1.Add(chartRange3)は反映されますが,やはり例外エラーが出ます.
FlossenEngelさんのおっしゃるとおりNewSeriesというものがあることがわかり,こちらを使うことが賢明であると判断しました.バグであってくれると自分の中でも納得ができます.

また,GotDotNet Japan 掲示板や Visual Studio User Groupのフォーラムというものも今後参考にさせていただきます.
ありがとうございました.
投稿日時:2006/01/24 18:50
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ