C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Excelのバージョンの違いについて


(過去ログ 7 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■7559 / inTopicNo.1)  Excelのバージョンの違いについて
  
□投稿者/ mima 二等兵(1回)-(2006/10/17(Tue) 20:48:28)

分類:[C#] 


分類:[C#] 

前任者が、Excelのバージョンをカプセル化して、
作成したものを直しているのですが、
セルのコピーだけがうまくいきません。

遅延バインドを使用しているのですが、
Excel97の環境でコンパイルしたものは、97では動くのですが、
Excel2003では動かず「メソッドが見つかりません。」というエラーになります。
もちろん逆もできません。


/// <summary>
/// Range カプセルクラス
/// </summary>
public class XlsRange {

public XlsRange() {
//
// TODO: コンストラクタ ロジックをここに追加してください。
//
}
public XlsRange(Excel.Range range){
_Obj = range;
}
/// <summary>
/// 保持Range
/// </summary>
private Excel.Range _Obj;
public Excel.Range Obj {
get {
return _Obj;
}
set {
_Obj = value;
}
}

/// <summary>
/// Range.Copy()
/// </summary>
public void Copy(XlsRange range) {
_Obj.Copy(range.Obj);
}
}

なにか、ヒントでもいいのでよろしくお願いします。

0
引用返信 編集キー/
■7560 / inTopicNo.2)  Re[1]: Excelのバージョンの違いについて
□投稿者/ 魔界の仮面弁士 少佐(183回)-(2006/10/17(Tue) 21:54:52)

分類:[C#] 

> セルのコピーだけがうまくいきません。

Range クラスの Copy メソッドの事で良いでしょうか?

だとすれば、Excel 97 までは戻り値の無い(void)メソッドでしたが、
2000 以上ではバリアント(object)を返すメソッドに変更されています。


具体的には、こんな定義です。
-----------------

[uuid(00020846-0001-0000-C000-000000000046)]
interface IRange : IDispatch
{
// Excel 8
// HRESULT _stdcall Copy([in, optional] VARIANT Destination);

// Excel 9, 10, 11
HRESULT _stdcall Copy(
[in, optional] VARIANT Destination,
[out, retval] VARIANT* RHS);
}


[uuid(00020846-0000-0000-C000-000000000046)]
dispinterface Range
{
methods:
// Excel 8
// [id(0x00000227)]
// void Copy([in, optional] VARIANT Destination);

// Excel 9, 10, 11
[id(0x00000227)]
VARIANT Copy([in, optional] VARIANT Destination);
}


0
引用返信 編集キー/
■7561 / inTopicNo.3)  Re[2]: Excelのバージョンの違いについて
□投稿者/ mima 二等兵(2回)-(2006/10/17(Tue) 22:11:26)

分類:[C#] 


> Range クラスの Copy メソッドの事で良いでしょうか?

そうです。
すみません、説明が下手で。。

> だとすれば、Excel 97 までは戻り値の無い(void)メソッドでしたが、
> 2000 以上ではバリアント(object)を返すメソッドに変更されています。

だとすると、別々に作成しないとダメだということでしょうか。。

0
引用返信 編集キー/
■7563 / inTopicNo.4)  Re[3]: Excelのバージョンの違いについて
□投稿者/ 魔界の仮面弁士 少佐(184回)-(2006/10/17(Tue) 22:34:00)

分類:[C#] 

>>だとすれば、Excel 97 までは戻り値の無い(void)メソッドでしたが、
>>2000 以上ではバリアント(object)を返すメソッドに変更されています。
> だとすると、別々に作成しないとダメだということでしょうか。。

Application オブジェクトの Version プロパティの結果を元にして
Excel バージョンを判定する事ができますよ。

0
引用返信 編集キー/
■7584 / inTopicNo.5)  Re[4]: Excelのバージョンの違いについて
□投稿者/ mima 二等兵(3回)-(2006/10/18(Wed) 13:44:14)

分類:[C#] 

バージョンごとに直して、
97は返り値なし、それ以外は有にしたのですが、
97でコンパイルすると、怒られてしまいます。

No7563に返信(魔界の仮面弁士さんの記事)
> >>だとすれば、Excel 97 までは戻り値の無い(void)メソッドでしたが、
> >>2000 以上ではバリアント(object)を返すメソッドに変更されています。
>>だとすると、別々に作成しないとダメだということでしょうか。。
>
> Application オブジェクトの Version プロパティの結果を元にして
> Excel バージョンを判定する事ができますよ。

0
引用返信 編集キー/
■7586 / inTopicNo.6)  Re[5]: Excelのバージョンの違いについて
□投稿者/ 魔界の仮面弁士 少佐(186回)-(2006/10/18(Wed) 14:29:07)

分類:[C#] 

No7584に返信(mimaさんの記事)
> バージョンごとに直して、
> 97は返り値なし、それ以外は有にしたのですが、
> 97でコンパイルすると、怒られてしまいます。

……具体的には、どういう意味でしょうか?

「Excel 97 の環境で実行すると、エラーが発生する」という事ではなく、
「Excel 97 の環境でコンパイルすると、エラーが発生する」のでしょうか。

どのようなコードを書いて、どの部分で、どのようなエラーが発生しているのか、
『コンパイルで怒られる』という状況についての情報を提示してください。


ところで…… Excel のライブラリを参照設定したりはしていませんよね?
(No7559で“遅延バインド”だと書いておられるので、大丈夫だとは思いますが…)

0
引用返信 編集キー/
■7587 / inTopicNo.7)  Re[6]: Excelのバージョンの違いについて
□投稿者/ mima 二等兵(4回)-(2006/10/18(Wed) 14:43:58)

分類:[C#] 


> 「Excel 97 の環境で実行すると、エラーが発生する」という事ではなく、
> 「Excel 97 の環境でコンパイルすると、エラーが発生する」のでしょうか。
>
> どのようなコードを書いて、どの部分で、どのようなエラーが発生しているのか、
> 『コンパイルで怒られる』という状況についての情報を提示してください。

コンパイルで、エラーになってます。
単純に、97だったら返り値なしで、それ意外なら返り値のあるコードに変えたんですが、
97だと「voideをオブジェクトに変更できない。」といわれます。

元のコード
/// <summary>
/// Range.Copy()
/// </summary>
public void Copy(XlsRange range) {
_Obj.Copy(range.Obj);
}

今のコード
public void Copy(XlsRange range) {
if(_Version.Equals(XlsVersion.Excel97)) {
_Obj.Copy(range.Obj);
}else{
Object myObj;
myObj = _Obj.Copy(range.Obj);
}
}


> ところで…… Excel のライブラリを参照設定したりはしていませんよね?
> (No7559で“遅延バインド”だと書いておられるので、大丈夫だとは思いますが…)

これはしていません。

0
引用返信 編集キー/
■7591 / inTopicNo.8)  Re[7]: Excelのバージョンの違いについて
□投稿者/ mima 二等兵(6回)-(2006/10/18(Wed) 15:09:11)

分類:[C#] 


>>ところで…… Excel のライブラリを参照設定したりはしていませんよね?
>>(No7559で“遅延バインド”だと書いておられるので、大丈夫だとは思いますが…)
>
> これはしていません。

すみません、どうも確認したらしているようです。。
うーん、前任者から遅延バインドと聞いていたんですが??
ちょっと、コード全体を見直してみます。

0
引用返信 編集キー/
■7600 / inTopicNo.9)  Re[8]: Excelのバージョンの違いについて
□投稿者/ 魔界の仮面弁士 少佐(187回)-(2006/10/18(Wed) 16:32:39)

分類:[C#] 

No7591に返信(mimaさんの記事)
> すみません、どうも確認したらしているようです。。
「遅延バインド」だとしたら、コンパイル時に型の違いが
判断される事は無いでしょうし。(^^;


> うーん、前任者から遅延バインドと聞いていたんですが??
「基本的には事前バインド、一部遅延バインド」なのかも。

で、Excel のインターフェイスは、バージョン間でバイナリ互換性が薄いので、
事前バインドするなら、『それぞれのバージョン用にアセンブリを分ける』か、
あるいは『すべて遅延バインド』にするか、いずれかの選択肢となるでしょう。

# VBA や VB6 であれば、さほど問題の無いところなんですけれどね…。
# C# からだと、Excel の違いを吸収するのは大変かも。



No7563 への追記
> Application オブジェクトの Version プロパティの結果を元にして
このプロパティの戻り値は、数値以外の文字列を返すことがあるので要注意。
http://support.microsoft.com/kb/232652/en-us

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -