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

エクセルのシートのコピーをするとプロセスが残る

1
投稿者投稿内容
ぽぽぴ
常連さん
会議室デビュー日: 2005/06/17
投稿数: 23
投稿日時: 2006-01-25 16:24
いつもお世話になっております。

下記のコードで異なったブック間でのシートのコピーを行っているのですが、
コピーは、正常に出来るのですが、プロセスが残ってしまっております。
※の所の1行を削除した状態で、実行するとプロセスは残らないため、
この行が問題だとは思うのですが、原因がわかりません。
ご教授よろしくお願い致します

開発環境は、VB.net , Windows XP , Office XP Pro.


Dim xlBook2 As Excel.Workbook
xlBook2 = xlBooks.Open("d:\\A.xls")

Dimx lBook3 As Excel.Workbook
xlBook3 = xlBooks.Open("d:\\B.xls")


xlBook2.Sheets("b").Copy(before:=xlBook3.Sheets("a")) ’※


xlBook2.Close()
xlBook3.Save()
xlBook3.Close()

xlApp.Visible=False
xlApp.Quit()

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook3)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

[ メッセージ編集済み 編集者: ぽぽぴ 編集日時 2006-01-25 16:31 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-25 16:34
典型的な参照の解放漏れです。
参照したものはすべて変数に取る必要があります。

  COM オブジェクトを解放する

# 二重でスレッドが建ってますね。
# 向こうは削除するか、こっちに移動するようにしておいてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぽぽぴ
常連さん
会議室デビュー日: 2005/06/17
投稿数: 23
投稿日時: 2006-01-25 16:54
じゃんぬねっと様

ありがとうございました。
下記コードにて、解決いたしました。

二重スレ申し訳ございませんでした。。削除いたしました。



Dim xlBook2 As Excel.Workbook
xlBook2 = xlBooks.Open("d:\\A.xls")

Dimx lBook3 As Excel.Workbook
xlBook3 = xlBooks.Open("d:\\B.xls")


Dim xlSheets2 As Excel.Sheets
xlSheets2 = xlBook2.Worksheets

Dim xlSheet2 As Excel.Worksheet
xlSheet2 = xlSheets2("a")

Dim xlSheets3 As Excel.Sheets
xlSheets3 = xlBook3.Worksheets

Dim xlSheet3 As Excel.Worksheet
xlSheet3 = xlSheets3("b")

xlSheet2.Copy(before:=xlSheet3)


xlBook2.Close()
xlBook3.Save()
xlBook3.Close()

xlApp.Visible=False
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets3)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet3)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook2)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook3)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-25 17:45
引用:

ぽぽぴさんの書き込み (2006-01-25 16:54) より:

ありがとうございました。
下記コードにて、解決いたしました。


とりあえず、正常処理の時はこれで大丈夫でしょう。

Try 〜 Finally で確実に ReleaseCom されるようにしないと、
例外などが起きた場合に、「解放漏れ」になってしまいますよ。

リンク先は良くないコード例に見えてしまうんですが、
Finally 句に解放処理を書くのが望ましいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-01-25 18:23
お世話になります。

System.Runtime.InteropServices.Marshal.IsComObject で尋ねてから、
解放処理をやった方がよいという方も
いらっしゃいますね。

コード:
If Not obj Is Nothing AndAlso _
  System.Runtime.InteropServices.Marshal.IsComObject(obj) Then
  System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
End If

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

なおこ(・∀・)さんの書き込み (2006-01-25 18:23) より:

System.Runtime.InteropServices.Marshal.IsComObject で尋ねてから、
解放処理をやった方がよいという方もいらっしゃいますね。


自分で明示的に型指定しているので、不要だと思ってます。> 私は
遅延バインディングならば別ですが。

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

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