Excel操作時のオブジェクト参照エラーについて・・・

解決


ゆう  2004-10-12 20:25:09  No: 116896

VB.NETでExcelを操作しているのですが、下記コード①で
「オブジェクト参照がオブジェクト  インスタンスに設定されていません。」というエラーがでてしまいます。

Excelの操作方法などは間違っていないと思うのですが・・・・

おねがいします。

コード

 'エクセル起動
        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oBooks As Excel.Workbooks
        Dim oSheet As Excel.Worksheet

            oExcel = CreateObject("Excel.Application")
            oBooks = oExcel.Workbooks
            oBook = oBooks.Open(FilePach)・・・・・①ここでエラーが出ます。
            oExcel.Visible = False
            oExcel.UserControl = False 
            oSheet = oBook.Worksheets(Trim(lotNo))

            処理・・・・・

             'エクセルの終了
            oExcel.Quit()

            'プロセスの開放
            If Not oSheet Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
                oSheet = Nothing
            End If

            If Not oBook Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
                oBook = Nothing
            End If

            If Not oBooks Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
                oBooks = Nothing
            End If

            If Not oExcel Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
                oExcel = Nothing
            End If

            GC.Collect()


ファリンファリン  2004-10-12 20:50:07  No: 116897

インスタンスが生成されていないんでしょうね。
CreateObject  ではなくて  Newして下さい。

        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oBooks As Excel.Workbooks

        oExcel = New Excel.Application
        oExcel.Visible = True
        oBooks = oExcel.Workbooks
        oBook = oBooks.Open("D:\Book1.xls")

※VB.NET2003  Microsoft Excel 9.0 Object Library参照
  動作確認済みです


ゆう  2004-10-12 21:10:30  No: 116898

返信有難うございます。

             oExcel = New Excel.Application()
            oExcel.Visible = False
            oBooks = oExcel.Workbooks
            oBook = oBooks.Open(FilePach) 'アプリケーションの現在地の絶対パス
            oExcel.UserControl = False 'これを設定しておけば勝手に終了しない。

この記述で実行してみたのですが、開発しているPCでは動くのですが
ほかのPCにインストールして動かすとまたオブジェクトの参照エラーが出て島します。

なぜでしょう??


葉月  2004-10-12 21:37:50  No: 116899

インストールというのは
A.インストーラを作成し、必要なDLL及びOCXもコピーしているということですか?
B.EXEファイルだけコピー&ペーストしているということですか?

エクセル参照を行ってから、配布(他の)マシンに
A.の作業は行いましたか?


特攻隊長まるるう  2004-10-12 22:01:56  No: 116900

…余談ですが、
エクセルを使った帳票システムを[VB.NET]で開発してきた経験上、
セットアッププロジェクトを作ると Excel.exe がインストーラに
含まれると思いますが、インストーラからは[除外]し、インストール
先の端末に、開発環境と同じ Office をインストールして運用する
のが一番トラブルが起こらない方法と感じています。

それと…ファイルパスという意味なら綴りは FilePath です。
…そんなに大した問題じゃありませんが。


ファリンファリン  2004-10-12 22:05:58  No: 116901

