- PR -

VB.NETでエクセルエグゼが残ってしまいます。

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

エドさんの書き込み (2006-12-21 10:44) より:

columnsとcolumnを上の宣言部でDimで定義してから
Dim xlcolumns as object
Dim xlcolumn as object
各定義されたものを
MRComObject(xlcolumns)
MRComObject(xlcolumn)
と放り込んで開放してあげればよいと言う事でしょうか。


(前から指摘しているように MRComObject メソッド自体が、良くない実装なのですが)
そういうことです。
これは、試してみれば、わかることだと思います。

引用:

参照の取り忘れについて少し分からないのですが、


参照の取り忘れがあれば、ReleaseComObject メソッドで参照カウントをデクリメントできません。
上記で 'エドさん自身が書かれたコト' ができなくなりますよね。

引用:

とはどういう事でしょうか?
Dim xlSheets As Object = xlBook.Worksheets
と宣言して、
xlSheets の処理を行い、
MRComObject(xlSheets)
だけでは足りないと言う事でしょうか?


そのとおりです。

xlSheets は Excel.Sheets 型のコレクションなのはお分かりでしょうか? (複数形であることに注意)
xlSheets("Sheet1") は Excel.Worksheet (複数形でないことに注意) を返します。

この Excel.Worksheet を参照に取らずして、

引用:

xlSheets("Sheet1").columns("A:AQ").AutoFit()


などとしたら、この Excel.Worksheet の参照カウントはどこで解放できますか?
変数に参照を取っていなければ、不可能ですよね。(これが、参照の取り忘れです)

引用:

SheetもBookと同じ様にCloseしてあげなきゃいけないのでしょうか??


必要ありません。
Close | Quit する必要があるのは、Excel.Workbook と Excel.Application です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 11:07
このように、すべての COM ラッパ オブジェクトの参照は必ず取っておく必要があります。
これは、CLR から COM を扱うにおいて、基本中の基本なので、

引用:

色々なサイトで上記の件名を検索して調べたのですが、


どこを調べても、たいてい書いてあると思います。ご覧になっていないのではないかと推測し、紹介しておきます。

このように、CLR と COM との相性は最悪と言って良いほどです。
どう考えても面倒な上に精神衛生上よろしくありません。

よって、COM を利用したい場合は、VB6、Excel VBA マクロ、VBScript あたりを利用して、
それを、CLR 言語側から呼び出すのが、まだ賢明ではないかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2006-12-21 11:45
!!
っと言う事は"A"列から"AQ"列までの自動幅を行うには
xlSheets("Sheet1").columns("A:AQ").AutoFit()
ではなくて正確には
xlSheet("Sheet1").columns("A:AQ").AutoFit()
としなくてはならいという事でしょうか?!

単数系のものを操作するのに複数系のオブジェクトを使用していた為、
開放の際に不十分になってしまった。とそんな感じでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 12:10
引用:

エドさんの書き込み (2006-12-21 11:45) より:

っと言う事は"A"列から"AQ"列までの自動幅を行うには
xlSheets("Sheet1").columns("A:AQ").AutoFit()
ではなくて正確には
xlSheet("Sheet1").columns("A:AQ").AutoFit()
としなくてはならいという事でしょうか?!


それだけだと、まだ不正解です。

xlSheets だけに限った話ではないでしょう。
2 つ前の私の投稿を読み直しましょう。

# 最初の方でも、"合計 3 つの参照の取り忘れがあります" と私は書いています。

引用:

単数系のものを操作するのに複数系のオブジェクトを使用していた為、
開放の際に不十分になってしまった。とそんな感じでしょうか?


何もしていないのですから "不十分" という言葉は不適切で、'完全に漏れている' が正解です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
エド
常連さん
会議室デビュー日: 2006/12/07
投稿数: 43
投稿日時: 2006-12-21 13:10
!!!
複数形、「合計 3 つの参照の取り忘れがあります」っと言う事は

xlSheets("Sheet1").columns("A:AQ").AutoFit()

xlSheet("Sheet1").column("A:AQ").AutoFit()
とシートとカラムとそれぞれに関して単数形で行うと言う事ですね?!

そして、この場合だと、宣言部で
Dim xlcolumn as object
のみ宣言し、
開放部に
MRComObject(xlcolumn)
を付け加える
でよさそうですね☆

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

エドさんの書き込み (2006-12-21 13:10) より:

xlSheets("Sheet1").columns("A:AQ").AutoFit()

xlSheet("Sheet1").column("A:AQ").AutoFit()
とシートとカラムとそれぞれに関して単数形で行うと言う事ですね?!


Columns は Excel.Column のコレクションなので注意しましょう。

引用:

そして、この場合だと、宣言部で
Dim xlcolumn as object
のみ宣言し、
開放部に
MRComObject(xlcolumn)
を付け加える
でよさそうですね☆


良くないです。
それだと、1 つだけで、残りの 2 つが解放できていないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2006-12-21 14:36
茶々入れw

ExcelやWord などの COM(Component Object Model)を利用するものを .NET Framework から使う場合は、
. が出てくるたびに分解し、そのたびに、一つ変数を用意して、そのうえで、その変数を ReleaseComObject に渡して、その変数の持つ分のCOM参照を開放します。
#全部解放された時点で、COMの実体(本物のインスタンス)もいなくなります。

具体的に書くと
xlSheets("Sheet1").columns("A:AQ").AutoFit()
であれば、
sheet = xlSheets("Sheet1")

colum = sheet.columns("A:AQ")

colum.AutoFit()
というように、「3つ」に分解する必要があるということです。

また、オブジェクトが取れるという保証もありませんので(たとえ、データソースであるシートが「正しいものを指定できていた」としても、です)
=の行の後ろで、オブジェクトがあるということも確認する必要があります。

あとは、じゃんぬさんがリンク張りまくってるので、それ見てください。
ここの過去ログを ReleaseComObject で検索するだけでも、答えがいっぱい出てますよ。

何度も「同じもの」見てますしw
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 15:28
引用:

とっちゃんさんの書き込み (2006-12-21 14:36) より:

. が出てくるたびに分解し、


これだけだと、コレクション系の 「デフォルト プロパティ」 で躓く可能性がありますね。

コード:

    xlWorksheets("Sheet1").Columns("A:AQ").AutoFit()


が、

コード:

    xlWorksheets._Default("Sheet1").Columns._Default("A:AQ").AutoFit()


このように展開されることがわかっていないと、通じないかもしれません。

引用:

具体的に書くと
xlSheets("Sheet1").columns("A:AQ").AutoFit()
であれば、

sheet = xlSheets("Sheet1")
colum = sheet.columns("A:AQ")
colum.AutoFit()

コード:

    xlWorksheet = xlWorksheets("Sheet1")
    xlColumns   = xlWorksheet.Columns
    xlColumn    = xlColumns("A:AQ")
    xlColumn.AutoFit()


でしょうか。

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

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