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

Excel プロセスが残る(既出?)

1
投稿者投稿内容
mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 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)の記述でも同じ現象が発生するため、各セルへのアクセスを行うと
同様にプロセスが残ってしまうのでは…

どなたか、解決方法等を御存知でしたら御教授願えないでしょうか?
宜しく御願い致します。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-01-15 23:59
LoColumnsって変数を宣言して

LoColumns = LoSheet.Columns
range = LoColumns(exCol)

として

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

って開放しないとダメなのでは?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-16 00:21
知らないプロパティやメソッドを使う時は、その型を調べるべきです。
そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクションで躓かなくなります。

引用:

mtkさんの書き込み (2007-01-15 23:26) より:

LoBooks.Open("hoge.xls")
LoExcel.WindowState = Excel.XlWindowState.xlMinimized
LoBook = LoBooks(1)


なぜ、Open メソッドの戻り値で Workbook のインスタンスを得ようとしないのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 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型なのですが…
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 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 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-16 14:31
引用:

mtkさんの書き込み (2007-01-16 03:07) より:

>知らないプロパティやメソッドを使う時は、その型を調べるべきです。
>そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクション
>で躓かなくなります。
仰るとおりだと思います…


とは言いつつも、理解されていないようです。

引用:

rows(exRow).RowHeight = rows(1).RowHeight ' ※
(snip)
この様な記述を追加したところ、※の行を有効にすると、やはりプロセスが解放され
ません。


同じことを書いておきますね。

> 知らないプロパティやメソッドを使う時は、その型を調べるべきです。
> そうすれば今回のように、デフォルト プロパティ (_Default) のあるコレクションで躓かなくなります。

KI さんの投稿に出ている 'Item' は、私の投稿でいうと '_Default' にあたります。
デフォルト プロパティだから、省略できているだけです。

"型を調べるべき" と書いたのは、デフォルト プロパティかどうか調べられるからです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
mtk
会議室デビュー日: 2006/02/18
投稿数: 11
投稿日時: 2007-01-18 14:52
御世話になります。
KIさん、じゃんぬねっとさん、ありがとう御座います。

KIさん:
細かく書いていただいて、ありがとうございます。
ちゃんとプロセスが開放されるようになりました。

じゃんぬねっとさん:
>とは言いつつも、理解されていないようです。
>デフォルト プロパティだから、省略できているだけです。
>"型を調べるべき" と書いたのは、デフォルト プロパティかどうか調べられるからで
>す。
恥ずかしい限りです。
「デフォルトプロパティ」について認識不足ですね。
勉強します。
ありがとうございました。
1

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