トップ回答者
Excel2003で正常動作していたが、Excel2007になってプロセスが残る。

質問
-
これまでExcel2003で問題なかったのですが、新規にマシンが3台導入されExcel2007になってこの問題が浮上しました。
下記プログラムで1台だけ(ノートPC)Excelプロセスが解放されず、デスクトップ2台は解放されます。
ご教示お願いいたします。
Private mobjExcel As Object
Private Const OBJECT_EXCEL As String = "Excel.Application"
Private Sub Command9_Click()
Set mobjExcel = Nothing
Set mobjExcel = CreateObject(OBJECT_EXCEL)
Call mobjExcel.Workbooks.Open("C:\AAAAA.xls", , True)
※ mobjExcel.ActiveWorkbook.SaveAs "C:\BBBBB.xls"
※ mobjExcel.ActiveWorkbook.Close
mobjExcel.Quit
Set mobjExcel = Nothing
End Sub
上記プログラムの※部分を省略したプログラムでは、すべてのマシン
でプロセスが解放されます。
・処理忘れや記述の間違いがあるでしょうか?
・Vistaのダウングレード版XPという事で、特別な設定が必要なのでしょうか?
(「Vistaはいろいろ厄介だ」と聞きます)
・Excel2007に特別な設定があるのでしょうか?
AAAAA.xlsファイルは罫線と数値が書かれている単純なものです。
AAAAA.xlsファイルは 2003/2007バージョン どちらでも結果は同じでした。
Excel保存形式の設定を 2003/2007 どちらのバージョンにしても結果は同じでした。
環境
・WindowsXP SP3(ダウングレード版)
・Excel2007
・VB6
・デスクトップ2台、ノート1台(すべてDell製)
現象の出ているマシンが手元に無く(遠地にあり)ご教示いただいた内容の確認が遅くなります。
ご容赦お願いいたします。
回答
-
Excel2000,2007でテストしましたが、Applicationオブジェクト,WorkBooksオブジェクト,WorkBookオブジェクトのReleaseComObjectをきちんとすれば開放されてますよ。
ReleaseComObjectしていないのに開放できていたのはたまたま運がよかったのでは?
Dim mobjExcel As Object Dim wbs As Object Dim wb As Object Const OBJECT_EXCEL As String = "Excel.Application" mobjExcel = CreateObject(OBJECT_EXCEL) mobjExcel.Visible = True wbs = mobjExcel.WorkBooks wb = wbs.Open("c:\AAAAA.xls", , True) wb.SaveAs("c:\BBBBB.xls") wb.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(wb) System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs) mobjExcel.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExcel) mobjExcel = Nothing
- 回答としてマーク kappa83 2009年6月27日 14:47
-
結果報告いたします。gekka様よりいただいた情報をもとにソフト修正しようとしましたが、Marshal.ReleaseComObject()はFreamWorkで提供されているもの様でした。
現行の環境にはFreamWorkがインストールされていません。
現在動作している環境に影響のない修正を目指し、明示的に開放処理を追記した下記ソフトで解放されるようになりました。
どうもありがとうございました。
Private mobjExcel As Object
Private Const OBJECT_EXCEL As String = "Excel.Application"
Private Sub Command9_Click()
Dim wbs As Object
Dim wb As Object
Set mobjExcel = Nothing
Set mobjExcel = CreateObject(OBJECT_EXCEL)
Set wbs = mobjExcel.WorkBooks
Set wb = wbs.Open("C:\AAAAA.xls", , True)
Call wb.SaveAs("C:\BBBBB.xls")
wb.Close
Set wb = Nothing
Set wbs = Nothing
mobjExcel.Quit
Set mobjExcel = Nothing
End Sub
すべての返信
-
Excel2000,2007でテストしましたが、Applicationオブジェクト,WorkBooksオブジェクト,WorkBookオブジェクトのReleaseComObjectをきちんとすれば開放されてますよ。
ReleaseComObjectしていないのに開放できていたのはたまたま運がよかったのでは?
Dim mobjExcel As Object Dim wbs As Object Dim wb As Object Const OBJECT_EXCEL As String = "Excel.Application" mobjExcel = CreateObject(OBJECT_EXCEL) mobjExcel.Visible = True wbs = mobjExcel.WorkBooks wb = wbs.Open("c:\AAAAA.xls", , True) wb.SaveAs("c:\BBBBB.xls") wb.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(wb) System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs) mobjExcel.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjExcel) mobjExcel = Nothing
- 回答としてマーク kappa83 2009年6月27日 14:47
-
結果報告いたします。gekka様よりいただいた情報をもとにソフト修正しようとしましたが、Marshal.ReleaseComObject()はFreamWorkで提供されているもの様でした。
現行の環境にはFreamWorkがインストールされていません。
現在動作している環境に影響のない修正を目指し、明示的に開放処理を追記した下記ソフトで解放されるようになりました。
どうもありがとうございました。
Private mobjExcel As Object
Private Const OBJECT_EXCEL As String = "Excel.Application"
Private Sub Command9_Click()
Dim wbs As Object
Dim wb As Object
Set mobjExcel = Nothing
Set mobjExcel = CreateObject(OBJECT_EXCEL)
Set wbs = mobjExcel.WorkBooks
Set wb = wbs.Open("C:\AAAAA.xls", , True)
Call wb.SaveAs("C:\BBBBB.xls")
wb.Close
Set wb = Nothing
Set wbs = Nothing
mobjExcel.Quit
Set mobjExcel = Nothing
End Sub
-
gekka様よりいただいた情報をもとにソフト修正しようとしましたが、Marshal.ReleaseComObject()はFreamWorkで提供されているもの様でした。
VB6だと、Nothingを設定することで相当するのだと思いますが…自信がありません。orz
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。 -
私も"開放されない"という文言を見てVB.Netだと誤解してました。すみませんでした。
で、再度VB6およびVBSで動作を確認してみました。
結果、開放されたのですが、開放されない可能性があることがわかりました。
書き込み先フォルダに書き込み権限がない場合にSaveAsで失敗しエラーになります。
その場合、以降の処理が実行されずにプロセスが残ってしまっていました。
一般ユーザーはドライブのルートに書き込み権限がないために失敗します。
Windowsのどのバージョンからルートに権限がなくなっていたか憶えていないのですが、XP SP2やVistaはデフォルトで権限なしになっていました。
(手元にある2000SP4では権限ありですが、初期状態か自信がない)
あくまでテストのためにルート直下に保存したのかもしれませんが、保存失敗はありえるという前提で開放処理が実行されるようにエラー処理を追加しておいたほうがいいでしょう。
しかしNothingをセットするようにしたら開放されるのでしたら別の原因だったのでしょう…