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

ExcelからC#を操作

1
投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-08-09 16:03
Excelのオートメーションアドインを利用して、ExcelからC#を通してDBの読み書きを
したいと考えています。
具体的には、Excelシート上で、
「=GetData()」とすると、C#側から2次元配列のデータが戻され、
「=SetData("A1:B4")」とすると、シート上のデータをC#側に渡しDB更新。

「=GetData()」のC#側からExcel側に2次元配列を渡すことはできるのですが、
「=SetData("A1:B4")」のExcel側からC#側にレンジのようなデータを渡すことが
できません。

どなたか渡し方をご存知の方はいないでしょうか?

ちなみに、C#側のソースは以下のようにしています。

public object[,] GetData(string KeyWord) {
    xxx = KeyWordを条件にしたDB検索処理
    return xxx
}

public string SetData(object[,] RangeData) {
    return "OK";
}
上記のSetDataで、引数の型をobject[,]からstringに変更し、単一セル値を渡すと
Excel側に"OK"と返されますが、object[,]のままでレンジを渡すと"OK"と帰って来ず、
Excel側で"#VALUE!"となってしまいます。
※SetDataでは、渡すことじたいができているか確認するために即リターンさせています。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2006-08-10 11:30
自己解決しましたので方法を載せておきます。

私は、C#→Excel時がobject[,]だったため、逆のExcel→C#も何かしらの配列型と
思っていましたが、Excelから受け取る場合は1つのobjectとして受け取り、
メソッドの内部でobjectをrangeに変換することで実現できるようです。
具体的には、

public string SetData(object RangeData) {
    Excel.Range r = RangeDataas as Excel.Range;
    return r.Cells.Count.ToString();
}
※渡したrangeのセル数が戻ります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-10 12:29
引用:

村長さんの書き込み (2006-08-10 11:30) より:

public string SetData(object RangeData) {
    Excel.Range r = RangeDataas as Excel.Range;
    return r.Cells.Count.ToString();
}


2 行目が C# と VB が混ざっているような...

SetData メソッドは、C# 側なのですよね?
r.Cells.Count については、直接 Count メンバまでアクセスしてしまうと、
Cells (Excel.Range) の参照カウントをデクリメントするタイミングを失いますので、まずいかと思います。

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

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