tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelを呼ぶとエラー
記事No2652
投稿日: 2005/11/28(Mon) 00:39
投稿者すすくろ
[OSのVer]:Windows XP    [VBのVer]:VB.NET2003 
Excel:2000

初めまして、すすくろと申します。
VB.NETからエクセルの表のデータを読み出して
処理しています。

開発しました自分のマシンでは問題なく動作します。
コンパイルされた実行形式ファイルを、他のマシンで
動作させると、動作するマシンと下記のエラーを出して
停止してしまうマシンがあります。

An unhandled exception has occurred in your application.
If you click Continue, the application will ignore this error and attempt to continue.
If you click Quit, the application will be shut down immediately.
File or assembly name Interop. Excel,or one of its dependencies, was not found.

どのマシンにも、.NETFramework1.1はインストールしています。

エクセルは以下のコードで利用しています。

-------------------------------------------------------------------------
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        Dim xlFilePath As String = Fname(2)
        Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
        Dim xlRange As Excel.Range
        'xlApp.Visible = True        'Excelを表示

        'データの入力処理 
        For i = 1 To Zcount
            For h = 1 To 51
                Try
                    DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
                Catch ex As Exception
                    DP(h, i) = ""
                End Try
            Next
        Next
---------------------------------------------------------------------------------------

 アセンプリ名 Interop 。エクセル、あるいはその(付属ファイル?)が見つけられない。
とあるので、エクセル関連の何かファイルが動作しないマシンでは不足しているとは思うのですが

ご教授いただければ幸いです。


 

[ツリー表示へ]
タイトルRe: Excelを呼ぶとエラー
記事No2653
投稿日: 2005/11/28(Mon) 08:43
投稿者花ちゃん
> 開発しました自分のマシンでは問題なく動作します。
> コンパイルされた実行形式ファイルを、他のマシンで
> 動作させると、動作するマシンと下記のエラーを出して
> 停止してしまうマシンがあります。

開発マシンのExcelのバージョンと実行マシンのExcelのバージョンはどのように
なっていますか?

> DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()

上記では Com オブジェクトの開放処理がされていないのでExcelのプロセスが残る事になり
1回きりの動作では問題が発覚しにくいが2度3度と繰り返すとエラーが発生する事に
なりますが、投稿されたコードは一部のようなのでその辺はどうなっていますか?
(当サイトのExcel・Word 他 のExcelのプロセスが正常に終了しない理由 他をご覧下さい)

又、エラー処理をはずして実行してどの部分でエラーが発生しますか?
開発マシン上で同じプログラムを連続して実行して見て問題がありませんか?
For 〜 Next の回数を減らした場合はどのようになりますか?

まずは、Excelを終了した時点でExcelのプロセスがタスクから消えているか確認する
事(VBは起動したまま)から初めて下さい。


# コードを投稿される場合は[図表モード]で投稿してください。最下部の[修正]から、
 今からでも修正できます。

[ツリー表示へ]
タイトルRe^2: Excelを呼ぶとエラー
記事No2662
投稿日: 2005/11/28(Mon) 17:24
投稿者すすくろ
[OSのVer]:Windows    [VBのVer]:VB.NET  
すすくろです。
早急のご返答ありがとうございます。

> 開発マシンのExcelのバージョンと実行マシンのExcelのバージョンはどのように
> なっていますか?
開発マシンは、Excel2000です。実行マシンは2000を入れ直しました。

> > DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
>
> 上記では Com オブジェクトの開放処理がされていないのでExcelのプロセスが残る事になり
> 1回きりの動作では問題が発覚しにくいが2度3度と繰り返すとエラーが発生する事に
> なりますが、投稿されたコードは一部のようなのでその辺はどうなっていますか?
> (当サイトのExcel・Word 他 のExcelのプロセスが正常に終了しない理由 他をご覧下さい)
>
> 又、エラー処理をはずして実行してどの部分でエラーが発生しますか?
> 開発マシン上で同じプログラムを連続して実行して見て問題がありませんか?
> For 〜 Next の回数を減らした場合はどのようになりますか?
当該マシンが離れたところにあるので、今確認しています。
現在のところわかりません。

