DOBON.NETプログラミング道掲示板

■35638 / 1階層)  GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ 魔界の仮面弁士 大御所(1578回)-(2024/12/11(Wed) 16:44:32)
  • アイコン2024/12/11(Wed) 16:50:44 編集(投稿者)

    No35636に返信(suekunさんの記事)
    > vb.netでgetobjectでExcelファイルを読込み保存するとExcelファイルが破損します。
    一口に「破損」としか書かれていませんが、
    具体的にはどういう状態になってしまうのでしょうか?

    保存処理自体が失敗するのか、
    保存処理時にエラーメッセージが出るのか、
    保存は行われるが、保存結果が「シート数 0 の不正なブック」になるのか
    .xlsx 形式で保存したはずが .xls 形式になってしまうのか、
    処理が無応答状態となってフリーズするのか、など。


    また、全面的に Marshal.ReleaseComObject メソッドの呼び出しが漏れているように見えます。

    「非表示の EXCEL.EXE」がタスクマネージャー上で残留するなどしていた場合に
    誤動作を引き起こしてしまう危険性があります。念のため、
    コードを修正する前に Windows を再起動しておきましょう。



    で…既に起動済みの Excel インスタンスに対して
    = GetObject(,"Excel.Application")
    などでアクセスするのならば良いですが、
    = GetObject("Z:\Example.xlsx")
    などでのアクセスはあまりお奨めしません。

    Excel が起動していない状態で『GetObject(ワークブックファイルパス)』を呼び出した場合、
    その時点で「非表示状態の Excel.exe」が Embedded モードで起動することがあり、
    このインスタンスが誤動作の要因となることがしばしばあります。
    (Application インスタンスだけでなく、Window インスタンスも不可視状態で起動します)

    GetObject で起動した場合に解放させにくいという問題は、
    VB6 などから呼び出した場合にも言えることなのですが、
    VB.NET からの呼び出しにおいては、COM オブジェクトの
    解放手続きの手間がさらに増えるので、個人的にはあまりお奨めしません。



    > wb.Close()

    Workbook オブジェクト自身を Close した時点で、内部の COM オブジェクトは
    『COM クライアント側から切断された状態』になります。

    それ自体は想定された動作ですが、.NET 側としては、切断状態にあるオブジェクトを
    そのまま保持しているだけなので、もはやこの変数を通じて Excel を操作することはできなくなります。
    (不要になったExcel本体を明示的に終了させる時などに困る)

    操作後も Excel インスタンスを使い続ける必要があるならば、GetObject は使わず、
    新規に Excel.Application インスタンスを New して、それを起点として操作する設計の方が無難です。

    GetObject を起点した場合も、Application プロパティを通じて、Excel.Application インスタンスに
    アクセスすることはできますが、それによって取得したインスタンスが、
    新しく起動した Exce なのか、自身以外の他のアプリなどからも参照されている状態なのかは区別できません。
    他のアプリなども同じインスタンスを操作していた場合、勝手に Application を
    勝手に(Quit メソッドなどで)終了させてしまうと、まだ使用している他の処理が
    『COM サーバー側から切断された状態』に陥ってしまい、やはり予期せぬ動作の要因となりえます。
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←GetObjectでExcelファイルを加工するとExcelファイルが壊れる /suekun →Re[2]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる /suekun
 
上記関連ツリー

Nomalアイコン GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/11(Wed) 11:53) #35636
Nomalアイコン Re[1]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/11(Wed) 15:14) #35637
Nomalアイコン GetObjectでExcelファイルを加工するとExcelファイルが壊れる / 魔界の仮面弁士 (24/12/11(Wed) 16:44) #35638 ←Now
  └Nomalアイコン Re[2]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/11(Wed) 17:03) #35639
    └Nomalアイコン Re[3]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / 魔界の仮面弁士 (24/12/11(Wed) 18:15) #35640
      └Nomalアイコン Re[4]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/12(Thu) 07:28) #35641
        └Nomalアイコン Re[5]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / 魔界の仮面弁士 (24/12/12(Thu) 16:11) #35642
          ├Nomalアイコン Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / 魔界の仮面弁士 (24/12/12(Thu) 16:23) #35643
          ├Nomalアイコン Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/13(Fri) 08:56) #35644
          └Nomalアイコン Re[6]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる / suekun (24/12/18(Wed) 15:31) #35645 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -