Excel関数 逆引き集 | 複雑文字式の分解 → LET

Excel
スポンサーリンク

概要

長い文字列式を書いていると、

・TRIM、SUBSTITUTE、LEFT、RIGHT、TEXT などがネストしまくって、もはや読めない
・ちょっと仕様変更するときに、同じ部分を何か所も直さなきゃいけない
・「この式、1か月後の自分は絶対理解できない…」

こういう“複雑な文字列式”を分解してスッキリさせてくれるのが LET 関数です。

LET は「途中結果に名前を付ける」ことで、
長い式を「意味のある部品」に分解して書けるようにする関数です。
ここでは、特に「文字列まわり」に絞って、
複雑な式を LET で分解する具体例とテンプレートを、初心者向けに解説します。


LET の基本イメージ(文字列版)

LET の形はこうです。

=LET(名前1, 値1, 名前2, 値2, …, 最後に返す式)

シンプルな文字列例でいうと、

=LET(
  s, TRIM(A2),
  UPPER(s)
)

これは

  1. s という名前で TRIM(A2) を定義する
  2. 最後に UPPER(s)(s を大文字化したもの)を返す

という意味になります。

ポイントは「一度計算した結果に名前を付けて、それを何度でも使える」ことです。
文字列処理だと、TRIM や SUBSTITUTE や LOWER/UPPER の結果を何度も使いたい場面が多いので、そこで威力を発揮します。


パターン1:同じ前処理を何度も書いている式を分解する

まず、よくある“悪い例”から。

例)A2 の文字列に対して
・前後スペースを削除
・全角スペースを半角に変換
・小文字にそろえる
・その文字数と、先頭3文字+末尾3文字を結合して表示

LET を使わないと、だいたいこんな地獄になります。

=LEN(LOWER(TRIM(SUBSTITUTE(A2," "," "))))
 & ":"
 & LEFT(LOWER(TRIM(SUBSTITUTE(A2," "," "))),3)
 & "..."
 & RIGHT(LOWER(TRIM(SUBSTITUTE(A2," "," "))),3)

同じ前処理を 3 回も書いていて、修正がつらいし、可読性も最低です。

ここで LET を使って、前処理を一か所にまとめます。

=LET(
  cleaned, LOWER(TRIM(SUBSTITUTE(A2," "," "))),
  LEN(cleaned) & ":" &
  LEFT(cleaned,3) & "..." & RIGHT(cleaned,3)
)

この式は

  1. cleaned という名前で「全部の前処理結果」を定義
  2. あとは cleaned を使って LEN / LEFT / RIGHT を書くだけ

という構造です。

「何をしているのか」が読みやすくなり、
前処理のルール変更(たとえば SUBSTITUTE を一個足す)も cleaned の定義部分だけいじれば済みます。


パターン2:長い連結式を「部品ごと」に名前を付ける

ログ用メッセージやコード生成などで、
文字列を & でつなぎまくる式も、すぐカオスになります。

例)A2:氏名、B2:日付、C2:金額
次のようなメッセージを作りたいとします。

「2026-01-06 山田太郎 さんのご利用金額は 1,500 円です。」

LET を使わない式の例はこうなりがちです。

=TEXT(B2,"yyyy-mm-dd") & " " &
A2 & " さんのご利用金額は " &
TEXT(C2,"#,##0") & " 円です。"

これでもまだ短い方ですが、「日付部分」「名前部分」「金額部分」を部品(変数)として分けると、もっと読みやすくなります。

=LET(
  d, TEXT(B2,"yyyy-mm-dd"),
  name, A2 & " さん",
  amount, TEXT(C2,"#,##0") & " 円",
  d & " " & name & "のご利用金額は " & amount & "です。"
)

d / name / amount という“日本語に近い名前”を付けることで、
後半の式が「文章」として頭に入ってきやすくなります。


パターン3:複雑な条件分岐を分解する(文字列判定)

文字列を判定して「ラベル」を返す式も、
IF や OR をネストしだすと一瞬で読めなくなります。

例)A2 の文字列について
・”OK”(大文字小文字やスペース違いは無視)なら「合格」
・”NG” なら「要修正」
・”PENDING” が含まれていれば「保留」
・それ以外は空欄

LET なしの式を無理やり書くと、こんな感じになります。

=IF(LOWER(TRIM(A2))="ok","合格",
 IF(LOWER(TRIM(A2))="ng","要修正",
 IF(ISNUMBER(SEARCH("pending",LOWER(TRIM(A2)))),"保留","")))

TRIM と LOWER を何回も書いていて、目がすべります。

LET を使うとこうなります。

=LET(
  s, LOWER(TRIM(A2)),
  IF(s="ok","合格",
    IF(s="ng","要修正",
      IF(ISNUMBER(SEARCH("pending",s)),"保留","")
    )
  )
)

