- - PR -
[C# VSTO2005] Excel2003セル値の取得および設定方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-03 14:12
回答ありがとうございます。
私も調べてみたのですが、 Range.Errorsは私が望んでいたプロパティでは無いことが分かりました。 その代わり、数式エラーが発生するとValue2にint型の値が返されることが分かりした。 根拠は無いですが、このint型の値がどうもエラーコードのようです。 ★数式エラーのエラーコード一覧が知りたいです。 改めてサンプルコードを作成してみました。 サンプルコードではA3に"=A1/A2"数式を代入しています。 A3から値を取り出す前に=A1/A2が数式エラーになっていないか検査する必要があります。 いくつかのエラーについては実際にエラーを発生させてエラーコードを算出した値を用いました。 (Err1,Err2,Err3) その結果、一応意図どおりの動きはしましたが、 発生する可能性がある全てのエラーについて、きちんと対処したいので マイクロソフト社の資料による裏づけをとっておきたいと思います。 MSDNライブラリを探し回りましたが、 エラーコード一覧についての情報源が見つかりません。 よろしくお願いします。 private void button1_Click(object sender, EventArgs e) { Excel.Range range1 = Globals.Sheet1.Cells[1, 1] as Excel.Range; // A1 Excel.Range range2 = Globals.Sheet1.Cells[2, 1] as Excel.Range; // A2 Excel.Range range3 = Globals.Sheet1.Cells[3, 1] as Excel.Range; // A3=A1/A2險育ョ礼オ先棡 Excel.Range range4 = Globals.Sheet1.Cells[4, 1] as Excel.Range; // 繧ィ繝ゥ繝シ縺ョ讀懈渊邨先棡 range1.Value2 = 1.23; range2.Value2 = 0; range3.Formula = "=A1/A2"; object obj3 = range3.Value2; // 謨ー蠑上お繝ゥ繝シ縺ョ繧ィ繝ゥ繝シ繧ウ繝シ繝峨・蜿門セ if (obj3.GetType() == typeof(int)) { int errCode = (int)obj3; string msg = ""; // 繧ィ繝ゥ繝シ繧ウ繝シ繝峨↓縺、縺・※縺ョ諠・ | ||||
|
投稿日時: 2006-10-03 14:16
すみません、一部文字化けしちゃいました。再送します。
回答ありがとうございます。 私も調べてみたのですが、 Range.Errorsは私が望んでいたプロパティでは無いことが分かりました。 その代わり、数式エラーが発生するとValue2にint型の値が返されることが分かりした。 根拠は無いですが、このint型の値がどうもエラーコードのようです。 ★数式エラーのエラーコード一覧が知りたいです。 改めてサンプルコードを作成してみました。 サンプルコードではA3に"=A1/A2"数式を代入しています。 A3から値を取り出す前に=A1/A2が数式エラーになっていないか検査する必要があります。 いくつかのエラーについては実際にエラーを発生させてエラーコードを算出した値を用いました。 (Err1,Err2,Err3) その結果、一応意図どおりの動きはしましたが、 発生する可能性がある全てのエラーについて、きちんと対処したいので マイクロソフト社の資料による裏づけをとっておきたいと思います。 MSDNライブラリを探し回りましたが、 エラーコード一覧についての情報源が見つかりません。 よろしくお願いします。 private void button1_Click(object sender, EventArgs e) { Excel.Range range1 = Globals.Sheet1.Cells[1, 1] as Excel.Range; // A1 Excel.Range range2 = Globals.Sheet1.Cells[2, 1] as Excel.Range; // A2 Excel.Range range3 = Globals.Sheet1.Cells[3, 1] as Excel.Range; // A3=A1/A2險育ョ礼オ先棡 Excel.Range range4 = Globals.Sheet1.Cells[4, 1] as Excel.Range; // 繧ィ繝ゥ繝シ縺ョ讀懈渊邨先棡 range1.Value2 = 1.23; range2.Value2 = 0; range3.Formula = "=A1/A2"; object obj3 = range3.Value2; // エラーコード?を取得する if (obj3.GetType() == typeof(int)) { int errCode = (int)obj3; string msg = ""; // 下記エラーコードの情報源が見つからない const int Err1 = -2146826281; const int Err2 = -2146826252; const int Err3 = -2146826273; switch (errCode) { case Err1: msg = "0で除算した"; break; case Err2: msg = "オーバーフロー"; break; case Err3: msg = "数値で無い"; break; default: msg = "想定外のエラー"; break; } range4.Value2 = msg; } else if (obj3.GetType() == typeof(double)) { range4.Value2 = String.Format("A1/A2={0}", (double)range3.Value2); } } | ||||
|
投稿日時: 2006-10-03 14:30
こんにちは。ueです。
XlCVError Enumeration がそれだと思います。 Members の Error number それぞれから 2146828288 を引くとひろしさんがコードで示しておられるエラー番号に対応するようです。 #足し算と引き算を間違えていたのを修正。失礼しました。 _________________ 上本亮介 (ue) @ わんくま同盟 Microsoft MVP for Microsoft Office System - Microsoft Office System (Jul 2006 - Jun 2007) Hello Another World! [ メッセージ編集済み 編集者: ue 編集日時 2006-10-04 12:47 ] | ||||
|
投稿日時: 2006-10-04 12:36
回答ありがとうございます。
XlCVErrorの確認できました。 | ||||
|
投稿日時: 2006-10-04 12:55
ueです。
エラーの一覧、合っていたようで何よりです。
「足す」のではなく「引く」が正しい表現です。 修正しました。 _________________ 上本亮介 (ue) @ わんくま同盟 Microsoft MVP for VSTO (Jul 2008 - Jun 2009) Hello Another World! .NET 勉強会 / ヒーロー島 | ||||
|
投稿日時: 2006-10-04 13:51
動作を検証したサンプルを掲載しておきます。
private void button1_Click(object sender, EventArgs e) { const int offset = 0x7ff60000; Globals.ThisWorkbook.Application.Calculation = Excel.XlCalculation.xlCalculationManual; Excel.Range range1 = Globals.Sheet1.Cells[1, 1] as Excel.Range; // A1 Excel.Range range2 = Globals.Sheet1.Cells[2, 1] as Excel.Range; // A2 Excel.Range range3 = Globals.Sheet1.Cells[3, 1] as Excel.Range; // A3=A1/A2計算結果 Excel.Range range4 = Globals.Sheet1.Cells[4, 1] as Excel.Range; // エラーの検査結果 range1.Value2 = 1.23; range2.Value2 = 0; range3.Formula = "=A1/A2"; object obj3 = range3.Value2; if (obj3.GetType() == typeof(int)) { int errCode = (int)obj3 + offset; string msg = ""; switch (errCode) { case (int)Excel.XlCVError.xlErrDiv0: msg = "#DIV/0! error"; break; case (int)Excel.XlCVError.xlErrNA: msg = "#N/A error"; break; case (int)Excel.XlCVError.xlErrName: msg = "#NAME? error"; break; case (int)Excel.XlCVError.xlErrNull: msg = "#NULL! error"; break; case (int)Excel.XlCVError.xlErrNum: msg = "#NUM! error"; break; case (int)Excel.XlCVError.xlErrRef: msg = "#REF! error"; break; case (int)Excel.XlCVError.xlErrValue: msg = "#VALUE! error"; break; default: msg = "error"; break; } range4.Value2 = msg; } else if (obj3.GetType() == typeof(double)) { range4.Value2 = String.Format("A1/A2={0}", (double)range3.Value2); } Globals.ThisWorkbook.Application.Calculation = Excel.XlCalculation.xlCalculationAutomatic; } |