葉月さんお仰ってる通りです。
また、追記しますと実行環境にOfficeが
ない状態では動きませんよ?(流石にそんなことは無いですよね?
ExcelのCOMを参照してますので。。。

#開発環境・実行環境の提示が無いので
#推測での回答しかできませんね


ゆう  2004-10-12 22:17:26  No: 116902

返信有難うございます。

配布マシンにはイントラーを作成して配布しています。

Excel.EXEは除外しています。

開発側も配布側もOffice2000を使っています。

ちなみに今のコードです、

         Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oBooks As Excel.Workbooks
        Dim oSheet As Excel.Worksheet

            oExcel = New Excel.Application()
            oExcel.Visible = False
            oBooks = oExcel.Workbooks
            oBook = oBooks.Open(FilePach) ・・・・・①
            oExcel.UserControl = False 
            lblsyori.Visible = False

やはり①でエラーが起きます。

お願いします。


ゆう  2004-10-12 22:22:06  No: 116903

開発環境のほうですが、

VB.NET2002

Office2000  Pro

WindowsXP Pro

実行環境のほうですが

Windows98、2000、XP Pro    です。


葉月  2004-10-12 22:38:27  No: 116904

私の経験上
1.雛形エクセルの作成
2.そのエクセルをVBでオープン
3.オープンしたエクセルを編集
4.VBで自動的に別名保存
5.エクセルをクローズ

という順序だと思うのですが

相手先に1.のファイルは存在しますか?
パスの指定は間違っていないか
ファイルは存在するかを確認してみてください

あと修正する気があるなら、してみる程度でいいのですが
特攻隊長まるるうさんの仰るとおり
×FilePach
○FilePath
(別に障害はないがかっこ悪い)


ファリンファリン  2004-10-12 22:41:11  No: 116905

これではどうでしょうか?

Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook

oExcel = New Excel.Application
'ApplicationのメンバのWorkbooksのメソッドを使用してブックオープン
oBook = oExcel.Workbooks.Open("D:\Book1.xls")

Excel.Workbooksを使わない方法です。


特攻隊長まるるう  2004-10-12 22:58:35  No: 116906

…なんか回答してくれる人が居るみたいだから、オイラはしばらく
潜りますw。ま、↓は参考になればという事で。

CreateObject も COM コンポーネントのインスタンスを作成する
と書いてありますので、コード的には最初の質問の時点で取り立てて
指摘するほどのミスはないと思います。それに oExcel のインスタンス
の生成に失敗してるなら
>            oBooks = oExcel.Workbooks
でエラーが出そうなもの。Open まで行っているのが確実なら、
原因は別にありそうです。

ところで Open まで行っているのはどうやって確認したんですか?。
インストール先でもデバックできる環境を揃えたのでしょうか?
デバックできるなら、エラーの直前で止めてクイックウォッチや
コマンドウィンドウでどのオブジェクトが生成されてないのか
調べて下さい。
あと、FilePach を決め打ちで、例えば
            oBook = oBooks.Open("c:\Test.xls")
とした場合はどうなりますか?ファイルが存在しない場合は
そういったエラーメッセージが返ってくるはず…。ただ、何かの
操作で FilePach が Nothing になる可能性は…0 では無い
ですので。


ファリンファリン  2004-10-12 23:08:58  No: 116907

特攻隊長まるるうさんの仰るとおり
>CreateObject も COM コンポーネントのインスタンスを作成する
>と書いてありますので、コード的には最初の質問の時点で取り立てて
>指摘するほどのミスはないと思います。
私の発言は信憑性に欠けるので参考になさらないで下さい。
失礼しました。


ゆう  2004-10-12 23:17:16  No: 116908

返信有難うございます。

開発PCとは別にVB.NETをインストールしてあるPCでプロジェクトを表示させたら

Imports Microsoft.Office.Interopが見つかりませんとエラーがでています。

きっとこれが原因だと思うのですがなぜ同じOfficeをつかっていてImports Microsoft.Office.Interopが見つからないとでるのでしょう??


Dental  2004-10-12 23:51:42  No: 116909

>>ゆうさん
> VB.NET2002
> Office2000  Pro
> WindowsXP Pro

できえれば、2002/2003の方が安全なんですけれどね。
PIAs(Office Primary Interop Assemblies)が用意されているので。

Excel 2000だと、interop アセンブリを手動で修正しないと、
イベントの処理に問題が起きたりするので、要注意。(MSKB:316653)

ところで、OfficeのService Release/Service Packは同一ですか?
あと、開いているファイルのパスは正しいですか?

> 「オブジェクト参照がオブジェクト  インスタンスに設定されていません。」というエラーがでてしまいます。

コードを見た限り、exe作成時に、Option Strict Onモードは
指定していないのですよね?

どうせOption Strict Offモードにしているのであれば、参照設定を外し、
「遅延バインディング」にて作成してみてください。
遅延バインディングの場合では、他のPCでエラーになりますか?

もし、遅延バインディングならば動作するのであれば、アセンブリが
実行環境に未登録のままになっているのかも? たとえば、Excelライブラリは
登録してあるけれど、Officeライブラリが登録だとか。

思い付きで書いただけなので、外しているかも知れませんけど。

>>葉月さん
自分の場合は、*.xls ではなく *.xlt として作っておき、
Workbooks.Open() の替わりに、Workbooks.Add() を使ってます。

*.xls を .Open() して .SaveAs() という方法でもできますが、
元ファイルをテンプレートファイルにしておいた方が、
雛形を間違えて上書きしてしまう事故を防げるので。

>>ファリンファリンさん
その記述だと、WorkbooksをReleaseComObject()できないので、
マズイと思います。一度変数に受けてReleaseComObjectしないと、
COM側のメモリを正しく解放できなくなってしまうような。。。
(.NET側のメモリ解放だけなら、GC.Collect()で済みますが)


ゆう  2004-10-13 00:32:57  No: 116910

皆様丁寧なご説明有難うございました。

結局下記のように記述してやることにしました。

私の勉強不足があるので力をつけて後にこの問題に挑戦したいと思います。
        Dim oExcel As Object
        Dim oBook As Object
        Dim oBooks As Object
        Dim oSheet As Object

有難うございました。


葉月  2004-10-13 17:53:20  No: 116911

>Dentalさん
>>>葉月さん
>自分の場合は、*.xls ではなく *.xlt として作っておき、
>Workbooks.Open() の替わりに、Workbooks.Add() を使ってます。(略)

策をありがとうございます
しばらくエクセル開発はないっぽいですが
何かで試して使い勝手を見てみます

>ゆうさん
全オブジェクト宣言ならうまくいったんですか
あまり理想的ではないので、時間ができたらトライしてみてくださいね


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加