- PR -

シートのコピーでExcelのプロセスが残る

1
投稿者投稿内容
うっど
会議室デビュー日: 2004/08/10
投稿数: 11
投稿日時: 2006-07-20 15:54
ExcelのシートのコピーをVB.NETから行うとExcelのプロセスが残ってしまいます。
参照の開放はやっているつもりなのですが、なにか抜けがあるのでしょうか?

以下がコードになります
※量を減らすためエラー処理などは省いてあります

Dim excel As Object = CreateObject("excel.application")
Dim workbooks As Object = excel.Workbooks
Dim book As Object = workbooks.add
Dim sheets As Object = book.sheets
Dim sourceSheet As Object = sheets.item(1)

'ここをコメントにするとプロセスは残らない
sourceSheet.copy(, sourceSheet)

System.Runtime.InteropServices.Marshal.ReleaseComObject(sourceSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets)
book.saved = True
book.close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(book)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks)
excel.quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel)

環境は
Windows2000Pro SP4
Microsoft Visual Basic .NET 69516-270-0000007-18937
Excel2000 SP3

ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-07-20 16:59
じゃんぬさーん、出番ですよーw

以下が参考になりませんか?
  sheetのコピー
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 17:11
引用:

ひろれいさんの書き込み (2006-07-20 16:59) より:

じゃんぬさーん、出番ですよーw


皆さまにお任せします。(;^-^)
いいかげん、私自身がくどくてしょうがないんですよ。(おそらく、ひどりさんも)

それはともかく、特別理由がない限りは 「遅延バインディング」 はやめましょう。> うっどさん

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うっど
会議室デビュー日: 2004/08/10
投稿数: 11
投稿日時: 2006-07-20 17:20
こんにちは。

「遅延バインディング」をやめたいのは山々なのですが、
ユーザの環境が2000,Xp混在なのでやむなく・・・
※Excel2000の参照設定をしていた別システムがOfficeXP環境で
 動かない事例がありました。


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 17:42
引用:

うっどさんの書き込み (2006-07-20 17:20) より:

「遅延バインディング」をやめたいのは山々なのですが、ユーザの環境が2000,Xp混在なのでやむなく・・・
※Excel2000の参照設定をしていた別システムがOfficeXP環境で動かない事例がありました。


うーん... まあ、とりあえず、本題の方だけお答えします。

引用:

Dim sourceSheet As Object = sheets.item(1)


この部分を、

コード:

    Dim sourceSheet As Excel.Worksheet = sheets.item(1)


このように変更するだけで、解決するのですが、それはおいといて。

引用:

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


この部分を、

コード:

    Dim iRemainCount As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(sourceSheet)
    MessageBox.Show("参照カウントの残り == " & iRemainCount.ToString())


このように変更して実行してみてください。
さて、参照カウントの残りは...?

# ごめんなさい、検証していません。(予想がはずれたら恥ずかしいw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うっど
会議室デビュー日: 2004/08/10
投稿数: 11
投稿日時: 2006-07-27 09:39
返答が遅れてごめんなさい。

参照カウントの残りは1でした。
sourceSheetの開放を二度行うことでプロセスは残らないようになりました・・・
が、納得できません。
sourceSheet.copy(, sourceSheet) で参照カウントが何故2になるのか。

理由を知っておかないと以後同じような間違いを起こす可能性があるので、
できれば何故こうなるのか解説をお願いしたいのですが・・・・



じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-27 10:14
引用:

うっどさんの書き込み (2006-07-27 09:39) より:

sourceSheet.copy(, sourceSheet) で参照カウントが何故2になるのか。
理由を知っておかないと以後同じような間違いを起こす可能性があるので、
できれば何故こうなるのか解説をお願いしたいのですが・・・・


2 つを並べて、"相違している点" に着目してみてはいかがでしょうか?
  • 型を明示化した場合、参照カウントは 1 になる。
  • 型を明示化しない場合、参照カウントは 2 になる。
ReleaseComObject メソッドの戻り値が 1 ということは、
型を明示化しない場合は、参照カウントが 2 になっているということになります。

型を明示化しない場合、"どんな処理が余分に入るのか" を考えれば、
"どこで"、参照カウントが増えているのか、自ずと見えてくるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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