DOBON.NET DOBON.NETプログラミング掲示板過去ログ

他のマシンでの動作(Excel呼び出し)

環境/言語:[VB.NET .NET Framework1.1]
分類:[.NET]

 いつもお世話になります。

 作成中のプログラムがとりあえず完成したので、別のPCで使おうとしたら、途中で「オブジェクト参照がオブジェクトインスタンスに設定されていません」と言われて止まってしまいます。
 作成したプログラムは、主に画像処理で、途中エクセルのマクロを呼び出して計算させるようになっています。どうやら、エクセルの呼び出しができないようです。当然ですが、作成もとでは問題なく動いています。

 作成の環境
  OS:Windows XP sp2
開発言語 VB2003 .NET  .NET Framework 1.1
  OFFICE 2003 Pro

  参照したライブラリ Microsoft Excel 11.0 Object Library TypeLib 1.5

 使用した環境
  OS:Windows XP sp2
  VB2003 .NETはインストールされていない
  .NET Framework 1.1 日本語パックはインストール済み
  OFFICE 2000 Pro

 プログラムフォルダに、binフォルダにある、作成したプログラムのEXE,PDBファイルInterop.Excel.dll Interop.Office.dll Interop.VBIDE.dll のライブラリ、及び使用するExcelのワークブックを同じフォルダに入れています。
 プログラム名は、MID1.exe
作成時のフォルダは、C:\しごと\画像プログラム\プログラム\プログラム1\
 フォームは、ParentFormを親フォームとして、FolderForm Child1_All Childe2_Exp の3つの子フォームが存在します。エクセルを参照するのが、Child1_All Childe2_Exp の2つの子フォームです。

 エラーメッセージの内容 少し長くなりますが、全文引用します。ただし、JITデバッグを呼び出す詳細部分は除きます。

 よろしくお願いします。

********引用開始*************************

このダイアログ ボックスではなく、Just-In-Time (JIT) デバッグを呼び出すための詳細については、 このメッセージの最後を参照してください。

************** 例外テキスト **************
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
at Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
at MDI1.Child1_All.Excel() in C:\しごと\画像プログラム\プログラム\プログラム1\Child1_All.vb:line 763
at MDI1.Child1_All.pictureBox1_MouseUp(Object sender, MouseEventArgs e) in C:\しごと\画像プログラム\プログラム\プログラム1\Child1_All.vb:line 482
at System.Windows.Forms.Control.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 読み込まれたアセンブリ **************
mscorlib
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.2032
コードベース : file:///c:/windows/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
MDI1
アセンブリ バージョン : 1.0.0.0
Win32 バージョン : 1.0.0.0
コードベース : file:///C:/Program%20Files/てん茶色情報/プログラム/MDI1.exe
----------------------------------------
System.Windows.Forms
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.2032
コードベース : file:///c:/windows/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.2032
コードベース : file:///c:/windows/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Drawing
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.2032
コードベース : file:///c:/windows/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------
System.Windows.Forms.resources
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.573
コードベース : file:///c:/windows/assembly/gac/system.windows.forms.resources/1.0.5000.0_ja_b77a5c561934e089/system.windows.forms.resources.dll
----------------------------------------
Microsoft.VisualBasic
アセンブリ バージョン : 7.0.5000.0
Win32 バージョン : 7.10.6001.4
コードベース : file:///c:/windows/assembly/gac/microsoft.visualbasic/7.0.5000.0__b03f5f7f11d50a3a/microsoft.visualbasic.dll
----------------------------------------
Interop.Excel
アセンブリ バージョン : 1.5.0.0
Win32 バージョン : 1.5.0.0
コードベース : file:///C:/Program%20Files/てん茶色情報/プログラム/Interop.Excel.DLL
----------------------------------------
mscorlib.resources
アセンブリ バージョン : 1.0.5000.0
Win32 バージョン : 1.1.4322.573
コードベース : file:///c:/windows/assembly/gac/mscorlib.resources/1.0.5000.0_ja_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
    
*******引用終了********************************
2006/03/22(Wed) 17:45:24 編集(投稿者)

■No14950に返信(つつみさんの記事)
>参照したライブラリ Microsoft Excel 11.0 Object Library TypeLib 1.5

それがExcel2003用だからだと思います。

97=8.0
2000=9.0
2002=10.0
2003=11.0

のObject Libraryを参照設定する必要があったと思います。

どのバージョンでも使えるようにするには参照設定をやめて遅延バインディングで
やるしかないのでは?
>  プログラムフォルダに、binフォルダにある、作成したプログラムのEXE,PDBファイルInterop.Excel.dll Interop.Office.dll Interop.VBIDE.dll のライブラリ、及び使用するExcelのワークブックを同じフォルダに入れています。

