- - PR -
エクセルのシートのコピーをするとプロセスが残る
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2006-01-25 16:34
典型的な参照の解放漏れです。
参照したものはすべて変数に取る必要があります。 COM オブジェクトを解放する # 二重でスレッドが建ってますね。 # 向こうは削除するか、こっちに移動するようにしておいてください。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 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) | ||||
|
投稿日時: 2006-01-25 17:45
とりあえず、正常処理の時はこれで大丈夫でしょう。 Try 〜 Finally で確実に ReleaseCom されるようにしないと、 例外などが起きた場合に、「解放漏れ」になってしまいますよ。 リンク先は良くないコード例に見えてしまうんですが、 Finally 句に解放処理を書くのが望ましいです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-01-25 18:23
お世話になります。
System.Runtime.InteropServices.Marshal.IsComObject で尋ねてから、 解放処理をやった方がよいという方も いらっしゃいますね。
| ||||
|
投稿日時: 2006-01-25 18:48
自分で明示的に型指定しているので、不要だと思ってます。> 私は 遅延バインディングならば別ですが。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1