none
Excel2003で正常動作していたが、Excel2007になってプロセスが残る。 RRS feed

  • 質問

  • これまで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製)

     現象の出ているマシンが手元に無く(遠地にあり)ご教示いただいた内容の確認が遅くなります。
     ご容赦お願いいたします。

    2009年6月22日 1:33

回答

  • Excel2007で十分な検証をしたわけではありませんが、Excelのプロセスが残らないようにするためには、通常はReleaseComObjectメソッドを実行しますので、試されてみたらいかがでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kappa83 2009年6月27日 14:47
    2009年6月22日 9:29
    モデレータ
  • 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
    2009年6月22日 10:19
  • 結果報告いたします。

    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

    • 回答としてマーク kappa83 2009年6月27日 14:37
    • 回答としてマークされていない kappa83 2009年6月27日 14:37
    • 回答としてマーク kappa83 2009年6月27日 14:47
    2009年6月27日 14:34

すべての返信

  • Excel2007で十分な検証をしたわけではありませんが、Excelのプロセスが残らないようにするためには、通常はReleaseComObjectメソッドを実行しますので、試されてみたらいかがでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク kappa83 2009年6月27日 14:47
    2009年6月22日 9:29
    モデレータ
  • 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
    2009年6月22日 10:19
  • trapemiya様

     ご回答ありがとうございます。

     少々お時間をいただき、試みて結果報告いたします。

    2009年6月22日 10:45
  • gekka様

     プログラムに運が良いなんてのがあるのですね。
     少し驚きました。

     少々お時間をいただき、試みて結果報告いたします。
     ご丁寧な回答ありがとうございました。
    2009年6月22日 10:51
  • 結果報告いたします。

    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

    • 回答としてマーク kappa83 2009年6月27日 14:37
    • 回答としてマークされていない kappa83 2009年6月27日 14:37
    • 回答としてマーク kappa83 2009年6月27日 14:47
    2009年6月27日 14:34
  • gekka様よりいただいた情報をもとにソフト修正しようとしましたがMarshal.ReleaseComObject()はFreamWorkで提供されているもの様でした。
    ReleaseComObjectすべきというのは、Visual Basic.NET(Visual Studio 2002以降)の話だと誤解したことでついてしまったのだと思います。
    VB6だと、Nothingを設定することで相当するのだと思いますが…自信がありません。orz
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年6月27日 14:46
    モデレータ
  • Azulean様

     「環境」の説明をもう少し工夫して解りやすくすれば良かったです。
     ありがとうございました。

    皆様
     ありがとうございました。
    2009年6月27日 15:00
  •  「環境」の説明をもう少し工夫して解りやすくすれば良かったです。
    いえいえ、ちゃんと書いてありますね。私の見落としです。思い込みによるうっかりミスです。
    申し訳ありませんでした。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年6月27日 15:31
    モデレータ
  • 私も"開放されない"という文言を見てVB.Netだと誤解してました。すみませんでした。

    で、再度VB6およびVBSで動作を確認してみました。
    結果、開放されたのですが、開放されない可能性があることがわかりました。

    書き込み先フォルダに書き込み権限がない場合にSaveAsで失敗しエラーになります。
    その場合、以降の処理が実行されずにプロセスが残ってしまっていました。
    一般ユーザーはドライブのルートに書き込み権限がないために失敗します。
    Windowsのどのバージョンからルートに権限がなくなっていたか憶えていないのですが、XP SP2やVistaはデフォルトで権限なしになっていました。
    (手元にある2000SP4では権限ありですが、初期状態か自信がない)

    あくまでテストのためにルート直下に保存したのかもしれませんが、保存失敗はありえるという前提で開放処理が実行されるようにエラー処理を追加しておいたほうがいいでしょう。

    しかしNothingをセットするようにしたら開放されるのでしたら別の原因だったのでしょう…
    2009年6月29日 3:50