突込みが入りそうですが、、、
Interop.Excel.dllのみにすると動くかもしれません。>2003独自の呼び出しが無ければ
あくまで経験談でやっちゃいけないことかもしれません(汗

> at MDI1.Child1_All.Excel() in C:\しごと\画像プログラム\プログラム\プログラム1\Child1_All.vb:line 763

行番号が出てますので見てみましょう。<「どうやら」という言葉があったので書いてます。
早速ありがとうございました。
 ライブラリは下位互換性ではないのですね。
 作成している環境が、Office2003なので、下位のライブラリを参照しようとすると、ビルドエラーを起こしますので、難儀です。
 遅延バインディングというのがいまいちよくわかっていないのですが、具体的にはどうすればよいのでしょうか。

■No14953に返信(YASさんの記事)
> 2006/03/22(Wed) 17:45:24 編集(投稿者)
>
> ■No14950に返信(つつみさんの記事)
> >参照したライブラリ Microsoft Excel 11.0 Object Library TypeLib 1.5
>
> それがExcel2003用だからだと思います。
>
> 97=8.0
> 2000=9.0
> 2002=10.0
> 2003=11.0
>
> のObject Libraryを参照設定する必要があったと思います。
>
> どのバージョンでも使えるようにするには参照設定をやめて遅延バインディングで
> やるしかないのでは?
>
早速ありがとうございます。
 Interop.Excel.dll だけにしても、だめでした。
 作ったマクロは基本的なことしかしていないので、2003独自の呼び出しは無いと
思うのですが……
 引っかかっているのは、「どうやら」ではなく、「間違いなく」です。

■No14959に返信(まどかさんの記事)
>> プログラムフォルダに、binフォルダにある、作成したプログラムのEXE,PDBファイルInterop.Excel.dll Interop.Office.dll Interop.VBIDE.dll のライブラリ、及び使用するExcelのワークブックを同じフォルダに入れています。
>
> 突込みが入りそうですが、、、
> Interop.Excel.dllのみにすると動くかもしれません。>2003独自の呼び出しが無ければ
> あくまで経験談でやっちゃいけないことかもしれません(汗
>
>> at MDI1.Child1_All.Excel() in C:\しごと\画像プログラム\プログラム\プログラム1\Child1_All.vb:line 763
>
> 行番号が出てますので見てみましょう。<「どうやら」という言葉があったので書いてます。
2006/03/23(Thu) 09:32:53 編集(投稿者)

 正確ではない内容かもしれませんが,以下は私なりの解釈です。

 遅延バインディングというのは参照設定するのをやめて,全部Object型の変数につっこんでしまうことです。
 Object型ですからメソッドやプロパティはIDEの入力支援に表示されません。
 表示はされませんが,脳内にあるメソッドのリストを参照しながらタイプします。
 実行時にはメソッドやプロパティをその都度探しながら実行してくれます。
 メソッドがないなどのエラーは実行するまで発覚しませんし,実行速度も多少遅くなるのがデメリットです。
 また,Option Strict Onでは遅延バインディングはできません。
お世話になります。

 今Excelで処理しているデータが、だいたい3〜4列、40,000行程度について、ヒストグラムデータを生成させ、それをもとに統計処理するというもので、Excelで処理させるのが一番やりやすかったので、Excelを参照することにしてプログラムを組んだとろこです。
 想定される使う環境は、Excel2000と2003なので、2000のPCでコードしなおして、とりあえずその2バージョンを作ることにします。
 ありがとうございました。

■No14984に返信(YASさんの記事)
> 2006/03/23(Thu) 09:32:53 編集(投稿者)
>
>  正確ではない内容かもしれませんが,以下は私なりの解釈です。
>
>  遅延バインディングというのは参照設定するのをやめて,全部Object型の変数につっこんでしまうことです。
>  Object型ですからメソッドやプロパティはIDEの入力支援に表示されません。
>  表示はされませんが,脳内にあるメソッドのリストを参照しながらタイプします。
>  実行時にはメソッドやプロパティをその都度探しながら実行してくれます。
>  メソッドがないなどのエラーは実行するまで発覚しませんし,実行速度も多少遅くなるのがデメリットです。
>  また,Option Strict Onでは遅延バインディングはできません。
>  想定される使う環境は、Excel2000と2003なので、2000のPCでコードしなおして、とりあえずその2バージョンを作ることにします。

あ、たぶんそれでうまくいくと思います。
先の私の発言は、Office2000環境でソースを開いたときに
2003用の相互運用ライブラリが見つからないので削除してビルドしたら
両方で動くようになったというものでした。。。
どうもありがとうございます。
 すぐに確認すればよかったのですが、別の件で出来ていませんでした。
 Office2000の環境でビルドし直したら、ちゃんと両方で動きました。

 下位互換性が無いというのは、困ったものですね。

■No15006に返信(まどかさんの記事)
> あ、たぶんそれでうまくいくと思います。
> 先の私の発言は、Office2000環境でソースを開いたときに
> 2003用の相互運用ライブラリが見つからないので削除してビルドしたら
> 両方で動くようになったというものでした。。。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板