設計書や仕様書のインデントに苦しんでいるエンジニアは
数多くいるのではないでしょうか。
私が今の現場で使っている仕様書のフォーマットは、
とにかくインデントの項目番号を振る作業がメンドくさい……
やっと重い腰を上げて、自動化できる関数を作成してみたので、
よろしければ参考にしてみて下さい。
こんなフォーマットです
私が現在使っている仕様書のフォーマットはこのようなものです。
入力するセルの列を変えることでインデント(字下げ)をする方式のものです。
スペースやタブをカチカチ打って字下げする必要がないので、便利は便利ですが、
とにかく項目番号を振るのがめんどくさい!
項目が増えれば増えるほど、番号は長くなっていくし、
仕様が変わって、最初に行う処理が増えた日には、
全ての項目番号を振り直さなければいけません。
いい加減嫌気がさしたので、自動化できる関数を作ってみました。
4種類の関数で自動化できるじゃん
蓋を開けてみれば、上記の画像のように4ブロックに分けて関数作成するだけで、自動化ができました。
まず、
A列はF列
B列はG列
C列はH列
D列はI列
をそれぞれ対象行として参照しています。
対象行に値が入力されていた場合数値を返し、
入力されていなかったら0を返すようになっています。
それではブロックごとに説明していきます。
①単純に1と0を入力
4ブロックの関数と言いましたが、実はこの部分だけ関数は必要ありません。
A2に1、B2からD2に0を入力するだけです。
あえて関数を使いたいのであれば、
A2セルに
=IF(F2<>””,ROW()-1,0)
と入力して、D2セルまでコピペして下さい。
対象行が空の場合0、
対象行に値が入力されていたら、行数マイナス1を返す関数です。
この場合、先頭に行を追加したら値がずれるので注意です。
②対象行、一つ上のセル、一つ右のセル、を参照
A3セルの数式はこちら
=IF(F3<>””,A2+1,IF(B3<>0,A2,0))
これをC17セルまでコピペして下さい。
IF文が二つ重なっているので、少しややこしいですね
内容は、
対象行に値が入っていたら一つ上のセルにプラス1
対象行が空で、一つ右が0以外の場合一つ上のセルと同じ値を返す
対象行が空で、一つ右が0の場合0を返す
というものです。
・上の値にプラス1
・上と同じ値を返す
・0を返す
という3パターンの出力が求められるので、IF文が2つ重なるようになります。
③対象行と一つ上のセルを参照
こちらはシンプルです。
対象行(I列)に値が入っていたら一つ上の値プラス1を返し、
対象行に値が入っていなかったら0を返します。
D3セルに
=IF(I3<>””,D2+1,0)
を入力して、一番下までコピペして下さい。
④算出された値をハイフン区切りで出力
最後は出力をする関数です。
C2セルに下の関数を入力して、一番下までコピペして下さい。
=IF(B2=0,A2,IF(C2=0,A2&-B2,IF(D2=0,A2&-B2&-C2,A2&-B2&-C2&-D2)))
数式自体は長いですが、内容は単純で、
項目番号が0の場合一つ左のセルまでをハイフン区切りで表示する
(0以外の値をハイフンで表示する)というものです。
完成!
あとはA列からD列を非表示にして、見た目を整えたら完成!
これで間に処理が増えても、項目番号を振り直すのは簡単です。
処理が増えた場合、追加したい箇所に行を挿入して……
関数が入力されている部分を選んで、オートフィル(右下の四角を引っ張るやつ)で
ズラーっと……
はい完成!
まとめ
いかがだったでしょうか。
まあ、ぶっちゃけ、この機能を作る手間と、手動で項目番号を振り直すのは、
どっちが楽かというと、なんとも言えませんが……笑
頻繁に修正が入るようなドキュメントだったら便利だと思います。
実際に作ってみて感じたことは、
自動化が出来る、出来ないとか、
それを作る工数がどうとかではなく、
「もっと楽に出来る方法があるんじゃね?」
ということを常に考えて、とにかくそれを実践してみることが重要なのだと思います。
結果、大した工数削減にならなかったとしても、
効率化を考える癖をつけて、失敗してもいいからやってみる、ということが
スキルアップに繋がるのではないかなーと。
ぜひ、参考にしてみて下さい!