エクセルを×ボタンでうまく終了させるには?

解決


  2006-07-03 20:35:56  No: 132162

前のログです。↓
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060105.txt

いつもお世話になっております。良です。
前のログでエクセルのプレビュー画面は表示できたんですが
×ボタンで終了して窓も全て閉じていますしどこにも
エクセルの痕跡はないのですがプログラムを終了して
パソコンをシャットダウンしようとしたら
「エクセルを終了できません」というエラーが出て
パソコンをシャットダウンできませんでした。
必要なCOMオブジェクトは全て解放したつもりなんですが
やっぱり
        ''Excel を終了する
        'xlApplication.Quit()
をはずしたのがいけないのでしょうか?
以下ソースになります。

Dim xlApplication As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
        '新規のファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)

        'xlApplication から WorkBooks を取得する
        xlBooks = xlApplication.Workbooks

        Dim xlRange As Excel.Range
        Dim strData(3, 0) As Object
        xlRange = xlSheet.Range("A8:A10")    'データの入力セル範囲
        strData(0, 0) = "1000"                 'データの作成
        strData(1, 0) = "20000"
        strData(2, 0) = "205"
        strData(3, 0) = "=Sum(A8:A10)"             '計算式
        xlRange.Value = strData              'セルへデータの入力

        ' Excel を表示する
        xlApplication.Visible = True

        ' COM オブジェクトを解放する (正しくは COM オブジェクトを解放する を参照)
        ComObjectRelease(xlSheet)            'xlSheet の解放
        ComObjectRelease(xlSheets)
        ComObjectRelease(xlBook)
        ComObjectRelease(xlBooks)

   Private Sub ComObjectRelease(ByRef objCom As Object)
        明示的に COM オブジェクトへの参照を解放
        Try
                 If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
                                                      Marshal.IsComObject(objCom) Then
                Dim I As Integer
                Do
                    I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
                Loop Until I <= 0
            End If
        Catch
        Finally
            '参照を解除する
            objCom = Nothing
        End Try
    End Sub


魔界の仮面弁士  2006-07-03 20:52:59  No: 132163

> Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
ここで、Workbooks のインスタンスを取得してあるのに、

> 'xlApplication から WorkBooks を取得する
> xlBooks = xlApplication.Workbooks
何故、ここで再取得しているのでしょう? (ここに問題があるのかな?)

あと、安全策をとるならば、オブジェクトの生成から解放までを
Try〜Finally に含めておいた方が良いと思います。


  2006-07-03 21:14:17  No: 132164

こんにちは良です。

>魔界の仮面弁士さん

早速お返事ありがとうございます!
とりあえず試してみます。またお返事書きます。


特攻隊長まるるう  2006-07-03 22:47:29  No: 132165

追加で、今までデバッグ中にエラーで落ちた…とかで残ってたプロセスが
ずーっと残ってて悪さをする場合もあります。
http://www.bcap.co.jp/hanafusa/dotnet/Excel01.htm
>'テスト中は、下記コードを 上記 Excel 終了後に実施するようにして下さい。
や、タスクマネージャで EXCEL.EXE のプロセスが全て終了している状態から
テストを開始してください。一度ログオフしても消えると思います。

Try〜Finally の参考にどうぞ。
[じゃんぬねっと  COM オブジェクトを解放する]
http://jeanne.wankuma.com/tips/programing/releasecom.html


  2006-07-04 00:20:52  No: 132166

こんにちは良です。

>特攻隊長まるるうさん

またまたお返事ありがとうございます!

>http://www.bcap.co.jp/hanafusa/dotnet/Excel01.htm
>'テスト中は、下記コードを 上記 Excel 終了後に実施するようにして下さ>>い。
>や、タスクマネージャで EXCEL.EXE のプロセスが全て終了している状態か>>ら
>テストを開始してください。一度ログオフしても消えると思います。

は一度ためしてみたんですが間違ってオブジェクト開放する前に
このプログラムをコピペしてしまい、見事に全部オブジェクトが残っていました(^_^;)
今度は使う位置を間違えないようにします!

本当にありがとうございましたm(__)m


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




  


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