@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

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

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-01 11:00
セル値へのアクセス方法を改善したいです。
サンプルコードは意図どおりの動作をしますが、洗練されていません。

// サンプルコード
private void button1_Click(object sender, EventArgs e)
{
// セルA1とセルA2の値を加算し結果をセルA3に書く
decimal a1;
bool f1 = Decimal.TryParse(Globals.Sheet1.Cells.get_Range("A1", "A1").Value2.ToString(),out a1);
decimal a2;
bool f2 = Decimal.TryParse(Globals.Sheet1.Cells.get_Range("A2", "A2").Value2.ToString(), out a2);
decimal a3 = f1 && f2 ? a1 + a2 : 0;
Globals.Sheet1.Cells.get_Range("A3","A3").Value2 = a3;
}

Q1.行番号と列番号から単一セルの指定する方法は?

下記の方法で単一のセルのRangeを取得していしているが、改善したい。
Globals.Sheet1.Cells.get_Range("A1", "A1")
A1型の文字列でアドレスを指定しているが、計算が面倒である。
intに格納された行番号と列番号から直接単一セルのRengeを取得する
簡便な方法は無いか?
サンプルコードではA1/A2/A3といった固定アドレスのセルでしたが、
実際はC#で計算されたアドレスが使えるような柔軟性を持たせたいので、
その点を考慮した回答を希望します。
必要であればVSTO2005の新機能を活用してもOKです。

// A2の場合
int i = 2; // i= 行番号
int j = 1; // j= 列番号
をアドレスとして利用する。

Q2.Value2から値を取り出す方法?
Value2.ToString()の結果を数値として評価しているが、
数値として評価する前にValue2に格納されている値の形式をチェックしたいが、
(例 数値?文字列?未入力?等)チェックする方法が分からない。
数値として評価する場合、一旦ToString()に変換してから強引にTryParse()で評価
させているが、もっと洗練された方法はあるか?
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-10-01 19:25
こんばんは。

引用:

intに格納された行番号と列番号から直接単一セルのRengeを取得する
簡便な方法は無いか?


Worksheet.Cells プロパティ からインデクサを使ってアクセスできます。
コード:
int i = 2; // i= 行番号 
int j = 1; // j= 列番号
Globals.Sheet1.Cells[i,j] = "A2";


こんな感じでいかがでしょうか。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-02 12:37
回答ありがとうございます。
単一セルの選択については解決できました。
インデクサが意図どおり機能することを確認できました。

セル値の取得方法および形式のチェック法についても
より洗練された方法があれば、アドバイス願えればありがたいです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-02 13:50
引用:

ひろしさんの書き込み (2006-10-02 12:37) より:

セル値の取得方法および形式のチェック法についても
より洗練された方法があれば、アドバイス願えればありがたいです。


Cells インデクサで取得できるのは、Range インターフェイスを実装しているインスタンスです。つまり、こういうことです。

引用:

セル値の取得方法


'書き込み' ができるということは値の取得も、同じようにできますよね。

引用:

形式のチェック法


チェックの意味合いは良くわかりませんが、
Range インターフェイスには、Formula 関連のプロパティが実装されています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-02 16:29
回答ありがとうございます。
> 書き込み' ができるということは値の取得も、同じようにできますよね。
はい。書き込みも参照もできました。
セル値の形式のチェックはReflectionで解決できました。
下記のサンプルは意図どおり動きました。



private void button1_Click(object sender, EventArgs e)
{
// セルA1とA2が数値の場合は加算値、文字列の場合は結合値をセルA3に書き込む。
Excel.Range range1 = Globals.Sheet1.Cells[1, 1] as Excel.Range;
Excel.Range range2 = Globals.Sheet1.Cells[2, 1] as Excel.Range;
Excel.Range range3 = Globals.Sheet1.Cells[3, 1] as Excel.Range;

object obj1 = range1.Value2;
object obj2 = range2.Value2;

if (obj1 != null && obj2 != null)
{
if (obj1.GetType() == typeof(double) && obj2.GetType() == typeof(double))
{
range3.Value2 = (double)range1.Value2 + (double)range2.Value2;
}
else if (obj1.GetType() == typeof(string) && obj2.GetType() == typeof(string))
{
range3.Value2 = (string)range1.Value2 + (string)range2.Value2;
}
}
}

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-02 17:34
引用:

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

セル値の形式のチェックはReflectionで解決できました。
下記のサンプルは意図どおり動きました。


"形式" というのは、セル値のデータ型のことだったのですね。
[値型].TryParse (例 : System.Double.TryParse) メソッドを使った方が良いかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-02 18:06
回答ありがとうございます。
TryParseは便利ですね。

サンプルを拡張してセルA1で数式エラーの発生状況を検査することにしました。
例えばrange1.ErrorsでRange(サンプルの場合セルA1)の状態を取得できることが分かったのですが、
肝心のErrorsのどのIndexがどのエラーに対応しているかの情報を見つけることができません。

Range.Errorsプロパティの説明には
> エラー チェックのオプションに関連するインデックス値の一覧については、Errors オブジェクトを参照してください。
とありますが、なぜか「一覧」に行き着けません。

宜しくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-02 18:23
引用:

ひろしさんの書き込み (2006-10-02 18:06) より:

例えばrange1.ErrorsでRange(サンプルの場合セルA1)の状態を取得できることが分かったのですが、
肝心のErrorsのどのIndexがどのエラーに対応しているかの情報を見つけることができません。

Range.Errorsプロパティの説明には
> エラー チェックのオプションに関連するインデックス値の一覧については、Errors オブジェクトを参照してください。
とありますが、なぜか「一覧」に行き着けません。


この "一覧" というのは、ErrorCheckingOptions のことだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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