sponsored link

Microsoft製品で起きる事件を解決

  • xlsx

削除される数式事件

追記: 解決した人がいるようです

Excelのエラー原因調査にえらくてこずってしまいました。 | naruhodo desu ne !

Alt + F11 で VBEを起動する

Excelのエラー原因調査にえらくてこずってしまいました。 | naruhodo desu ne !

から内容を精査して問題の箇所を特定したとのこと。以下の記事を読むよりためになるかもしれませんので、上記を先にチェックした方がいいかもしれません。

事件の始まり

同僚から相談。「またExcelがエラーになっちゃったんです」
営業が使っている集計用Excelを開くと、エラーになってしまうらしい。

「また」というのは、先週だったか、エラーになったのだ。単純なファイル破損のように思われたので、そのときにはDropboxの履歴から古いバージョンに巻き戻して解決とした。

が、まったく同じエラーが、まったく同じメンバー構成で再現したとなると、これは単純なファイル破損ではない。何かの再現性を持ったエラーだ。ここで防いでおかないと、禍根を残す。

状況

状況は、営業A、営業B、営業Cの3人がDropbox上の同一ファイルを更新している。営業A、営業Bが更新した時には何もないが、営業Cが更新した場合に、何かが起きる。次に営業A、営業Bが更新しようとすると「エラー」になり、一部の数式が削除されてしまう。が、営業Cのパソコンで開くと問題なく開く。

Excelは全員が2010で、バージョン違いによる問題は……ない。

エラー時に吐き出される文言(ダイイングメッセージ?)は以下。

削除されたレコード: /xl/workbook.xml パーツ内の名前付き範囲 (ブック)
削除されたレコード: /xl/worksheets/sheet2.xml パーツ内の数式
削除されたレコード: /xl/calcChain.xml パーツ内の数式 (計算のプロパティ)

削除されたレコード


エラーの中の「Sheet2.xmlパーツ内の数式」という表現が、集計シートから数式が削除されたことに符合する。

「パーツ内の名前付き範囲(ブック)」という単語があることから、どうやら「名前付き範囲の定義」に原因があるのではないか……と「数式」>「名前の管理」を確認したが、怪しい名前はない……印刷範囲(PrintArea)がいくつか、指定されているくらいだ。

暫定処置

エラーの内容は明白ではないが、ファイル破損が頻発するというとExcelの機能自体が破損している可能性もある。とりあえず「プログラムと機能」からOfficeの「修復」をかけて、Excelの機能不全をつぶしておく。その隙にこちらはwebの大海で解決策を探る。

「パーツ内の名前付き範囲 (ブック)」でGoogle検索。

この原因はよくわかりませんが、出力するテーブルやクエリの名前に半角または全角のかっこ“ () ()”を含んでいる場合にこの現象が起き、単純に名前だけを変更してかっこを含まないようにして同じコードを実行すると、出力した xlsx ファイルを問題なく開けることを確認できています。

DoCmd.TransferSpreadsheet で出力した xlsx ファイルを開くとエラーが発生する [Access]

最近(?)、ClosedXMLのどうさがちょっとおかしいんだが。:晶紀の館 第2別館:So-netブログ

ページ中腹「印刷範囲がおかしくなる。」というところに、該当の記述がある。どうやら印刷範囲の指定がXML上で破損してしまうバグらしい。

そういえば問題のExcelも印刷範囲(PrintArea)の指定があったし、これが怪しい!

修復が終わったところでいくつかの印刷範囲を削除してみた。

残念、症状はわずかに軽減したのみ。
印刷範囲のエラーは消えたが、残り二つのエラーが残っている。

今度は「パーツ内の数式 (計算のプロパティ)」でググってみたが芳しくない。捜査は振り出しに戻ってしまった(一度言ってみたかったこのセリフ)。

被害者(破損ファイル)の鑑識結果から解決へ

困り果てて、問題のExcelファイルの分析をしてみた。というのもwebで「xlsxファイルを解凍ソフトで解凍して、XML比較すればなんかわかるんじゃね?」というご意見があったのだ。

比較してみて絶望した! XMLファイル、デカ過ぎ。何千行もあるようなファイルを比較できませんて。この手は無理だ。

現場100回、原始的な手段に立ち返る。Excelを開いて、削除された数式がどこにあったのかを確認。3人の営業メンバーがそれぞれ「営業A(入力用)」「営業B(入力用)」「営業C(入力用)」シートを持っていて、集計用シートから参照を受けている。エラーで削除されるのは集計用シートの……営業Aへの参照と営業Bへの参照だ。営業Cの数式だけは、なぜか残っている。