> まずは、Excelを終了した時点でExcelのプロセスがタスクから消えているか確認する
> 事(VBは起動したまま)から初めて下さい。

xlApp.DisplayAlerts = False
xlApp.DisplayAlerts = True      

MRComObject(xlRange)            
MRComObject(xlSheet)            
MRComObject(xlSheets)          
xlBook.Close(False)            
MRComObject(xlBook)            
MRComObject(xlBooks)            
xlApp.Quit()                        
MRComObject(xlApp)              

を処理の最後に加えてあります。
すべて、表示せず申し訳ありません。

> # コードを投稿される場合は[図表モード]で投稿してください。最下部の[修正]から、
>  今からでも修正できます。
申し訳ありません。すぐに修正します。

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: Excelを呼ぶとエラー
記事No2663
投稿日: 2005/11/28(Mon) 20:45
投稿者花ちゃん
エラーメッセージを調べていたら下記の記述が見つかりました。
やはり原因は、DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
の部分が開放洩れになっているからです。
この事は開発環境でも確認できるはずです。

----------------------------------------------------------------------------------
アプリケーションをサポートするスマート タグのコピーが 1 つでも開いている間は、
これらのアプリケーションの新しいインスタンスを再起動しても、スマート タグの
レジストリがアプリケーションによって再チェックされない可能性があります。
この場合の最も適した解決方法は、[タスク マネージャ] を開き (Ctrl + Alt + Del キー)、
[プロセス] タブをクリックして、表示されている EXCEL.EXE といったプロセスを
すべて終了させることです。

[ツリー表示へ]
タイトルRe^4: Excelを呼ぶとエラー
記事No2666
投稿日: 2005/11/29(Tue) 12:24
投稿者すすくろ
[OSのVer]:Windows    [VBのVer]:VB.NET  
ご返答ありがとうございます。

> エラーメッセージを調べていたら下記の記述が見つかりました。
> やはり原因は、DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
> の部分が開放洩れになっているからです。
> この事は開発環境でも確認できるはずです。

DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
MRComObject(xlRange)

のようにして、開発環境で状況を試してみました。
処理時間が幾分速くなったような感覚がします。
開発環境では元々エラーが出ていなかったので、明確な
比較が出来ていません。実行ファイルを問題のあった
ところで実行させていますものの、遠隔地の為返答が
まだ届いておりません。
エラーを無視した場合の状況もまだわかりません。
対応が遅く申し訳ありません。


> ----------------------------------------------------------------------------------
> アプリケーションをサポートするスマート タグのコピーが 1 つでも開いている間は、
> これらのアプリケーションの新しいインスタンスを再起動しても、スマート タグの
> レジストリがアプリケーションによって再チェックされない可能性があります。
> この場合の最も適した解決方法は、[タスク マネージャ] を開き (Ctrl + Alt + Del キー)、
> [プロセス] タブをクリックして、表示されている EXCEL.EXE といったプロセスを
> すべて終了させることです。
この方法も試すように連絡しています。

状況の連絡が有り次第報告させていただきます。

[ツリー表示へ]
タイトルRe^5: Excelを呼ぶとエラー
記事No2667
投稿日: 2005/11/29(Tue) 12:53
投稿者花ちゃん
> DP(h, i) = CType(xlSheet.Cells(h, i + 1), Excel.Range).Value.ToString()
> MRComObject(xlRange)

何度も言うようですが(No.2653)上記ではExcelのプロセスが残ったままになります。
(ここのExcel・Word 他 の処理と見比べて下さい。)
hhttp://www.bcap.co.jp/hanafusa/bbs/wforum.cgi?mode=allread&no=997#1000
hhttp://www.bcap.co.jp/hanafusa/dotnet/Excel08.htm
hhttp://www.bcap.co.jp/hanafusa/dotnet/Excel01.htm
hhttp://www.bcap.co.jp/hanafusa/dotnet/Excel07.htm

