背中のほうからうめき声が聞こえてきた。フリーソフト開発秘話、目次へ
ところどころ聞き取れるキーワードから
「ひょっとしてこーゆーことで悩んどんじゃないか?」
というアタリがついた。
そういえば以前Shapeのオブジェクトを使ったことがあるなあ。(個人的事情からもう一回使い方を見直しておかねば、と思っていたタイミングでもあったのだ。)
手がすいていたので10分くらいでMicrosoft Excelのマクロを作って送信すると
「おお」。エクセルシートに作ったドキュメント、部署名が変わったとかなんとかで更新する必要があったようだ。セルに書かれた文字列であれば順次検索して直してゆけばいいのだが、テキストボックスに書かれたものはあちこちに散らばっている。なかなか見落しなくチェックすることができなくて、どうしようかと追い込まれていたそうな。
そんな感じがしたので、エクセルシートに貼りこまれた図形を片っ端から見て行って、書き込まれたテキストがあれば、取り出して、図形のあるセル番地とともにワークシートに一覧表として書き出す、あまりなじみのないタイプのマクロだが「できる」と知っていればそんなに難しいものでもない。
ところが何度か動かすとやがて落ちた。たまたま図形の中に属性としてテキストを持っていない画像が混じっていたそうな。めんどくさいので例外処理で回避する。「これは便利だ、漏れがないかのチェックがものすごく楽になる」という感謝の声が耳からは聞こえたが、なんとなく「作った一覧表で修正したら元の図形のテキスト部分に反映させてくれるようにならないかなあ」というテレパシーが発信されているようなので、自席に戻って追加のマクロを書いた。そうなると、修正後のテキストをどこに書き戻すか、誤解のないようにしなければならないから、ワークブック名とワークシート名は持ってないといけない、と小一時間。もちろん書き戻しもできるようになったりして、うん、これで実用になる。
しかし冒頭に書いたように「うめき声」が聞こえてくるというのは尋常ではない。尋ねてみるとものすごく量が多いのだそうだ。ついでに言うと単なるテキストボックスだけが問題ではないようだ。これからフローチャートなんかも直さなきゃいけないそうで、図形一般が対象になる。(Microsoft Excelで作っているらしい。Visio買うとか言ってなかったか?)ならば図形の種類も押さえとく必要があるな、図形の種類は数字で戻ってくるので読んでわかるよう日本語で表示しないと、数字と図形名の対比表がないかWebで探したりなんかして、30分。
動くようになったので提供した。そろそろ怒られそうだ。「こんなにあっさりできるのなら、なんで今まで言ってくれなかったんですか?」これはまだいい、そのうち「やりがいがなくなってきたじゃないですか」という怨嗟まで聞こえてきそうだ。(「簡単になりすぎてやりがいがない」といわれたこと複数回あります。)
もっともその心配は今回についてはなさそうだ。本当に切羽詰まっていたみたい。素直に感謝してくれる。となるともう少し改良が必要だな。量が多いとなると、パフォーマンスを気にする必要がある。また作業中に混乱しないように、わかりやすさにも配慮する必要がある。
図形内のテキストの一覧表シート、最初は、チェック対象の各ワークブックに付属させ、シートごとに1枚つくり、ほかのシートを扱う際は破棄して作り直していたのを、後に残らないのを嫌い形式を変えることに。一覧表はチェック対象ブックにかかわらず、マクロを持ったワークブックに持たせて、かつ今までのデータの下に追記するようにした。
そうなると図形を一つ読むごとに集計シートに書き込んでいったのではパフォーマンスに問題が出るので、構造体の動的配列を作ってメモリ上に保持、1シート全部読み終わってから集計シートにまとめて書き込む。ただし同じブック&同じシートを2回目に扱った場合は以前のレコードを削除することによって単純再実行を可能にする。テキスト部分を修正したい場合は修正がないものも全部書き戻すという手抜き仕様だったのを、修正があったものだけ、とした。修正の有無を判断する手段として当初は、ワークシートマクロのChangeイベントを使ってセルに色を塗っていたが、レコードを消す度にそのイベントが発生し、つまり行を削除するとまっ黄色。これでは使えない。それに無茶苦茶重くなる。
隣のセルに修正前の値を入れておいて、フォントの色や列を隠すの手段で見えなくして、も考えなくはなかったがユーザーが混乱しそうである。そこでやむなく採用した手段はデータを入れる際に条件付き書式を設定。そこにセルに入れるテキストを全部埋め込んで「これと違ったら黄色」と表示するという力技。(条件付き書式の「等しくない」は改行の有無もチェックしてくれるようだ。)
さてこれで、と思って動かしたら黄色に塗られているはずのセルが全部空振り。あれ、さっきinterior.colorindexで判断したらちゃんと対象にしてくれたのに。どうやらセルの書式設定でついた色はセルのプロパティには反映されてないようだ。
しかたねえ!かつてはベンチプレス120kgを上げていた腕力は伊達ではない。条件付き書式の条件を読みだして・・・、そろそろリンゴを握りつぶしてジュースが作れそうな力技だ。あと皆さんが不用意にセルの値を変更しないようにと丹念にセルの属性を定義して、シートを保護して・・・いつもながら誰でも使えるようにというのは苦労する。
さらには、一覧表にある図形名をダブルクリックすると、元のブックを探してシートを開いて、該当図形を選択してくれる、という機能まで作りこんだ。
いい気持ちになっていると「グループ化した図形は読めない」事に気が付いた。
グループ解除して読み込んで、再度グループ化して、そのままだとグループ名が変わってしまい、グループ化された図形がさらにグループ化されていた場合に(当然再帰呼び出しで対応してます)見失うので名前を元に戻して・・・さらっと書いてますが普通の人なら気が遠くなったまま戻ってこれないような試行錯誤の結果です。最初のバージョンは10分でできたはずが、使いやすさを追及したりグループ化に対応したりすると、3、4日にわたり仕事の合間がつぶれることになった。うめき声を上げていた人たちに「ツールの愛称つけてくれ」と頼んでいるのだが、目の前の仕事が超大変らしく、なかなかかわいい名前を作ってくれないのが、ちょっとだけ不満。
さて、「グループ化した図形」にどうしてここまでこだわっているかというと、別の用途を考えているからだ。世の中にはオフィスのレイアウト図をMicrosoft Excelでつくっている会社がそこそこあると思う。そのとき机やキャビネットを図形で作って並べているところも決して少なくはないだろう。グループ化するとこれを「重ねる」ことができる。例えば机を同じ大きさの四角形3つを完全に重ねて作る。一番上の図形に座っている人の名前をテキストで入れる。この図形についてはたとえ白であっても色を塗って下の文言を上からは見えないようにしておこう。で一つ下に「鍵番号」を一番下に「机の型名」をテキストで入れる。そしてこの3つをグループ化。これでコピーしてあちこちに持っていき、レイアウトを作る。
レイアウト図のまま見れば、二層目、三層目の文言は見えない、しかしこのツールを使えば下の層まで一覧表の形で見えるようになる。変更があれば書き戻せる。机の型番号と鍵番号と座っている人がひとまとまりで扱えるので、多分管理は楽になる。
さらに売り場のレイアウトをワークシート上に作っている場合なんかだと、棚の番号、型名、積んでいる商品名、場合によっては商品の(適正)陳列数もレイアウト図に持たせることが可能で、それを一覧化して、さらには一括で修正することができる。小売業とは接点がないので直接意見を聞いたわけではない。でも、これができるってかなり便利じゃないのかな。これを昔の私が与えられればすぐにマシンルームのレイアウト図を作り直し始めたであろう。四角形1個で示していたラックを段ごとに四角形を重ねてラック全体でグループ化するのよ。表示したときに見えるのはラックの番号だけ、しかし図形としては1段目にはディスクが入って、2段目にハブが入って、三段目にサーバー本体が入って、が記録されている。ラックの配置図とラックごとの機器収納状況が一元的ンまとまってメンテナンス性が圧倒的によくなる。ちなみに図形に入ったテキストは最上段のラック番号を除いて、その図形に収まる必要はまるでない。だから「どーやってこの文字数を収めるか」なんてことに悩む必要はない。どうせ上からは見えないんだもん。一覧表を作った時に読めれば十分なのである。
なので最終的には、グループ化された状態のままで(いちいち解除せずに)読み書きができるようにした。速度、安定度とも高まったと思う。だからといって最初に書いたグループ解除→情報読み取り→グループ化、のルーチンを書いたのが無駄であったというわけではない。なぜなら「グループ名、図形名はマクロで書き換えられる」ことがわかったからだ。つまりさきほど書いたレイアウト図の机のグループ名を例えば「事務机1」「陳列棚A-1」「ラック1」と任意につけることが可能だとわかったからだ。これで使い勝手は飛躍的に高まる・・・ような気がする。