シートのコピーでプロセスが残ってしまう
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ランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
IISがフリーズ
-
Linuxでのスレッド間メッセージ...
-
VB.NET 自プログラムのプロセス...
-
パソコンに出てくるじゃまな表...
-
他のコンピュータのプロセスを取得
-
共有メモリの同時アクセスにつ...
-
Apacheの子プロセスが再起動す...
-
C#でのbatファイル実行結果取得
-
WMIでのプロセスの起動・終了監...
-
コマンド実行時の結果のリダイ...
-
sleep関数の精度について
-
OSPFでプロセスを分ける意義に...
-
SendMessageが失敗するときがある
-
Windowsでのfork方法
-
特定ユーザーのプロセス情報を...
-
c言語でプロセスIDを調べたい
-
C++でシェルを起動
-
他のアプリケーションをクリッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
popen について
-
C++のプログラムをバックグラウ...
-
非表示になったエクセルは?
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
-
sleep関数の精度について
-
Visual C++からpingを実行して...
-
ADOでアクセスのレコードに...
-
C++でシェルを起動
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
-
OSPFでプロセスを分ける意義に...
おすすめ情報