dポイントプレゼントキャンペーン実施中!

シートのコピーでプロセスが残ってしまう
vb2008よりエクセルを起動し、シートを同一のブック内でコピーしようと思うのですが、
下記コードだとシートのコピーはできるのですがリソースが解放できず、プロセスが残ってしまいます。
wsh.Copy(wshh) の部分を wsh.Copy()にして違うブックにコピーすると問題無い。
Excel2003以降の複数のバージョンに対応させるため、CreateObjectを使用しています。
この場合、wsh.copy の部分はどのように記述すれば良いのでしょうか?
わかりやすくするため例外等のコードは省いています。

Dim app As Object
Dim wbs As Object
Dim wb As Object
Dim wshs As Object
Dim wsh As Object
Dim wshh As Object

app = CreateObject("Excel.Application")
wbs = app.Workbooks
wb = wbs.Open("c:\hoge.xls")
wshs = wb.Worksheets

wsh = wshs.item(1)
wshh = wshs.item(1)
wsh.Copy(wshh)

wb.Close()
wbs.close()
app.Quit()

System.Runtime.InteropServices.Marshal.ReleaseComObject(wshh)
System.Runtime.InteropServices.Marshal.ReleaseComObject(wsh)
System.Runtime.InteropServices.Marshal.ReleaseComObject(wshs)
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs)
System.Runtime.InteropServices.Marshal.ReleaseComObject(app)
wshh = Nothing
wsh = Nothing
wshs = Nothing
wb = Nothing
wbs = Nothing
app = Nothing

A 回答 (2件)

GC.Collect()



でうまくいくかも知れませんが、、、お勧めする方法ではありません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …

やはり
ReleaseComObject
でこまめに解放していくのが王道だと思います。

ちなみに私の環境では

wsh.Copy(wshh)

wb.Saved = True '← 追加
wb.Close()
wbs.Close()
app.Quit()

とファイルを保存していないので、「変更を保存しますか?」と聞かれるのを出ないようにしてあげると、プロセスが残りませんでした。。。


そこで質問です。

質問者さんの環境では、質問に載せていたコードに
wb.Saved = True
を加えて、プロセスが残りますか?

この回答への補足

1050YENさん、ありがとうございます。
> 質問者さんの環境では、質問に載せていたコードに
> wb.Saved = True
> を加えて、プロセスが残りますか?
残念ながら、当方の環境ではプロセスが残ってしまいました。

が、GC.Collect()で残らないことは確認できました。
こちらで対処することにします。
ありがとうございました。

補足日時:2010/08/21 08:08
    • good
    • 0

もう回答は出ているので、横やりになっていたらごめんなさい。


私も以前はプロセスが残ることがありましたので、苦労しました。
現在の環境はWin7&Office2007でVB2008開発ですが、この手のプロセス残留は発生しなくなりました。

以前はXP&Office2003でVB2008という組み合わせでした。

OSとExcelのバージョンの組み合わせによって、残留が発生するしないもあるのかもしれません。

あと、ちょっと気になったのですが、ブックを格納するプロセスがひとつ多い気がします。

wbs = app.Workbooks
wb = wbs.Open("c:\hoge.xls")

↓↓

wb = app.Workbooks.Open("c:\hoge.xls")

他の作業上必要なのかもしれませんが、プロセスが残らないように最短で開いて最短で閉じるという作業を行なったほうが良いかもしれませんよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!