むむむ。営業Cの参照式が残されていて、エラーが起きないパソコンも営業Cのもの……犯人は営業Cだ! じゃなくて、原因が何か営業Cに関係あることは間違いない。間違いないのだが、一体どこに原因があるのか。

ふと視線を落とした時に、シート名が目に入った。……あれ、シートの名前に括弧が使われている。待てよ。
「出力するテーブルやクエリの名前に半角または全角のかっこ“ () ()”を含んでいる場合にこの現象が起き……」という手がかりがあった。よくよく見てみる。

営業B(入力用)
営業C(入力用)

……営業Cのシート名の 閉じ括弧が半角 だ! これが原因に違いない!

解決編

結局、営業Cのファイルの括弧を全角に戻しても現象は治まらず、Dropboxの履歴から営業Aが最終更新した旧版(営業Cが更新する前のもの)を復活させて、そのシート名を全角に修正し、営業Cにはお手数だが再入力してもらった。

これで事件は再発しない、と信じたい。

追記

ところが、再発したのだ。舌の根も乾かぬうちに。
しょうがないので、さらに現象を検証した。

Excelファイルが置かれているパスは何の変哲もないもので、フォルダ名に半角括弧はおろか括弧さえ使っていなかった。

問題のExcelファイル以外のファイルはどうか、と思って調べたが、他のExcelファイルは問題なく保存でき、他のPCからも問題なく開くことができた。

試しに同じDropbox内で集計用Excelの場所を移動し、別のパスに置いてみた。営業CのExcelで編集・保存すると100%現象が再現しエラーが生じファイル破損が生じる。他のPCでは再現しない。

つまり、件の集計用ファイルと営業CのPC/Excelの組み合わせでのみ問題が発生していることになる。
あと考えられるとしたら? Personal.xlsのような背後で動くファイルが破損しているか、不整合なデータを持っている可能性は、ある。一応Excelの修復はしてあるはずだが、しかし、関連ファイルのうちでも個人の設定を保管している部分には何か残っているかもしれない。

クリーンインストール、というかアップデートを試すことにした。他のPCのExcelでは問題が起きていないのだから、Excelの問題なのは確かなのだ。

Excel2013を導入したところ、問題は解決した。うーん、高くついたな(苦笑)金で解決みたいな感じであんまいい気はしないが。

[EOF]

コメント

  • Ogatason より:

    同じ問題に苛まれていましたが、同様にシート名に使われていたかっこを半角に打ち直したところ解消したようです。
    まだ経過観察が必要ですが、大変参考になりました。【感謝】

    • mogami74 より:

      コメントに気づくのが遅れてすみません。そして、参考情報、ありがとうございます! 
      やはり括弧が何か関係あるのかもしれませんね。
      こちらこそ、参考になります。

  • 初心者です より:

    「パーツ内の名前付き範囲(ブック)」のエラーが出るのですが、ブックの共有設定をするとこのエラーが出てしまうようです。
    何が原因なのでしょうか?
    先月まで同じ手順で作成していてもこんなエラーは出ていませんでした…
    変わったことというと作成の担当者が変わりPCが変わったこと(Verは同じ)と、作成者には保護ビューの設定がされています。保護ビューの設定が悪さをしているのでしょうか?共有にする際に他のエラーが発生してしまうのでしょうか?
    (先月までも同じ手順で共有にはしていましたがエラーは出ていませんでした)
    こちらの記述を拝見し、色々確認してみましたが、()は使用していませんし、名前の定義も使用していません。
    印刷範囲も設定していません。
    どうしても共有にしたいブックなので、どなたか教えてください。よろしくお願いします。

    • mogami74 より:

      コメントありがとうございます。

      これはなかなか難問で、今思い出しても冷や汗が出るというか、結局明確な原因はつかめなかったんですよね……。

      私の時には、「特定の人間のExcelを通すと異常が発生する」という感じだったので、該当者のExcelを上書きアップデートすることで、なんとなくおさまったのですが……。

      いい手がかりが得られず申し訳ありません。

  • 匿名希望 より:

    Accessからエクスポートしたexcelで同じエラーが出てここにたどり着きました。
    ここにたどり着くまで頭の中ハテナだらけでしたが、()が悪さをしていたみたいで、無事解決できました。大変助かりました。
    なお、私の場合は全角()に統一してみても解決せず、半角()に統一したところエラーが出なくなりました。


sponsored link