【Excel】LET関数を使った計算の事例

Microsoft 365の新関数「LET関数」を使った事例をいくつか紹介したいと思います。

(1) LET関数について

LET関数は、中間の計算式や値に名前(変数)を割り当てることができ、その名前を用いて計算式を書くことができます。

=LET( 変数名[name] , 変数の値[name value] , 変数を使った計算[calculation] )

 

引数は3種類あります。まず、「変数名」に変数の名前をセットし、次にその変数名にたいする「変数の値」をセットします。この「変数の値」は文字列、数値、特定のセル、数式等を指定できます。この「変数名」と「変数の値」の引数は必ずセットになります。最大126の組合せが設定可能です。最後に「変数を使った計算」を書きます。

 

=LET( テスト,100,テスト+10)

であれば、「テスト」という変数名に 100 を設定し、テスト(100)+10 の計算によって、110 が返ることになります。

ポイントは、「LET関数を使っても使わなくても最終的な計算結果は変わらない。」ということです。上記のような計算例であれば使う必要は全くありません。LET関数を使うメリットは大きく次の2つとなります。

 

1.数式の可読性の向上

長く複雑な数式になる場合、どこで何を計算しているかわかりにくくなることがあります。中間の計算に変数を使うことで可読性が向上し、数式を変更する際等にわかりやすくなります。

2.パフォーマンスの向上

ひとつの数式内に同じ式を複数回記述した場合、Excelは記述した回数分の計算を行います。LET関数で変数に数式を設定した場合、その計算は1回のみとなりますので、処理速度が速くなります。

 

次項より3つの例を説明していきますが、必ずしも上記メリットを享受できた事例とはなっていませんのでご理解ください。

 

【公式のリンク】

support.microsoft.com

 

(2) LET関数の使用例① 経営指標の計算

最初の例は、試算表数値等のデータをもとに経営指標の計算を行う場合に途中経過のまとまりを変数にいれて見易くなるようにしたものです。

下図はCCC(キャッシュ・コンヴァージョン・サイクル)を算出するため3つの指標を計算したものです。下図①(C14セル)の売上債権回転日数を例に以下説明します。

※LET関数は各変数のセット毎に数式内で改行(Alt+Enter)した方が見易くなりますので以下すべて改行した表記にしています。

f:id:shusoshin:20220324112703g:plain

売上債権回転日数 = 売上債権 ÷ 売上高 × 365(日)

※1年間で計算する場合

となりますので、各項目を変数名,変数の値に設定していきます。

売上高はC2セルにありますので、「 売上高,C2 」   とします。

売上債権は売掛金+受取手形-前受金で計算しますので「売上債権,C5+C6-C12」とします。

日数はF2セルに入力した値を参照していますので絶対参照で「日数,$F$2」とします。

「日数,365」としても問題ありませんが、期中で計算する場合、例えば第2四半期で計算する場合はF2セルを「=365/2」等とする想定でセル参照としました。

最後の変数を使った計算は設定した変数を用いて「ROUND(売上債権/売上高*日数,0)」とします。これらを合わせたものが以下数式となり、返り値の83(日)が計算されます。

=LET(
売上高,C2,
売上債権,C5+C6-C12,
日数,$F$2,
ROUND(売上債権/売上高*日数,0)
)

 

棚卸資産回転日数、③仕入債務回転日数 についての説明は省略しますが考え方は上記同様です。

下図は上記と同じ指標を計算しているものですが、計算過程を変えたものです。変数を用いた計算を2つに分割し、最初に売上債権回転率を売上高÷売上債権 で計算した後に、日数÷売上債権回転率 で最終的な売上債権回転日数を計算しています。

f:id:shusoshin:20220324112715g:plain

 

(3) LET関数の使用例② 費用の配賦計算

下図は、A部門で発生した固定費 150(C3セル)をB列の売上高を基準として各部門に配賦した計算シートです。この配賦計算にLET関数を使うことで可読性を高めています。

LET関数の内容は前項と類似していますので詳細説明は省略します。