今一度確認して下さい。(開発環境でも同じです)
VBのプログラムを起動したまま、上記プログラムを実行して、Excelが終了した時点で
Ctrl キー と Alt キー と Del キーを押してタスクマネジャーを表示してExcel.EXE が
表示したままになっていないか確認して下さい。
すべてはそれからです。
(VB のプログラムを終了するとExcel.exe が消える場合も同じで問題ありです)

[ツリー表示へ]
タイトルRe^6: Excelを呼ぶとエラー
記事No2676
投稿日: 2005/11/29(Tue) 18:03
投稿者すすくろ
[OSのVer]:Windows    [VBのVer]:VB.NET  
お手数おかけして申し訳ありません。
参考資料を参考に、ご指摘の部分を自分なりに修正してみました
コードは以下のように直しました。

       Dim xlApp As New Excel.Application
       Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
       Dim xlFilePath As String = Fname(2)
       Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)
       Dim xlSheets As Excel.Sheets = xlBook.Worksheets
       Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)

        Dim xlCells As Excel.Range ’この部分修正
        Dim xlRange As Excel.Range ’この部分修正
        xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet)’この部分修正

        
        For i = 1 To Zcount
            For h = 1 To 51
                Try
                    xlCells = xlSheet.Cells   ’この部分修正
                    xlRange = DirectCast(xlCells._Default(h, i + 1), Excel.Range) ’この部分
修正

                    DP(h, i) = CType(xlRange, Excel.Range).Value ’この部分修正
                    MRComObject(xlCells)  ’この部分修正
                    xlCells = Nothing   ’この部分修正
                    MRComObject(xlRange)  ’この部分修正
                    xlRange = Nothing  ’この部分修正
                Catch ex As Exception
                    DP(h, i) = ""
                End Try
            Next
        Next
        Cp = Zcount

> 今一度確認して下さい。(開発環境でも同じです)
> VBのプログラムを起動したまま、上記プログラムを実行して、Excelが終了した時点で
> Ctrl キー と Alt キー と Del キーを押してタスクマネジャーを表示してExcel.EXE が
> 表示したままになっていないか確認して下さい。
> すべてはそれからです。
> (VB のプログラムを終了するとExcel.exe が消える場合も同じで問題ありです)
開発環境で
先のコードの場合
Ctrl キー と Alt キー と Del キーを押してタスクマネジャーを表示してExcel.EXE が
表示したままとなっていました。
加えて、いままで書き忘れていました現象で開発環境でも、プログラムを終了したあと
でエクセルのファイルをダブルクリックした場合、シートが開かないことがありました。

しかし、上記のコードとしたときは
Excel.exeは表示していませんでした。プロセスが残っていないと言うことでしょうか?
同時に、上記のシートが開かないこともなくなりました。

ただし、まだ実行形式にしたものの確認は出来ていません。

[ツリー表示へ]
タイトルRe^7: Excelを呼ぶとエラー
記事No2679
投稿日: 2005/11/30(Wed) 11:27
投稿者すすくろ
[OSのVer]:WindowsXP    [VBのVer]:VB.NET2003  

たびたびのご指導大変ありがとうございます。
何回も済みません。
エラーの症状ですが、コンパイルされたEXEを開発環境でも
ディスクトップなどにおいて実行すると
下記のエラー

--------------------------------------------------------------------------------------------
System.IO.FileNotFoundException: ファイルまたはアセンブリ名 Interop.Excel、またはその依存関係
の 1 つが見つかりませんでした。
ファイル名 : "Interop.Excel"

---------------------------------------------------------------------------------------------
が起きます。

プロジェクトのBINフォルダにあるEXEを実行すると発生しません。

ファイルの置く場所が関係あるのでしょうか。

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^8: Excelを呼ぶとエラー
記事No2681
投稿日: 2005/11/30(Wed) 12:02
投稿者魔界の仮面弁士
> ディスクトップなどにおいて実行すると
ディスクトップ(disk-top) ではなく、
デスクトップ(desktop)ですよね。

> ファイル名 : "Interop.Excel"
自動生成された IA (この場合は Interop.Excel.dll) の使用は推奨されていません。
可能な限り、Microsoft.Office.Interop.Excel.dll の PIA を使うようにしましょう。

