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

VBからC#へ(Excelファイルの生成に関する質問)

1
投稿者投稿内容
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-10-12 09:25
既に何件かExcelファイルの生成に関しての議題は上がって
いるようなのですが、私の知りたい点に関して書かれていた
スレッドが見当たらなかったので質問させてください。

今、以下のようにVBで書かれているプログラムを移植している
最中です。
Dim objApp As Object
Dim objWbk As Object

objWbk = GetObject("C:\Temp\Test.xls")
objApp = objWbk.Application
---ここでセルなどの操作を行います
objApp.Quit()

いくつかの資料を調べるとエクセルの参照設定を行う方法は
見つかったのですが、上記のプログラムのように参照設定を
まったく持たずにエクセルを操作する方法はC#では、見当たり
ませんでした。
そこで2点に関して疑問があります。
1.上記のプログラムのように参照設定を行わずにエクセルを
 操作する方法はC#にはないのでしょうか。
2.もし参照設定を行うしかないとして、私の開発環境は
 OfficeXPをいれていますが、クライアントの運用環境は
 Office97または2000である可能性が高いのですが、運用時に
 問題が発生することはないのでしょうか。(実際はこれが
 心配で上記のようなレイトバインディングを使っている
 わけです)

エクセルの操作といってもセルに値や書式を設定する程度の
機能で、バージョンに依存するような機能は使っていません。

もし何らかの情報をお持ちの方がおられましたら
どうかヒントなどでも結構ですので教えてください。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-10-12 14:55
こんにちわ。諸農です。

マイクロソフトサポート技術情報-302902
[HOWTO] Visual C# .NETでOfficeオートメーションサーバーをバインドする方法
http://support.microsoft.com/default.aspx?scid=kb;JA;302902

に書かれている「遅延バインディング」が参考になるかもしれません。

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-12 15:22
 ただし、遅延バインディングを行うと、IDE環境でインテリセンスが利かなくなります。実行時に型の解釈を行うので、若干処理速度が低下します。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-10-12 16:23
Jubei(諸農)さん、Jittaさん、ありがとうございます。

実は、おっしゃられているレイトバインディングの記事は私も見たんです。
ただ、私の中に引っかかっていることは、やはりこのレイトバインディングの
例でも、事前に参照設定を行わなければならず、かつコーディング中でも
Excel.Applicationオブジェクトを直接指定して使っています。

VBにおいて、GetObject関数を用いるにあたっては、一切このプロセスを
必要としませんでした。
元来レイトバインディングのメリットは実行時まで特定のオブジェクトを必要と
しないところにあると思うのですが。

これは私にとっては結構な問題点なんです。
今回は確かにExcelの簡単なセル操作のみのサブルーチンなんですが、
他にも、GetObjectで取ってきたオブジェクトがExcelのWorkBooksでも
WordのDocumentでも自動的に操作できるよう組んであるサブルーチンなども
あるため、事前に参照設定が必要であったり、コード中に直接Excel.Application
という形でオブジェクトを特定してしまうのは、移植する上で大きな障害と
なってしまうのです。
それで、このGetObjectの手法に結構こだわっているわけでもあります。

なんとかすっきりと移植する方法はないものなのでしょうか。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-10-12 17:31
引用:

べーちゃんさんの書き込み (2003-10-12 16:23) より:
VBにおいて、GetObject関数を用いるにあたっては、一切このプロセスを
必要としませんでした。
元来レイトバインディングのメリットは実行時まで特定のオブジェクトを必要と
しないところにあると思うのですが。



Microsoft.VisualBasic.Interaction.GetObject
をそのまま使うのが一番簡単では?
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-10-12 20:35
よねKENさん、ありがとうございます。

>Microsoft.VisualBasic.Interaction.GetObject
>をそのまま使うのが一番簡単では?

その手も考えたのですが、折角VBからC#に移行しようとしているので
できるだけVBのしがらみからとかれたかったので、.NET Framework
特有の方法を探していたのです。

でも、やっぱりVBの機能を呼び出すしかないのかな。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-10-12 20:36
引用:

VBにおいて、GetObject関数を用いるにあたっては、一切このプロセスを
必要としませんでした。
元来レイトバインディングのメリットは実行時まで特定のオブジェクトを必要と
しないところにあると思うのですが。


C# では、この方法はお奨めできません。
C# で本当のレイトバインディングを行う場合、リフレクションの機能をもろに使って呼び出す必要があります。
VBの場合は、(開発時では)インテリセンスが効かない程度の弊害ですが、C# の場合、通常のメソッドの記述では呼び出す事が出来ません。とっても泥臭いコードになるはずです。

はっきり言って、どうしてもレイトバインディングでやりたいのならVBでやるのが無難です。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-10-22 14:16
遅くなりましたが、なちゃさんどうもありがとうございました。

>はっきり言って、どうしてもレイトバインディングでやりたいのならVBでやるのが
>無難です。

結局、今回は時間が無かったためVB.NETでレイトバインディングのクラスライブラリを
作成して、それをC#から呼び出す方法を取りました。

>C# で本当のレイトバインディングを行う場合、リフレクションの機能をもろに使って
>呼び出す必要があります。

調べれば調べるほどその通りですね。
簡単に実現できる方法がないか、もうしばらく模索してみることにします。
ありがとうございました。
1

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