ある程度のベテランSEさんでも、Excelやスプレッドシートの数式を書くときは
まったく可読性を意識しないのが不思議でならないです\(^o^)/
最近スプレッドシートの数式をいじくる時間が多く、その中で
可読性・保守性を上げようと色々試す中で思いついた手法をシェアします。
・コメントを付与する
・適切なインデント(改行・適切な空白)を入れる
・関数名にロウワーキャメルケースを適用する
・ネストしたIF関数より、IFS関数を採用する
理屈より、実例を見てもらった方が早いです。
例:複数選択リスト(セミコロン区切り)の形式かをチェックする数式
=IF($A3<>"",
IF($B3<>"",
IF($C3="","ISBLANK",IF(OR(NOT(REGEXMATCH($C3,"^(りんご|ごりら|らっぱ|;)+$")),RIGHT($C,1)=";"),1,0)),
0),
"")
読みにくいですね。
この数式を、こんな風に書き換えてみました。
=ifs( $A3 = "", "" & t(n("作業日が入力されていなかったらチェック対象外"))
, $B3 = "", 0 + n("〇〇項目がブランクの場合も、チェック対象外")
, $C3 = "", "ISBLANK" & t(n("チェック対象項目が未入力"))
, or( n("複数選択リストの形式と異なる場合は1を返す(=エラー)")
, not(regExMatch($C3, "^(りんご|ごりら|らっぱ|;)+$"))
, right($C3,1) = ";") + n("文末のセミコロンはNG") ,1
, true, 0 + n("正常ケース")
)
だいぶマシになりました。
でも、まだorから始まるメインロジックがごちゃついています。
では、こんな書き方はどうでしょう。
=ifs( $A3 = "", "" & t(n("作業日が入力されていなかったらチェック対象外"))
, $B3 = "", 0 + n("〇〇項目がブランクの場合も、チェック対象外")
, $C3 = "", "ISBLANK" & t(n("チェック対象項目が未入力"))
, not(regExMatch($C3, "^(りんご|ごりら|らっぱ|;)+$")), 1 + n("複数選択リストの形式と異なる")
, right($C3, 1) = ";") , 1 + n("文末のセミコロンはNG")
, true , 0 + n("正常ケース")
)
①チェック対象外のときや正常ケースのときは、0(またはブランク)を返す
②なにかエラーがあるときは、1を返す
という作成者の意図が伝わりやすいプログラムになったかと思います。
例2:これはどんな数式でしょう?
そうしたテクニックを踏まえた上で、ちょっとした数式を書いたのでシェアします。
何をしているか、わかりますか??
=if( countIf(A3,"*会社") & t(n("「法人格」項目に、'会社'が含まれる"))
,ifs( regExMatch(B3,"^..会社") , "前" & t(n("◯◯会社から始まる"))
, regExMatch(B3, "会社$") , "後" & t(n("~会社で終わる"))
, true , "判定不能")
, "" & t(n("個人事業主の場合は処理対象外"))
)
答えは「取引先(法人・個人混在)の名前項目から、前株・後株を判定する」でした。
いかがでしょう。以下に示した、ありがち横長記述より読めるかなって気になりませんか?
=IF(COUNTIF(A3,"*会社"),IF(REGEXMATCH(B3,"^..会社") , "前", IF(REGEXMATCH(B3, "会社$") , "後", "判定不能")),"")
さいご
「インデント」は、通常のプログラムのコーディングだけでなく、Excelなどの数式,SQL,
果ては普段のビジネスメールでも伝わりやすさ向上に効果を発揮すると思っています。
この記事を読んだ方の少しでもお役に立てれば幸いです。
以上です。Happy Coding!