- - PR -
Excel プロセスが残る(既出?)
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-15 23:26
御世話になります。
既出かもしれませんが、自分なりに調べても答えが見つからないので、 質問させて下さい。 XP+VS2005(VB2005) から Excel を操作するプログラムを書いています。 この現象を調べて行く内に、次の記述、 ------------------------------------------------------------ Dim LoExcel As Excel.Application Dim LoBooks As Excel.Workbooks Dim LoBook As Excel.Workbook Dim LoSheet As Excel.Worksheet Dim range As Excel.Range = Nothing Dim exCol As Integer = 1 : <略> : LoBooks = LoExcel.Workbooks LoBooks.Open("hoge.xls") LoExcel.WindowState = Excel.XlWindowState.xlMinimized LoBook = LoBooks(1) LoSheets = LoBook.Sheets LoSheet = LoSheets(1) : <略> : For i As Integer = 1 To 8 exCol = exCol + 1 range = LoSheet.Columns(exCol) '(1) 'range = LoSheet.Cells(1, exCol) '(1a) range.ColumnWidth = 0 '(2) System.Runtime.InteropServices.Marshal.ReleaseComObject(range) ' (3) range = Nothing Next : <略> : LoSheet.PrintOut() System.Runtime.InteropServices.Marshal.ReleaseComObject(LoSheet) LoSheet = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(LoSheets) LoSheets = Nothing LoBook.Close(False) System.Runtime.InteropServices.Marshal.ReleaseComObject(LoBook) LoBook = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(LoBooks) LoBooks = Nothing LoExcel.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(LoExcel) LoExcel = Nothing ------------------------------------------------------------ の(1)から(3)、厳密には(1)の記述を行うと、プロセスが残るようです。 また、(1)の代わりに(1a)を有効にしても同じでした。 (1)から(3)をコメントアウトするとプロセスは消えます。 この箇所に関して言うと、やりたいことはセル幅を0にしたいだけですが、 (1a)の記述でも同じ現象が発生するため、各セルへのアクセスを行うと 同様にプロセスが残ってしまうのでは… どなたか、解決方法等を御存知でしたら御教授願えないでしょうか? 宜しく御願い致します。 | ||||||||
|
投稿日時: 2007-01-15 23:59
LoColumnsって変数を宣言して
LoColumns = LoSheet.Columns range = LoColumns(exCol) として System.Runtime.InteropServices.Marshal.ReleaseComObject(LoColumns) って開放しないとダメなのでは? | ||||||||
|
投稿日時: 2007-01-16 00:21
知らないプロパティやメソッドを使う時は、その型を調べるべきです。
そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクションで躓かなくなります。
なぜ、Open メソッドの戻り値で Workbook のインスタンスを得ようとしないのでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-01-16 03:07
burton999さん、じゃんぬねっとさん、ありがとうございます。
じゃんぬねっとさん: >知らないプロパティやメソッドを使う時は、その型を調べるべきです。 >そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクション >で躓かなくなります。 仰るとおりだと思います… burton999さん: 頂いた情報を元に変えてみた所、プロセスが開放されるようになりました。 …が、 ------------------------------------------------------------ rows = LoSheet.Rows rows(exRow).RowHeight = rows(1).RowHeight ' ※ System.Runtime.InteropServices.Marshal.ReleaseComObject(rows) rows = Nothing ------------------------------------------------------------ この様な記述を追加したところ、※の行を有効にすると、やはりプロセスが解放され ません。 やりたいことは指定した行の高さを1行目の行の高さと同じにしたいのです。 rows は Excel.Range で宣言してあります。 そして、ヘルプによれば Range.RowHeight は Object型なのですが… | ||||||||
|
投稿日時: 2007-01-16 08:00
rows(1).RowHeight
これはデフォルトプロパティを使っていますので、 rows.Item(1).RowHeight とも書けますよね? COMオブジェクトを扱うときはドットが2つ続く記述は基本的にNGです。 この場合rows(1)というExcel.Rangeオブジェクトの解放がされていません。 rows(1)を変数に入れて解放するようにしてみてください。 rowsとrows(1)の両方の解放が必要という意味です。 左辺の rows(exRow).RowHeight についても同様です。 [ メッセージ編集済み 編集者: KI 編集日時 2007-01-16 08:14 ] | ||||||||
|
投稿日時: 2007-01-16 14:31
とは言いつつも、理解されていないようです。
同じことを書いておきますね。 > 知らないプロパティやメソッドを使う時は、その型を調べるべきです。 > そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクションで躓かなくなります。 KI さんの投稿に出ている 'Item' は、私の投稿でいうと '_Default' にあたります。 デフォルト プロパティだから、省略できているだけです。 "型を調べるべき" と書いたのは、デフォルト プロパティかどうか調べられるからです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-01-18 14:52
御世話になります。
KIさん、じゃんぬねっとさん、ありがとう御座います。 KIさん: 細かく書いていただいて、ありがとうございます。 ちゃんとプロセスが開放されるようになりました。 じゃんぬねっとさん: >とは言いつつも、理解されていないようです。 >デフォルト プロパティだから、省略できているだけです。 >"型を調べるべき" と書いたのは、デフォルト プロパティかどうか調べられるからで >す。 恥ずかしい限りです。 「デフォルトプロパティ」について認識不足ですね。 勉強します。 ありがとうございました。 |
1