投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/5/8 22:36:33
> 44回までの学習では{開発環境|実行環境}について理解が及んでいるか心もとないのですが
たとえば、作成した EXE を他の人に使ってもらう場合、その人の使う環境と、
yamaV1.02β さんの開発環境とでは、OS あるいはインストールされているソフト等が
異なりますよね(Excelのバージョン等)。

この場合、開発環境とは「yamaV1.02β さんの環境」を指し、
実行環境とは「EXE を実際に起動させる環境」を指しています。

もし、開発した PC のみで実行させるのであれば、開発環境=実行環境 という事になります。


> Dim Excel As New Microsoft.Office.Interop.Excel.Application
> の部分で xl2003 が作成されるようにする方法がわかりません。
一つの環境に複数の Excel バージョンがインストールされていた場合、
それぞれのバージョンを切り替えて呼び出す事はできません。レジストリ登録の都合上、
どうしても後からインストールした方のライブラリの影響力が強くなってしまうためです。

混在環境におけるバージョン指定呼び出しがどうしても必要であれば、Excel をフルパス指定で
起動した上で、そのインスタンスをそれを GetObject 等を通じて取得するという手法がありますが、
基本的にはバージョン混在を避けるべきでしょう。


以下、少し専門的な話になります。


> Microsoft Excel 11.0 Object Libraryに参照設定して
これは、Excel 2003 のライブラリを参照する事になります。
(00020813-0000-0000-C000-000000000046 ; version 1.5)

> 参照を Microsoft Excel 9.0 Object Library に変更してみたところ
こちらは、Excel 2000 のライブラリですね。
(00020813-0000-0000-C000-000000000046 ; version 1.3)

で、ここからが本題。

> Book.SaveAs("C:\VB\Test.xls")
Workbook.SaveAs メソッドの定義は、2003 と 2000 とでは異なります。

Workbook.SaveAs は、Excel のバージョンによって、以下の3種のメソッド定義が存在します。
引数の数、DispId、メソッド名の違いに着目してみてください。
'★ SaveAs メソッド[1]     '★ SaveAs メソッド[2]       '★ SaveAs メソッド[3] 
<DispId(&H11C)> _           <DispId(&H785)> _           <DispId(&H11C), EditorBrowsable(Never)> _
Sub SaveAs(                 Sub SaveAs(                 Sub _SaveAs(
   Filename,                   Filename,                   Filename,
   FileFormat,                 FileFormat,                 FileFormat,
   Password,                   Password,                   Password,
   WriteResPassword,           WriteResPassword,           WriteResPassword,
   ReadOnlyRecommended,        ReadOnlyRecommended,        ReadOnlyRecommended,
   CreateBackup,               CreateBackup,               CreateBackup,
   AccessMode,                 AccessMode,                 AccessMode,
   ConflictResolution,         ConflictResolution,         ConflictResolution,
   AddToMru,                   AddToMru,                   AddToMru,
   TextCodepage,               TextCodepage,               TextCodepage,
   TextVisualLayout)           TextVisualLayout,           TextVisualLayout)
                               Local)

Excel 97, 2000 が持っているのは、[1] のみです。
Excel 2002, 2003, 2007 が持っているのは、[2] と [3] です。


そのため、たとえば Excel 2003 のライブラリを参照設定して、
> Book.SaveAs("C:\VB\Test.xls")
というコードを書き、それを Excel 2000 環境で実行した場合、
メソッドの定義が異なるため、呼び出しが失敗する事になります。

なお、2003 ライブラリで [3] を呼び出すコードや、
2000 ライブラリで [1] を呼びだすコードを書いた場合は、
 Excel 2000以下の環境 …… [1] のメソッドが呼び出される。
 Excel 2002以上の環境 …… [3] のメソッドが呼び出される。
となり、そのまま動作する可能性があります。


一方、レイトバインド(あるいは CallByName で呼び出した場合)に成功した件についてです。

まず、SaveAs メソッドは、引数がすべて省略可能(Optional)になっています。
レイトバインドでは、実行時にメソッド名からの名前解決が行われますので、
> Book.SaveAs("C:\VB\Test.xls")
というコードを呼び出した場合、
 Excel 2000以下の環境 …… [1] のメソッドが呼び出される。
 Excel 2002以上の環境 …… [2] のメソッドが呼び出される。
という呼び分けが行われる事になります。

なお、レイトバインドでの呼び出しを行うために、必ずしもすべてを
> Dim Excel As Object
> Excel = CreateObject("Excel.Application")
のように Object で記述する必要はありません。

必要な部分のみをレイトバインドすれば良いのであれば、たとえば
 CObj(Book).SaveAs("C:\VB\Test.xls")
あるいは
 Dim oBook As Object = Book
 oBook.SaveAs("C:\VB\Test.xls")
あるいは、
 CallByName(Book, "SaveAs", CallType.Method, "C:\VB\Test.xls")
といった、部分的な記述を行うだけでも効果があります。


----
なお、このような問題は SaveAs に限った事ではありません。Excel のメソッドやプロパティは、
バージョンが異なると引数の数が増加したり、以前は Sub だったメソッドが Function に
変更されるなどの変更が重ねられてきています。

そのため Excel を利用する場合には、Excel のバージョンを一つに絞っておかないと、
思わぬトラブルの元となってしまうことになります。

どうしてもバージョン混在での開発が必要なら、各 Excel バージョンのライブラリの違いを
十分に把握できる環境と知識が必要になります。それができないのであれば、
> 「複数のバージョンの Excel を同一環境にインストール」をやめるべき
だと思いますよ。