はじめまして。
VB.NETからExcelを操作するアプリケーションを作成しようと思っているのですが、
「Microsoft Excel *.* ObjectLibrary」の参照設定を追加して、
インテリセンスを使用する方向で開発を進めようと考えています。
ただ、この方法を使うとエクセルバージョン固定のアプリケーションになってしまいます。
みなさんは、参照設定をどのような使い方をしているのでしょうか?
僕が思いつくのは、以下のようなことです。
① 開発時は、参照設定しておくが、コンパイルするときは、参照設定から
はずすして、コンパイルしている。
② Excelのバージョン毎に、アプリケーションを分けている。
→ うーん。。そんなことしないですよね?
はじめたばかりで、良くわかっていないのですが、
皆さんの開発方法を参考にさせてください。
よろしくお願いします。
> コンパイルするときは、参照設定からはずす
私の場合は、#If ディレクティブを使うなどして、事前バインディングの
コードと、実行時バインディングのコードを切り替えるようにしています。
> Excelのバージョン毎に、アプリケーションを分けている。
現実的には、このパターンが最も安全でしょう。
私の場合は、基本的にはバージョン固定で運用してもらっています。
PIA が用意されていないような旧バージョンまでサポートしたく無いので。(^^;
それでもどうしても別バージョンのExcelが必要になってしまう場合は、
(案1) 互換性の無いメソッドだけは、CallByName にて呼び出す。
(案2) 各バージョンの Excel を使って、別々にコンパイルしなおす。
という感じですね。
参照設定をしつつ、複数のバージョンに対応させる事もできなくは無いですが、
その場合、使用できるメソッドに制限が生じます。
たとえば Workbooks.Open() は、Excel のバージョンによって引数の数が
異なります。Excel 97 だと13個、2003では15個です。
そのため、2003 環境でコンパイルしたものは、97環境で動作しません。
ただし、Excel 2003 では、Workbooks._Open() という隠しメソッドが
用意されています。_Open は、旧バージョンの Open と同様、13個の引数を
持っているので、Open の代わりに _Open を使うようにすれば、
古い Excel でも新しい Excel でも、同じコードで動作させる事が可能です。
(SaveAs なども同様で、_SaveAs という互換メソッドが用意されています)
ですが、こうした互換メソッドが用意されているとは限りません。
中には、同じ DispId に対して、異なるメソッドが割り当てられてしまって
いる事もありますので、そういう場合は、レイトバインドによる呼び出しで
対応するか、あるいはアセンブリを分けるといった手続きが必要でしょう。
おぉ。。。そうなんですか。。。
とっても難しそうですね。
ちなみに、
> 参照設定をしつつ、複数のバージョンに対応させる事もできなくは無いですが、
> その場合、使用できるメソッドに制限が生じます。
この方法で対応できれば、一番、開発が楽だと思うのですが、
使用できるメソッドと、そうでないメソッドの見分け方って何かあるのでしょうか?
引数が同じだったら、動作すると考えても良いのでしょうか?
認識が違っていたら、指摘してください。
よろしくお願いします。
> この方法で対応できれば、一番、開発が楽だと思うのですが、
むしろ、調査工数が嵩むかと思いますよ。
> 使用できるメソッドと、そうでないメソッドの見分け方って何かあるのでしょうか?
まずは、各バージョンの Excel を用意してください。
たとえば、「97のみ」「2000のみ」「2002のみ」「2003のみ」「2007のみ」と。
そして、Platform SDK 付属の OLEVIEW などのツールを使って、
それぞれのオブジェクト情報の一覧を取得します。
あるいは、下記のようなツールなども使えるでしょう。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=TLBD001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D
その後、それらの内容を比較して見てください。定義が同じならばそのまま使えるはずです。
(開発後は、それぞれの環境でテストを行ってください)
> 引数が同じだったら、動作すると考えても良いのでしょうか?
それは、実行時バインディングの場合ですね。
事前バインディングの場合は、引数定義が同じだとしても、ディスパッチIDが
異なっている場合には別のメソッドとして扱われると思います。逆にいえば、
IDと引数定義さえ同一であれば、メソッドの名前が異なっていたとしても、
動作するでしょう。IID や CLSID が異なっている場合は駄目ですけど…。
ツイート | ![]() |