none
vb.netで起動した、EXCELのプロセスが残る。 RRS feed

  • 質問

  • お世話になります。

    以下のように、vb.netからEXCELを起動して、EXCELを閉じても、プロセスが残ります。

     

            Dim xlApp As New Excel.Application
            Dim books As Excel.Workbooks
            Dim xlBook As Excel.Workbook
            Dim xlSheet As Excel.Worksheet

     


                books = xlApp.Workbooks

                xlBook = books.Open(target)


                xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)


                xlApp.Range("A1").Value = "AAA"

                'ワークシート保存
                xlApp.ActiveWorkbook.Save()
                xlApp.Range("A1").Select()
                '最大化
                xlApp.Application.WindowState = Excel.XlWindowState.xlMaximized

                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
                System.Runtime.InteropServices.Marshal.ReleaseComObject(books)
                ' 次の行を実行すると Excel のプロセスが終了するはず
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

     

    Rangeの記述がまずいのか

    xlApp.Range("A1").Value = "AAA"

    の一行を無くすと、EXCELを閉じると、プロセスが消えます。

    Rangeの扱いにコツがいるのでしょうか?

    宜しくお願い致します。

    2011年3月17日 7:01

回答

  • xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)

    xlApp.Range("A1").Value = "AAA"

    xlSheets = xlBook.Worksheets

    xlSheet = CType(xlSheets(1), Excel.Worksheet)

    Dim range As Excel.Range = xlApp.Range("A1")

    range.Value = "AAA"

    System.Runtime.InteropServices.Marshal.ReleaseComObject(range)

    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)

     

    Range オブジェクトもちゃんと解放しましょう。

    • 回答としてマーク 山本春海 2011年4月6日 1:13
    2011年3月17日 13:27
  • RangeもReleaseComObjectする必要があります。

    (参考)
    COM オブジェクトの参照カウントを解放する
    http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年4月6日 1:13
    2011年3月17日 13:34
    モデレータ

すべての返信

  • xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)

    xlApp.Range("A1").Value = "AAA"

    xlSheets = xlBook.Worksheets

    xlSheet = CType(xlSheets(1), Excel.Worksheet)

    Dim range As Excel.Range = xlApp.Range("A1")

    range.Value = "AAA"

    System.Runtime.InteropServices.Marshal.ReleaseComObject(range)

    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)

     

    Range オブジェクトもちゃんと解放しましょう。

    • 回答としてマーク 山本春海 2011年4月6日 1:13
    2011年3月17日 13:27
  • RangeもReleaseComObjectする必要があります。

    (参考)
    COM オブジェクトの参照カウントを解放する
    http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク 山本春海 2011年4月6日 1:13
    2011年3月17日 13:34
    モデレータ
  • こんにちは、TAKAPI さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    その後いかがでしょうか。
    みなさんからのアドバイスはご確認いただけましたか?

    参考になるアドバイスをいただいているようでしたので、勝手ながら一旦私のほうで回答としてマークさせていただきました。
    glaco さんや、trapemiya さん、情報ありがとうございます。

    いただいた情報の中で、解決に役立った投稿や、参考になる情報などの有効な情報には回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報を活用いただけると思いますので、ご協力よろしくお願いいたしますね。

    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                                                                                                     
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海


    2011年4月6日 1:13