hhttp://support.microsoft.com/kb/328912/
hhttp://support.microsoft.com/kb/827476/
hhttp://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.asp


> プロジェクトのBINフォルダにあるEXEを実行すると発生しません。
PIA を使っている場合は、それが グローバル アセンブリ キャッシュ (GAC) 内に
インストールされているため、EXE 単体で済みます。

ですが、動的に生成された IA を使っているのであれば、そのアセンブリを
EXE と同じフォルダに配置しなければなりません。

[ツリー表示へ]
タイトルRe^9: Excelを呼ぶとエラー
記事No2682
投稿日: 2005/11/30(Wed) 13:11
投稿者すすくろ
[OSのVer]:Windows    [VBのVer]:VB.NET  

魔界の仮面弁士さん、ありがとうございます。
> ディスクトップ(disk-top) ではなく、
> デスクトップ(desktop)ですよね。
お恥ずかしい限りです。ついついディスクと言ってしまいます。


> 自動生成された IA (この場合は Interop.Excel.dll) の使用は推奨されていません。
> 可能な限り、Microsoft.Office.Interop.Excel.dll の PIA を使うようにしましょう。
> PIA を使っている場合は、それが グローバル アセンブリ キャッシュ (GAC) 内に
> インストールされているため、EXE 単体で済みます。
> ですが、動的に生成された IA を使っているのであれば、そのアセンブリを
> EXE と同じフォルダに配置しなければなりません。
参照サイトを見て、問題点がわかりました。
Excel2000を未だ使用しているため、2002以降のものが使用できるかが
疑問でしたので、EXEと同じフォルダにプロジェクトのobjctフォルダの
Interop.Excel.dllをコピーして動作させたところ、問題なく動作いたし
ました。
非常に助かりました、ありがとうございます。

アドバイスいただいた、魔界の仮面弁士さん、花ちゃんさん
あらためてお礼申し上げます。本当にありがとうございます。

[ツリー表示へ]
タイトルRe^7: Excelを呼ぶとエラー
記事No2680
投稿日: 2005/11/30(Wed) 11:48
投稿者魔界の仮面弁士
> Dim xlRange As Excel.Range ’この部分修正
> DP(h, i) = CType(xlRange, Excel.Range).Value ’この部分修正

Excel.Range型の変数を、Excel.Range型に CType していますが、これは明らかに無意味でしょう。

それと、ループを使って、 xlSheet.Cells の取得と解放を繰り返していますが、これも無駄です。
ループの外で Cells を変数に受け取り、ループ中ではそれを利用するようにして、
ループ後に解放するように組み替えましょう。

また、Try〜End Try の使い方も奇妙に思えます。そのコードだと、例外が発生した時に、
Excelのオブジェクトの解放処理が抜け落ちてしまう可能性がありますよね。


> ただし、まだ実行形式にしたものの確認は出来ていません。
コンパイル後に実行されますから、常に実行形式なのでは。

[ツリー表示へ]
タイトルRe^8: Excelを呼ぶとエラー
記事No2683
投稿日: 2005/11/30(Wed) 13:18
投稿者すすくろ
[OSのVer]:Windows    [VBのVer]:VB.NET  

ご指摘ありがとうございます。
> Excel.Range型の変数を、Excel.Range型に CType していますが、これは明らかに無意味でしょう。
勉強させていただきました。早速修正いたします。

> それと、ループを使って、 xlSheet.Cells の取得と解放を繰り返していますが、これも無駄です。
> ループの外で Cells を変数に受け取り、ループ中ではそれを利用するようにして、
> ループ後に解放するように組み替えましょう。
こちらに関しては確かに無駄かなと思いましたが、確実なのかと勘違いしておりました。
修正いたします。

> また、Try〜End Try の使い方も奇妙に思えます。そのコードだと、例外が発生した時に、
> Excelのオブジェクトの解放処理が抜け落ちてしまう可能性がありますよね。
ご指摘の通りです。流れをよく検討します。

> コンパイル後に実行されますから、常に実行形式なのでは。
確かにそうです。VB.NETですから常に実行形式です。

大変勉強になりました。本当にありがとうございます。

[ツリー表示へ]