※D4セルに入力した数式をD5~D9セルにコピーしています。

f:id:shusoshin:20220324112721g:plain

 

(3) LET関数の使用例③ 年間カレンダーデータの作成

最後は、Excelで1年間のカレンダーデータを作る場合です。(3月決算の会社の前提)。LET関数を使っていない項目もあわせて以下個別に説明していきます。

f:id:shusoshin:20220324210525g:plain

①日付(SPILL)

=LET(
基準日,DATEVALUE("2022/4/1"),
日数,365,
SEQUENCE(日数,1,基準日,1)
)
LET関数の変数を2つ設定します。基準日 には始まりの日付をシリアル値で設定します。わかりやすいようにDATEVALUE関数で日付形式の文字列をシリアル値に変換しています。日数 は1年間のカレンダーですので 365 (日)を設定します。変数を使った計算で、連続した数値の一覧を生成するSEQUENCE関数を使って1年間の日付を作ります。SEQUENCE関数の基本構文は、SEQUENCE( 行, 列, 開始, 目盛り )ですので、この行の部分に 日数を入れます。列は1列なので1、開始は2022/4/1なので 基準日を設定、目盛りは1日ずつなので 1 を設定します。

 

②曜日(SPILL)

=SEQUENCE(COUNTA(A3#),1,A3,1)

結果的に①日付と同じ計算結果を入れて、セルの書式設定→表示形式タブ→ユーザ定義を aaa として曜日にしています。ですので①日付と全く同じ数式でも問題ありませんが、A3セルの日付を参照して自動で計算されるようにしました。数式は、SEQUENCE関数のみで、第1引数の行の部分に、COUNTA(A3#) を入れることでA3セルから始まる配列の数が返りますので結果的に日付列の数と合うようになります。第3引数の開始はA3セルの日付の開始日を参照しています。

 

③年度

=VALUETOTEXT(YEAR(EOMONTH(A3,-3)))

EOMONTH関数でA列の日付に対する3ヶ月前の年月日を取得し、YEAR関数でその年のみと取得したものを年度とし、最後にVALUETOTEXTで年の数値を文字列に変換しています。※C3セルに入力した数式を最下行までコピーしています。

日付との関係の例は以下の通り。

 日付 2022/04/01 ・・ EOMONTH→ 2022/01/01  YEAR→ 2022

 日付 2023/03/31 ・・ EOMONTH→ 2022/12/31  YEAR→ 2022

 日付 2023/04/01 ・・ EOMONTH→ 2023/01/31  YEAR→ 2023

 

④四半期

=LET(
月,MONTH(A3),
IFS(
OR(月=4,月=5,月=6),"1Q",
OR(月=7,月=8,月=9),"2Q",
OR(月=10,月=11,月=12),"3Q",
OR(月=1,月=2,月=3),"4Q"
))

A列の日付の月でどの四半期に該当するか判定します。LET関数の変数は1つで、変数名 月 にMONTH関数でA列の日付から月の数値を取得します。変数を使った計算は、IFS関数とOR関数で各四半期毎に判定しています。ここは変数の月を多用していますのでLET関数を使用することによるパフォーマンス向上が効いている気がします。

※IF関数やSWITCH関数でも代用できますが各四半期毎にまとめた記述の方が可読性が高いと思いましたのでIFS関数を使用しました。

 

⑤期

=LET(
四半期,D3,
上期判定,OR(四半期="1Q",四半期="2Q"),
IF(上期判定,"上期","下期")
)

D列 四半期の結果によって、上期であるか下期であるかを判定します。LET関数の変数は2つですが、ここはこれまでと少し違った使い方をしています。まず、最初の変数:四半期はD3の値を設定、次の変数:上期判定のOR関数の中で最初の変数:四半期 を使用しました。四半期が1Q又は2Qであった場合にTRUEが返ります。最後の変数を使った数式は、IF関数で、上期判定 がTRUEであった場合は「上期」をFALSEの場合は「下期」を返すようにしました。

 

以上です。