事件の始まり

同僚から相談。「また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 パーツ内の数式 (計算のプロパティ)

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

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

暫定処置

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

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

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

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