TimberLandChapel's Tech Blog

TimberLandChapel provide Tips, tech note and scribbling.
Updated my site as English site for APAC users.
TLC.com .Metrix 4.0 Beta1 released

サイトの日本語化方法はこちら

Syndication

News

INETAJ

情報処理関係官公庁

SQL Server

TLC.com

Microsoft

クリエイティブ・コモンズ

http://www3.clustrmaps.com/
【VB.NET】VB.NET から Excel の COM オブジェクトを操作する場合の注意点
シナリオと要件

VB.NET から Excel の COM オブジェクトを操作する際に COM オブジェクトを適切に解放しないと,Excel のプロセスが正しく終了しない。

Excel のプロセスが正しく終了するための Excel COM オブジェクトの取り扱い方法を解説する。

Excel が正しく終了するサンプル

まずは次のサンプルコードを Windows Form のボタンクリックイベントに記述して実行してみましょう。

※ Excel COM オブジェクトをコントロールするためには,Microsoft Excel 11.0 Object Library の参照設定が必要です(Excel 2003 の場合)。

Excel が正しく終了するサンプル
Dim myExcel As New Microsoft.Office.Interop.Excel.Application
Dim books As Microsoft.Office.Interop.Excel.Workbooks
Dim book As Microsoft.Office.Interop.Excel.Workbook
 
Try
    books = myExcel.Workbooks
    book = books.Add
 
    book.Close()
    myExcel.Quit()
Finally
    ' COM オブジェクトの解放
    System.Runtime.InteropServices.Marshal.ReleaseComObject(book)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(books)
    ' 次の行を実行すると Excel のプロセスが終了するはず
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel)
End Try

このソースコードでは,Excel のプロセスを起動して,新規ブックを作成しています。その後ブックを閉じて,Excel を終了しています。

このソースコードをステップ実行しながら,[タスクマネージャ] の [プロセス] タブを確認してください。

[myExcel] のインスタンスが作成された時点で Excel のプロセスが [プロセス] にエントリされます。

その後,「myExcel.Quit」メソッドを実行しても,Excel のプロセスは終了されません。

Excel のプロセスが終了されるのは,次の行で[myExcel] のインスタンスが解放された時点です。

Excel の Application インスタンスを保持している変数が正しく解放されると,Excel のプロセスが終了されます。

Excel が正しく終了しないサンプル

今度は,次のソースコードを実行して,Excel のプロセスを監視します。

Excel が正しく終了しないサンプル
Dim myExcel As New Microsoft.Office.Interop.Excel.Application
Dim book As Microsoft.Office.Interop.Excel.Workbook
 
Try
    book = myExcel.Workbooks.Add
 
    book.Close()
    myExcel.Quit()
Finally
    ' COM オブジェクトの解放
    System.Runtime.InteropServices.Marshal.ReleaseComObject(book)
    ' 次の行を実行すると Excel のプロセスが終了するはず
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel)
End Try

このソースコードでは,赤字で示した部分が前のソースコードと異なります。機能的にはまったく同じことを実装していますが,「myExcel.Workbooks.Add」という風にプロパティを直接使用してコードを記述しています。

このソースコードでは,Excel のプロセスは正しく終了されません

前のソースコードとは異なり,[myExcel] のインスタンスを解放しても,Excel のプロセスが残ったままになってしまいます。このソースコードを何度も実行すると Excel のプロセスが次々に増えていきます。

この残ってしまった Excel のプロセスが解放されるのは,Excel を呼び出したプログラムが終了する時点か,ガベージコレクタがオブジェクトを整理する時点のどちらかです。

Excel COM オブジェクトを正しく解放するためのコツ

Excel COM オブジェクトを使用する際には,以下のことに注意しなければいけません。

使用した COM オブジェクトは必ず解放しなければいけない。
COM オブジェクトの解放は,「System.Runtime.InteropServices.Marshal.ReleaseComObject」を使用します。
COM オブジェクトの解放
System.Runtime.InteropServices.Marshal.ReleaseComObject( [COM オブジェクト] )
ループ内で使用する,変数を共有するオブジェクトは都度解放する。
[ReleaseComObject] は,インスタンス化したオブジェクトの数だけ行わなければいけません。
ループ内で [Worksheet] オブジェクトを複数回使用する場合は,変数に格納した数だけ解放する必要があります。
COM オブジェクトの解放
For counter As Int32 = 0 To 10
    myWorksheet = myWorkbooks.Item(counter)
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorksheet)
Next
「.(ドット)」を使用して,プロパティやメソッドを経由して呼び出してはいけない。
[Application] クラスの [Workbooks] プロパティなどがこれにあたります。
これらのプロパティは適切な変数に経由して,経由したオブジェクトも [ReleaseComObject] を呼び出さなければいけません。
このルールは見落としがちです。
プロパティ,メソッドの経由呼び出しの回避
Dim myExcel As New Microsoft.Office.Interop.Excel.Application
Dim books As Microsoft.Office.Interop.Excel.Workbooks
 
books = myExcel.Workbooks
book = books.Add
Cells プロパティではなく,Range プロパティを使用する。
セルの値を書き換える場合などに,[Worksheet] クラスの [Cells] プロパティを使用して,行と列を指定した(R1C1形式)セルを取得することができます。
この [Cells] プロパティは [Range] クラスに DirectCast することによって値の操作が可能になります。
しかし,[Cells] プロパティから [Range] への変換を使用していると,Excel プロセスが正しく解放されません。
セルの名称(A1形式)を指定する [Range] プロパティを使用します。
[Range] プロパティの使用
Dim targetRange As Range
 
' Cells では解放されない
targetRange = DirectCast(myWorksheet.Cells(3, 1), Range)
 
' Range は正しく動作する
targetRange = myWorksheet.Range("A3")

written by TimberLandChapel

Published 2007年1月12日 9:12 by timberlandchapel
Filed under:

Comments

# 【VB.NET】VB.NET から Excel の COM オブジェクトを操作する場合の注意点@ 2007年1月12日 9:30

今や VSTO が主流かと思いますが,
単純に Excel からデータを入出力して保存などとなると,COM を制御というのも行われることがあると思います。
COM オブジェクトの解放周りの注意点をまとめました。...

# re: 【VB.NET】VB.NET から Excel の COM オブジェクトを操作する場合の注意点@ 2011年5月29日 12:56

This is well known that cash makes people independent. But what to do when someone has no money? The only one way is to try to get the <a href="http://bestfinance-blog.com">loans</a> or sba loan.