tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelオープン、クローズ
記事No8877
投稿日: 2009/04/24(Fri) 09:13
投稿者ると
こんにちは。
下記の用に設定してVB.NETからExcelをオープン、クローズさせています。
1回目にオープンさせる時はエラーなく上手くいくのですが
2回目にオープンさせるときに

xlBook = xlBooks.Open(xlFilePathO) 
↑この箇所で
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
とエラーになります。
Publicで宣言してあるので再度宣言しなくても大丈夫だと思うのですが・・・。
タスクで見てみてもExcel自体は立ち上がってるようです。
何が問題なのでしょうか?

Public xlApp As New Excel.Application
Public xlBooks As Excel.Workbooks = xlApp.Workbooks
Public xlBook As Excel.Workbook = Nothing
Public xlSheets As Excel.Sheets = Nothing
Public xlSheet As Excel.Worksheet = Nothing

Public Function ExcelOpen()

    xlFilePathO = "TEST1.xls"

    xlBook = xlBooks.Open(xlFilePathO)
    xlSheets = xlBook.Worksheets

    '// Excelの表示
    xlApp.Visible = True

End Function

Public Sub ExcelClose()

    '==================  終了処理  =====================  
    MRComObject(xlSheet)            'xlSheet の解放
    MRComObject(xlSheets)           'xlSheets の解放
    xlBook.Close(False)             'xlBook を閉じる
    MRComObject(xlBook)             'xlBook の解放
    MRComObject(xlBooks)            'xlBooks の解放
    xlApp.Quit()                    'Excelを閉じる
    MRComObject(xlApp)              'xlApp を解放

End Sub

[ツリー表示へ]
タイトルRe: Excelオープン、クローズ
記事No8878
投稿日: 2009/04/24(Fri) 12:48
投稿者魔界の仮面弁士
> Public xlApp As New Excel.Application

この変数は、初期値として New された状態になりますが、
Quit で終了した後はどうされるのでしょうか?

新たな Excel を起動するためにもう一度 New を行うか、あるいは、
起動済みの Excel を取得するための GetObject 等を呼び出すなどの
作業が必要なはずですが、提示されたコードには、そうした記述は無いようですし。

[ツリー表示へ]
タイトルRe^2: Excelオープン、クローズ
記事No8879
投稿日: 2009/04/24(Fri) 14:18
投稿者ると
こちらのサイトの
「.NETからExcelの基本的な操作方法」の
Excel起動を元にしています。

1つ目の処理が終った後に

        MRComObject(xlSheet)            'xlSheet の解放
        MRComObject(xlSheets)           'xlSheets の解放
        xlBook.Close(True)             'xlBook を閉じる
        MRComObject(xlBook)             'xlBook の解放
        MRComObject(xlBooks)            'xlBooks の解放
        xlApp.Quit()                    'Excelを閉じる
        MRComObject(xlApp)              'xlApp を解放

で閉じているだけです。
他の処理は何もしてません・・・。

[ツリー表示へ]
タイトルRe^3: Excelオープン、クローズ
記事No8880
投稿日: 2009/04/24(Fri) 15:04
投稿者魔界の仮面弁士
特に追加質問が無いという事は、先に指摘した点は
理解していただけたと思って良いのでしょうか。

要は、変数の初期化の時点で、オブジェクトの生成を行ってありますが、
2回目の起動前には、そのオブジェクトの生成を行っていないために、
複数回の処理ができないのではないでしょうか、という話ですね。


> で閉じているだけです。
> 他の処理は何もしてません・・・。
閉じる事が問題なのではなく、呼び出し時の問題です。

Public xlApp As New Excel.Application
Public xlBooks As Excel.Workbooks = xlApp.Workbooks

のように、変数宣言と同時に初期化を行うと、最初の1回目は良いですが、
2 回目以降は、初期化されません。そこで、起動のたびに処理されるよう、
まずはこの宣言部分を
 Public xlApp As Excel.Application
 Public xlBooks As Excel.Workbooks
に修正したうえで、Function ExcelOpen() As Object の中で、最初に
  xlApp = New Excel.Application()
  xlBooks = xlApp.Workbooks
を記述しておく必要がありますよ、というのが、先の
>> 新たな Excel を起動するためにもう一度 New を行うか
という一文が指し示す意味となります。

[ツリー表示へ]
タイトルRe^4: Excelオープン、クローズ
記事No8881
投稿日: 2009/04/24(Fri) 15:52
投稿者ると
説明よくわかりました。

もう少し教えて下さい。

@Excel起動

A処理(Excelに書込み)

BExcel閉じる

この@〜Bの処理を複数回行っています。
魔界の仮面弁士 さんの記述通りに修正しました。

>Public xlApp As Excel.Application
>Public xlBooks As Excel.Workbooks

>xlApp = New Excel.Application()
>xlBooks = xlApp.Workbooks

タスクで確認すると3回処理を行うたびにExcelが立ち上がっています。
閉じる処理が上手くいってないのでしょうか?
閉じる処理は先ほど記述したものと変更していません・・・。

[ツリー表示へ]
タイトルRe^5: Excelオープン、クローズ
記事No8882
投稿日: 2009/04/24(Fri) 16:14
投稿者花ちゃん
下記は、参考になりませんか?
http://www.hanatyan.sakura.ne.jp/dotnet/Excel07.htm#no7

[ツリー表示へ]
タイトルRe^6: Excelオープン、クローズ
記事No8883
投稿日: 2009/04/24(Fri) 17:16
投稿者ると
参考にしたんですけど・・・
タスクで見ると複数立ち上がったままです。

全ての処理が終ると全部消えるのですが・・・。
原因がわかりませんでした。

[ツリー表示へ]