- PR -

[C# VSTO2005] Excel2003セル値の取得および設定方法

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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 = "";

// 繧ィ繝ゥ繝シ繧ウ繝シ繝峨↓縺、縺・※縺ョ諠・
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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);
}

}
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-10-03 14:30
こんにちは。ueです。

引用:

ひろしさんの書き込み (2006-10-03 14:16) より:

★数式エラーのエラーコード一覧が知りたいです。


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 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-04 12:36
回答ありがとうございます。
XlCVErrorの確認できました。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-10-04 12:55
ueです。
エラーの一覧、合っていたようで何よりです。

引用:

ueの書き込み (2006-10-03 14:30) より:

XlCVError Enumeration がそれだと思います。
Members の Error number それぞれに 2146828288 を足すとひろしさんがコードで示しておられるエラー番号に対応するようです。


「足す」のではなく「引く」が正しい表現です。
修正しました。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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;
}

スキルアップ/キャリアアップ(JOB@IT)