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

No35642 の記事


■35642 / )  Re[5]: GetObjectでExcelファイルを加工するとExcelファイルが壊れる
□投稿者/ 魔界の仮面弁士 大御所(1580回)-(2024/12/12(Thu) 16:11:45)
  • アイコンNo35641に返信(suekunさんの記事)
    > 関連なのですが
    ファイルが破損してしまっている状態だったのか
    それともブックが非表示になっていただけなのか
    確認はとれましたか?


    > そうしないと、読み取り専用で開いてしまいます。
    この判定を行う目的を教えてください。

    編集・保存することを目的としたものでしょうか。
    それとも、他で同時に開かれていないことを保証したいのでしょうか。
    目的を満たすために、GetObject 以外の手法を使うことは許容されますか?

    他で開かれていても保存までできるパターンはありますし
    他で開かれていなくても保存できないパターンもありますし、
    他で開かれていて Workbooks.Open で排他エラーになるパターンもあるので
    念のために確認しています。

    最終的に、ファイルに「読み取り専用属性が付いているか」とか
    アクセス権で「読み取りは許可されているが編集は許可されていない」などの
    パターンまでチェックするのか、何のためにどこまで調査したいのか…。

    GetObject に拘りが無ければ、ROT から Excel.Application オブジェクトを辿って、
    Excel.Application インスタンス (表示名「!{00024500-0000-0000-C000-000000000046}」)から
    それぞれの Workbooks コレクションを列挙判定するという手段もあります。
    コードとしては些か回りくどくなりますが…。
    https://alax.info/blog/1444
    http://bbs.wankuma.com/index.cgi?mode=one&namber=103471


    > これはいかがでしょうか?正常に動作しています。
    うぅむ?
    ListFile と NyukoCSVListFile の関連性が謎ですね??

    変数宣言や Visible の指定有無など、色々と省略され過ぎていて、
    是非の判断がしづらいところです。

    > wb = Appxl.Workbooks.Open(ListFile)
    この書き方は避けるべきですが、ここも掲示板投稿時に
    簡略化しているだけだと思うので、ひとまず目を瞑るとして…。


    > If IO.File.Exists(ListFile) = True Then
    >  Try
    >   System.IO.File.Move(ListFile, ListFile)
    1 行目では「System」を省略して、
    3 行目では明記するという非対称性がとても気になる…。

    Boolean 値の判定時に「= True」を書くべきか否かとか、
    GoTo の是非とか、素の Exception を Catch するべきかどうかとか、
    Message を表示するだけでどの Exception かを記録しないのか、
    そういった宗教論についてはとりあえず保留するとして。


    閑話休題

    >   '移動できなかったら起動していると判定
    この手順ですが、確実性のある手法では無いです。
    そのファイルが Excel で開かれているからといって、同名 Move が失敗する保証は無いからです。

    たとえば、扱っていたファイルが MultiUserEditing = True なものだった場合です。
    共有モードで開かれたファイルであれば、複数ユーザーが同時に開いて編集して保存できますし、
    開かれている最中でも、コマンドプロンプトからの同名 MOVE や VB からの同名 File.Move が
    エラーを発することはありません。

    もちろん、そうした前提条件が明確になっていて、それで目的を果たせる場合は
    現在の手法でも構わないと思います。
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -