LoginSignup
2
1

More than 1 year has passed since last update.

ExcelやGoogleスプレッドシートの数式を読みやすくする試み

Last updated at Posted at 2021-07-10

ある程度のベテランSEさんでも、Excelやスプレッドシートの数式を書くときは
まったく可読性を意識しないのが不思議でならないです\(^o^)/

最近スプレッドシートの数式をいじくる時間が多く、その中で
可読性・保守性を上げようと色々試す中で思いついた手法をシェアします。

・コメントを付与する
・適切なインデント(改行・適切な空白)を入れる
・関数名にロウワーキャメルケースを適用する
・ネストしたIF関数より、IFS関数を採用する

理屈より、実例を見てもらった方が早いです。

例:複数選択リスト(セミコロン区切り)の形式かをチェックする数式

修正前(理解する必要はないです。)
=IF($A3<>"",
  IF($B3<>"",
      IF($C3="","ISBLANK",IF(OR(NOT(REGEXMATCH($C3,"^(りんご|ごりら|らっぱ|;)+$")),RIGHT($C,1)=";"),1,0)),
    0),
"")

読みにくいですね。
この数式を、こんな風に書き換えてみました。

修正後1
=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から始まるメインロジックがごちゃついています。
では、こんな書き方はどうでしょう。

修正後2
=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!

参考URL

【エクセル】数式内にコメント(覚書き)を残してミス(度忘れ)を防止する方法!

ExcelのIFS関数の使い方|複数条件を満たすかどうか判定する

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1