![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
シートのコピーでプロセスが残ってしまう
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
No.1ベストアンサー
- 回答日時:
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()で残らないことは確認できました。
こちらで対処することにします。
ありがとうございました。
No.2
- 回答日時:
もう回答は出ているので、横やりになっていたらごめんなさい。
私も以前はプロセスが残ることがありましたので、苦労しました。
現在の環境はWin7&Office2007でVB2008開発ですが、この手のプロセス残留は発生しなくなりました。
以前はXP&Office2003でVB2008という組み合わせでした。
OSとExcelのバージョンの組み合わせによって、残留が発生するしないもあるのかもしれません。
あと、ちょっと気になったのですが、ブックを格納するプロセスがひとつ多い気がします。
wbs = app.Workbooks
wb = wbs.Open("c:\hoge.xls")
↓↓
wb = app.Workbooks.Open("c:\hoge.xls")
他の作業上必要なのかもしれませんが、プロセスが残らないように最短で開いて最短で閉じるという作業を行なったほうが良いかもしれませんよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別ブックからシートのコピー 3 2022/04/01 20:07
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
API関数 GetExitCodeProcess
-
プロセスのアタッチ・デタッチ...
-
プロセスIDからウィンドウハ...
-
ADOでアクセスのレコードに...
-
explorer.exeが異様にメモリを食う
-
他のコンピュータのプロセスを取得
-
タスクマネージャーのプロセス...
-
ShellExecuteが起動したプロセ...
-
他のアプリケーションをクリッ...
-
怪しいプロセス教えてください。
-
IISがフリーズ
-
VB6.0 SHELLで起動...
-
WebBrowserでPDF表示でのトラブル
-
セマフォとmutexの違いは?
-
プロセスIDの取得方法について
-
誤ってプロセスの終了をしてし...
-
非表示になったエクセルは?
-
デスクトップ上のアイコン名の...
-
バイナリ→構造体
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
C#でのbatファイル実行結果取得
-
VB6.0 SHELLで起動...
-
ADOでアクセスのレコードに...
-
Windowsでのfork方法
-
非表示になったエクセルは?
-
共有メモリの同時アクセスにつ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
C++のプログラムをバックグラウ...
-
C++でシェルを起動
-
Linuxでのスレッド間メッセージ...
-
OSPFでプロセスを分ける意義に...
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
おすすめ情報