- 題名: vb.netでexcelのプロセスが解放されない
- 日時: 2012/11/29 18:30:48
- ID: 31145
- この記事の返信元:
- (なし)
- この記事への返信:
- [31147] Re[1]: vb.netでexcelのプロセスが解放されない2012/11/29 19:13:05
- ツリーを表示
通常モードを選択したまま投稿すると、インデントが削られてしまいます。 次回からは、コード投稿時には[図表モード]を御利用ください。 ■No31145に返信(あいあいさんの記事) > vb.netであるEXCELブックをコピーして新しいブックを作りたいのですが 新規ブックにコピーする代わりに、「Workbooks.Add(Excelファイル名)」で新規ブックを 作成する手もあります。(空シートも必要なら後から追加する) > AddHandler xlApp.WorkbookBeforeClose, AddressOf xlApp_WorkbookBeforeClose 今回の場合、New Excel.Application から Quit までが一つの処理になっていますが、 上記のイベントハンドラは必要なのでしょうか? 使っていないなら、上記の一文は削除しておいた方が良いでしょう。 使っているのなら、Quit 前に RemoveHandler を呼び出しておく事をお奨めします。 > xlBooks_mot = xlApp.Workbooks > xlBooks = xlApp.Workbooks Workbook は文書ごとに生成されますが、 Workbooks は、Application ごとにひとつだけです。 この 2 つは同じオブジェクトを操作することになるので、管理変数も 一つだけにしえておくことをおすすめします。同じオブジェクトへの参照を 複数個所で保持すると、参照カウントの管理が複雑化することがあります。 > xlSheet_mot.Copy(After:=xlBook.Sheets(xlBook.Sheets.Count)) > xlSheets = xlBook.Worksheets > xlSheet = DirectCast(xlSheets.Item(xlBook.Sheets.Count), Excel.Worksheet) 「xlBook.Sheets.Count」や「xlBook.Sheets(…)」の利用は避けましょう。 xlSheets = xlBook.Worksheets xlSheet_mot.Copy(After:=xlSheets.Item(xlSheets.Count)) xlSheet = DirectCast(xlSheets.Item(xlSheets.Count), Excel.Worksheet) > '保存時の問合せのダイアログを非表示に設定 ワークブックを .Saved = True にしておくと、.DisplayAlerts = True のままでも 終了時に保存確認が行われなくなります。 (.Saved = True をセットした後で、さらに文書に変更を加えた場合は確認されます) > xlApp.Visible = False > xlApp.ScreenUpdating = False これらは、インスタンス生成直後に実施した方が良いでしょう。 その上で、終了時には DisplayAlerts だけでなく、 ScreenUpdating も True に戻すようにした方が無難です。 > どなたか、ご教授ください。 http://www.tt.rim.or.jp/~rudyard/torii009.html http://blogs.wankuma.com/jeanne/archive/2005/11/24/19566.aspx
2012/11/30(Fri) 16:49:18 編集(投稿者) 魔界の仮面弁さん、ありがとうございました。 超初心者のため、いろいろおかしな記述があるようですね。(お恥ずかしい...) また、インデントが削られてしまい見づらくなっていて申し訳ありませんでした。 魔界の仮面弁さんに教えていただいたことを参考にして、もう一度組みなおしてみます。 きちんと動いたら報告させていただきます。
分類:[.NET]
vb.netであるEXCELブックをコピーして新しいブックを作りたいのですが、プロセスの解放がうまくいきません。
xlApp.Visible = Falseではなく、TRUEで表示したときはうまくいっていたのですが、表示せずに処理を終わりにしたいのですが、できません。
どなたか、ご教授ください。
−−−↓ソース−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private xlApp As Excel.Application
Private xlBooks_mot As Excel.Workbooks
Private xlBook_mot As Excel.Workbook
Private xlSheets_mot As Excel.Sheets
Private xlSheet_mot As Excel.Worksheet
Private xlBooks As Excel.Workbooks
Private xlBook As Excel.Workbook
Private xlSheets As Excel.Sheets
Private xlSheet As Excel.Worksheet
Using scope As New TransactionScope
Try
xlApp = New Excel.Application
'Excel の WorkbookBeforeClose イベントを取得
AddHandler xlApp.WorkbookBeforeClose, AddressOf xlApp_WorkbookBeforeClose
xlBooks_mot = xlApp.Workbooks
'既存のファイルを開く場合
xlBook_mot = xlBooks_mot.Open(My.Settings.Excel_Path & "output.xls")
xlSheets_mot = xlBook_mot.Worksheets
xlSheet_mot = DirectCast(xlSheets_mot.Item(1), Excel.Worksheet) 'CType(xlSheets(SheetName), Excel.Worksheet)
'新規ブックの追加
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Add
'コピー元のシートを新規ブックの最終にコピー
xlSheet_mot.Copy(After:=xlBook.Sheets(xlBook.Sheets.Count))
'コピーしたシートオブジェクトをセット
xlSheets = xlBook.Worksheets
xlSheet = DirectCast(xlSheets.Item(xlBook.Sheets.Count), Excel.Worksheet) 'CType(xlSheets(SheetName), Excel.Worksheet)
xlApp.Visible = False
xlApp.ScreenUpdating = False
xlApp.DisplayAlerts = False '保存時の問合せのダイアログを非表示に設定
xlBook_mot.Close() 'xlBook_mot を閉じる
xlBook.Close() 'xlBook を閉じる
Catch ex As Exception
Finally
MRComObject(xlSheet_mot) 'xlSheet_mot の解放
MRComObject(xlSheets_mot) 'xlSheets_mot の解放
MRComObject(xlSheet) 'xlSheet の解放
MRComObject(xlSheets) 'xlSheets の解放
MRComObject(xlBook_mot) 'xlBook の解放
MRComObject(xlBooks_mot) 'xlBooks_mot の解放
MRComObject(xlBook) 'xlBook の解放
MRComObject(xlBooks) 'xlBooks の解放
If EXCELFLG = 1 Then
xlApp.DisplayAlerts = True
xlApp.Quit() 'Excelを閉じる
End If
MRComObject(xlApp) 'xlApp を解放
End Try
End Using
Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) 'A-20121126
If objCom Is Nothing Then
Return
End If
Try
If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
If force Then
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
Else
System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
End If
End If
Finally
objCom = Nothing
End Try
End Sub