MicrosoftExcelブックに含まれた数式一覧表示

 平成という一つの時代が終わりの時を迎えるためか、組織変更、がはげしくなってきた。
 ファイルサーバーのディレクトリ構成も、組織に合わせてフォルダ名が変わったり、課のフォルダがとなりの部のディレクトリに移ったりするのが世の流れというものである。ところが、思いのほか動きが鈍い。

 確かに面倒ではある。しかしそんなに難しいことではない。会社の統合があった時、飽きるほどやって手順書も固めた。
 パスが変わるとショートカットが使えなくなるという問題については、7年くらい前に「リンクつなが〜る」というツールを作って解決した。たしかに使いにくいところはあったから(別ソフトでファイル一覧を作ってペーストするとか)、反省を込めてあちこちリファインしたのだがそれでもやろうとしない。何故?
 ボソッと漏らしてくれる人がいた。「エクセルのリンク先にパス切っているのがあるんだ」。なるほど、思いきれないわけだ。計算式に他のワークブックの値を参照するようにリンクを張っている場合、いきなり#REFの嵐になる。元のリンクが回復できるかどうかも疑わしい。

 しかしながら、組織名や構成が元号のように大きく変わっても、皆が「フォルダ構成は伝統的にこうだから」で通していると、そのうちに「なんでこのファイルがこんなところにあるの?」が徐々に増え、逆に昔のものは探し出せなくなる。

 他のワークブックにリンクを張っているMS-Excelシートなんてそんなにあるわけではない。だからといって「都度各自が対処」なんてやっていてはスムーズな移行は望めない。自分が当たり前のように開いていたファイルが急に使えなくなっているかも、という不安感もわからなくもない。
 であれば、どのワークブックの、どのシートの、どのセルが、どこに対してリンクを張っているか、というのを全部表示してやればよい。そこで作ったよ。フォルダ指定するとその中にあるMS-Excelファイルを開いてリンク一覧を表示するツール。リンクに外部のMicoroftExcelファイルがあると思われた場合は、一覧表にその数を書いて個別明細もセルを塗って確認を促す。例によってきめが細かい。

 ワークブックを開くごとに、数式があればそのワークブックの名前でシートを作り、元のブックのパス、ファイル名、シート名、セル番地、数式を入れてゆく、のだが、まずワークブック名がそのままワークシート名に使えるわけではない。ワークシート名には31文字という制限がある。なぜ31文字か考えてみました。アタリを付けてみたらどうやら正解みたいです。昔のMacintoshのファイル名は31文字の制限があったのでそれを引きずっているのでしょう。ということは・・・やはり禁止文字は半角だけでなく全角でも通りませんね。ともかく31文字で切って、重複するようであれば一連番号をつけて、結構まめな動きをせねばならない。

 動作するたびに多量のワークシートを作ります。当然、実行前には消してゆきます。でもワークシートの数をゼロにしてはいけないのだよね。なのでマクロの使い方を書いた[Readme]というシートをつくって消去せずに残しておこうとしたが、しかし、Readme.xlsというファイルがあったらどうなる?上書きしちゃうよ。結果として消しちゃうよ。
 というわけで「消してはいけない」シート名は、「ファイル名としては通るが、シート名としては通らない文字」を使うこととしました。具体的には「<Readme>」。"<", ">"の記号はファイル名に使えないからね。

 256バイトのパス+ファイル名制限以上のものが入力されたらどうするか。すんごい大変でした。FilesystemObjectでも拾えないし、Dir(パス名,vbdirectory)でも上手くいかないのだよ。両方組み合わせて、なんとか。

 パスワード付ファイルは「パスワードを入力してください」のダイアログボックスが出る。ではこれを「SendKeys "{ESC}"」で読み飛ばすようにするとこんどは「読み取り推奨」のダイアログボックスが出たファイルの場合でもそのまま読み飛ばしてしまう。どうするか?解決しました。ただし壊れたブックに行き当たると止まります。「組み込みの定義名と同じ名前では定義できません」なんて表示されたらさすがに対応のしようがなかった。タスクマネージャーに表示されるものであればなんとかすることもできようが、それすらできない。このときだけは手で[Cancel]のボタンを押すしかない。

 ファイルを開く際、マクロの自動実行、止めたほうがいいね。遅くなるだけならいいとしても、バージョンの古いマクロがあったりすると「言語仕様が変わっているので止まる」があるのだ。リンクの更新もしない。遅くなるだけだ。

 開くまででこんだけ大変。更に数式を読むのがこれまた大変で、数式を読むプロパティだったはずが、値を返してくるという仕様だったりして、もうすこし素直に反応するようにMS-Excel作り変えてくれないかなあ。どうせMacOS用なんて今出してないんでしょ。

 パフォーマンス向上のためにできるだけ配列内で作業するようにして。できあがり。

 ところで私が「リンクつなが〜る」を作ったあとではありますが、Vectorを見るとショートカットファイルをつなぎ替えるフリーソフトウェア作って発表してくれた人がいます。申し訳ないのですが、勉強会で使わせてもらいました。
 とりあえず自分用として、おもいついたそのまま作っちゃったみたいね。業務で使うなら、移行を前提にきちんと考えて、一括でショートカットを洗い出し、変更先にファイルがあるかどうかを確認した後、処理を行う、程度のことをやるのが(私基準では)常識。この人はたまたま同じ文字列がショートカットリンク先の任意の場所にあったら書き換えてしまって、それが「たまたま」だった場合、二度と使えなくなるという(その他花落つる事知る多少)、、、「仕様を作る際に思慮が足りてない例」として、うちの若手の栄養になっているといいな。  教材に使わせてもらったお礼に、当方のツール、もちろんソース込みで進呈しようかと思ったが、人によっては屈辱と捉えることもあるようだ。難しいところだ。私なら大喜びなんだがなあ。

フリーソフト開発秘話、目次
ホーム