みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel chartの系列の追加

エクセルのグラフの系列を追加したいのですが,どうしても例外エラーが発生します.
型の不一致と出るので,型を調べていろいろキャストしたりやってみてもどうやっても例外がでてしまいます.
処理はなされているようで,グラフにはちゃんと反映はされるので,その部分を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部分をコメントから外して処理させると無事にやりたいことが実行されてます.
この例外エラーはどういう意味なのでしょうか?

よろしくお願いします.

投稿日時 - 2006-01-21 17:28:08

QNo.1911488

すぐに回答ほしいです

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

環境やバージョンは明記したほうがいいですよ(^^;)
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/ )のフォーラムなどの方が的確な回答を得られるような気がします)

投稿日時 - 2006-01-23 16:40:11

お礼

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

また,GotDotNet Japan 掲示板や Visual Studio User Groupのフォーラムというものも今後参考にさせていただきます.
ありがとうございました.

投稿日時 - 2006-01-24 18:50:00

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問