ポイントは、
・最初に s として「比較用のクリーンな文字列」を確定しておく
・後は s だけを条件式に登場させる

これで「何を判定している式なのか」が一目で分かります。


パターン4:中間結果を段階的に分解して読み下せる式にする

計算+文字列+条件が混ざるときほど、LET が効きます。

例)A2:数量、B2:単価、C2:税率
次のような文字列を作るとします。

「小計:1,000 円 税込:1,100 円(税額:100 円)」

まず中間計算の式を普通に書くとこうです。

小計 = A2B2
税額 = 小計
C2
税込 = 小計+税額

LET なしで全部文字列にすると、

="小計:" & TEXT(A2*B2,"#,##0") & " 円 税込:" &
TEXT(A2*B2*(1+C2),"#,##0") & " 円(税額:" &
TEXT(A2*B2*C2,"#,##0") & " 円)"

同じ式 A2*B2 が何回も出てきて、修正しづらいですね。

LET を使うとこう整理できます。

=LET(
  qty, A2,
  price, B2,
  rate, C2,
  subtotal, qty*price,
  tax, subtotal*rate,
  total, subtotal+tax,
  "小計:" & TEXT(subtotal,"#,##0") & " 円 税込:" &
  TEXT(total,"#,##0") & " 円(税額:" &
  TEXT(tax,"#,##0") & " 円)"
)

上から順に「計算の流れ」を追えるので、
プログラムを書いている感覚に近づきます。


パターン5:文字列式の分解テンプレート

自分で複雑な文字式を LET に乗せ替えるときの“型”をまとめておきます。

  1. まず、A2 を対象にした「普通の式」を完成させる
  2. 「何度も出てくる部分」「意味のある塊」を見つける
  3. それぞれに短い名前を付けて、LET の先頭に並べる
  4. 後半の式の中で、その名前を使うように書き換える

テンプレートの形はこんな感じです。

=LET(
  base,  前処理済み文字列(TRIM, LOWER, SUBSTITUTE など),
  part1, base を使った部分処理,
  part2, base や part1 を使ったさらに別の処理,
  最後に返したい文字列(base, part1, part2 を組み合わせ)
)

例えば、

=LET(
  base, LOWER(TRIM(SUBSTITUTE(A2," "," "))),
  code, LEFT(base,3),
  tail, RIGHT(base,4),
  code & " - " & tail
)

のように、「段階」を名前で区切っていくイメージです。


例題

問題1

A2 の文字列について、
全角スペースを半角スペースに変換し、その後 TRIM した結果を s として定義し、
s の文字数を返す LET 式を書いてください。

=LET(
  s, TRIM(SUBSTITUTE(A2," "," ")),
  LEN(s)
)

問題2

A2 の文字列について、
LOWER(TRIM(A2)) を cleaned として定義し、
cleaned の先頭2文字と末尾2文字を「-」でつないだ文字列(例:ab-xy)を返す LET 式を書いてください。

=LET(
  cleaned, LOWER(TRIM(A2)),
  LEFT(cleaned,2) & "-" & RIGHT(cleaned,2)
)

問題3

A2 の文字列について、
前後スペースを削除した結果を s として定義し、
s が “OK” なら「合格」、”NG” なら「要修正」、それ以外は空欄を返す LET 式を書いてください。
(大文字小文字は区別するものとします)

=LET(
  s, TRIM(A2),
  IF(s="OK","合格",IF(s="NG","要修正",""))
)

問題4

A2 の文字列について、
LOWER(TRIM(A2)) を base として定義し、
base に “error” が含まれていれば「エラー」、そうでなければ「正常」と返す LET 式を書いてください。

=LET(
  base, LOWER(TRIM(A2)),
  IF(ISNUMBER(SEARCH("error",base)),"エラー","正常")
)

問題5

A2:数量、B2:単価、C2:税率(0.1 など)が入力されています。
次の文字列を返す LET 式を書いてください。

・まず、subtotal = A2B2、tax = subtotalC2、total = subtotal+tax を LET で定義する
・最終結果として
「小計:xxxx 円/税込:yyyy 円」
(x, y はそれぞれ #,##0 形式で TEXT)
を返す式にしてください。

=LET(
  qty, A2,
  price, B2,
  rate, C2,
  subtotal, qty*price,
  tax, subtotal*rate,
  total, subtotal+tax,
  "小計:" & TEXT(subtotal,"#,##0") & " 円/税込:" &
  TEXT(total,"#,##0") & " 円"
)

LET は「複雑な文字式を、人間が理解できる単位に分解するための道具」です。
いきなり全部を LET に書き換えなくていいので、
まずは「同じ部分を何度も書いている長い式」から、1つずつ分解してみてください。
“訳の分からない巨大式”が、“意味の分かる小さなかたまり”に変わっていきます。

Excel
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました