@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Excel起動時、ブックがCloseしてしまう

投稿者投稿内容
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-10-31 11:33
マクロつきのExcelブックをOpenさせたいのですが、起動後ブックが閉じてしまうことがあり、困っています。
処理は
-------------------------------------------
Protected xlApp As Excel.Application
Protected xlBook As Excel.Workbook
Protected xlSheet As Excel.Worksheet

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
xlApp.DisplayAlerts = True
xlApp.Visible = True
xlBook = xlApp.Workbooks.Open("C:\Test.xls")
xlApp.Run("Auto_Open")
xlSheet = xlBook.Worksheets(1)
xlSheet.Application.Visible = True
Catch ex As Exception
'例外をキャッチしたら開いたBookを閉じてExcelを終了させる
xlBook.Close()
xlApp.Quit()
Finally
' COM オブジェクトを解放して、参照を解放
If Not (xlApp Is Nothing) Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
End If
If Not (xlBook Is Nothing) Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
xlBook = Nothing
End If
If Not (xlSheet Is Nothing) Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
xlSheet = Nothing
End If
End Try
End Sub
-------------------------------------------
という感じで、Excelを起動してブックを開き、マクロAuto_OpenをRunさせているだけなのですが、うまくいくときといかないときがあります。
うまくいくときは起動してブックも開いてマクロが動いてくれているのですが、何回かに1回の割合でマクロ起動後のブックがそのまま閉じてしまい、何もブックを開いていないExcelアプリケーションだけが画面に残ります。
(Catchの中でCloseしてはいますが、問題の現象のときはそこに飛んでいるわけではないようです)

こんな現象に出会った方、いらっしゃいますか?
それとも、そもそもこの呼び方が悪いのでしょうか?(うまくいっているほうがたまたま?)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-31 11:59
私も試してみましたが、何度やっても正しく処理されました。

私の環境 :
 Windows XP Professional SP2
 Microsoft Office Professional Edition 2003
 Microsoft Excel 11.0 Object Library (1.5)

コード:

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim xlApp As Excel.Application

        Try
            xlApp = New Excel.Application()
            xlApp.DisplayAlerts = False
            xlApp.Visible = True

            Dim xlBooks As Excel.Workbooks = xlApp.Workbooks

            Try
                Dim xlBook As Excel.Workbook = xlBooks.Open("C:\マクロ付き稼動報告書.xls")

                Try
                    xlApp.Run("Sheet_02.Auto_Open")
                Finally
                    If Not xlBook Is Nothing Then
                        Try
                            xlBook.Close()
                        Finally
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                        End Try
                    End If
                End Try
            Finally
                If Not xlBooks Is Nothing Then
                    Try
                        xlBooks.Close()
                    Finally
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
                    End Try
                End If
            End Try
        Finally
            If Not xlApp Is Nothing Then
                Try
                    xlApp.Quit()
                Finally
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
                End Try
            End If
        End Try
    End Sub


2 回目以降、うまくいかないのであればプロセスが残っていませんか?
タスク マネージャのプロセス タブで「EXCEL.EXE」が残っていないか確かめてみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-31 12:53
引用:

(Catchの中でCloseしてはいますが、問題の現象のときはそこに飛んでいるわけではないようです)



具体的にはどの行で妙な動きをしていますか?
ステップ実行して確認してください。

引用:

それとも、そもそもこの呼び方が悪いのでしょうか?(うまくいっているほうがたまたま?)



ぱっと見で、いくつかのオブジェクトがリークしています。
それが原因で Excel のプロセスが居残ってたりはしませんか?
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-10-31 13:09
じゃんぬねっとさん、渋木宏明(ひどり)さん、こんにちは。
お返事どうもありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2005-10-31 11:59) より:
2 回目以降、うまくいかないのであればプロセスが残っていませんか?
タスク マネージャのプロセス タブで「EXCEL.EXE」が残っていないか確かめてみてください。



何度か実験してみたのですが、どうもEXEを起動して1度目だけがうまくいかないようです。
Excelは表示させっぱなしにしておくので、先の私のコードでボタンをクリックするたび
Excelが起動してブックを操作→手動でExcelを閉じる を繰り返してみたところ、1度目だけブックが閉じてしまいました。

また、ステップ実行してみたところ、 Catch直前の
xlSheet.Application.Visible = True
でブックが消えます。

ブックを単体で(直接Excelで)開いてマクロを有効にしても、このような現象にはならないので、マクロのせいではないように思えるのですが…
マクロを疑ったほうが良いでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-31 13:16
引用:

さくらさんの書き込み (2005-10-31 13:09) より:

マクロを疑ったほうが良いでしょうか?


いえ、マクロはたぶん関係ありません。
まずは、コードを疑ってみましょう。

また、以下の私の質問の返答がなされていません。
重要な質問ですので、どうか検証してください。

引用:

2 回目以降、うまくいかないのであればプロセスが残っていませんか?
タスク マネージャのプロセス タブで「EXCEL.EXE」が残っていないか確かめてみてください。


実行した後、タスクマネージャのプロセスタブを確認してください。

Sheet オブジェクトって必要ですか?
また、xlSheet.Application.Visible = True はおかしくないでしょうか?
その前に xlApp.Visible = True となっていますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-10-31 14:08
引用:

じゃんぬねっとさんの書き込み (2005-10-31 13:16) より:
また、以下の私の質問の返答がなされていません。
重要な質問ですので、どうか検証してください。

引用:

2 回目以降、うまくいかないのであればプロセスが残っていませんか?
タスク マネージャのプロセス タブで「EXCEL.EXE」が残っていないか確かめてみてください。


実行した後、タスクマネージャのプロセスタブを確認してください。



すみません、プロセスは残っています。(Quitしていないので)

引用:

Sheet オブジェクトって必要ですか?
また、xlSheet.Application.Visible = True はおかしくないでしょうか?
その前に xlApp.Visible = True となっていますが...



そうですね。xlSheet.Application.Visible = Trueは不要でした。
実際にはExcel起動後、最初は画面に表示させないようにしてシートにDBから集計したデータを書き込み、最後にマクロを走らせてから表示させるというものなのですが、ソースを弄繰り回しているうちに中途半端にSheetの扱いを消しそこなってしまったものです。
失礼いたしました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-31 14:16
引用:

さくらさんの書き込み (2005-10-31 14:08) より:

すみません、プロセスは残っています。(Quitしていないので)


1 度目は正常に動作すれば xlApp.Quit されるのではないですか?
1 度目は正常に動くんですよね?

とりあえず、私が提示したソースコードでやってみて頂けないでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さくら
常連さん
会議室デビュー日: 2005/09/12
投稿数: 31
投稿日時: 2005-10-31 14:29
引用:

じゃんぬねっとさんの書き込み (2005-10-31 14:16) より:
1 度目は正常に動作すれば xlApp.Quit されるのではないですか?
1 度目は正常に動くんですよね?

とりあえず、私が提示したソースコードでやってみて頂けないでしょうか?


すみません、動かないのが1度目だけなのです。
2度目以降は動きます。プログラムからはExcelを終了させないので(つまりボタンを押したらExcel起動+マクロ起動してそのままシートを開きっぱなし)、ボタンを押してExcel起動→手動でExcel閉じる を繰り返したものです。

じゃんぬねっとさんのコードですと、マクロが実行されてブックのClose、ExcelのQuitとも正常に行われることを確認しました。
が、閉じてしまっては困るので、マクロを有効にした状態で開きっぱなしにしておきたいのですが…

スキルアップ/キャリアアップ(JOB@IT)