質問: エクセルのグラフの系列を追加したいのですが,どうしても例外エラーが発生します. 型の不一致と出るので,型を調べていろいろキャストしたりやってみてもどうやっても例外がでてしまいます. 処理はなされているようで,グラフにはちゃんと反映はされるので,その部分を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部分をコメントから外して処理させると無事にやりたいことが実行されてます. この例外エラーはどういう意味なのでしょうか? よろしくお願いします.
回答: 環境やバージョンは明記したほうがいいですよ(^^;) 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 掲示板( )や Visual Studio User Group( )のフォーラムなどの方が的確な回答を得られるような気がします)