エクセル入門
LAMBDA以降の新関数の使用例

Excelの初心者向け入門解説
公開日:2022-08-22 最終更新日:2022-11-03

LAMBDA以降の新関数の使用例


2022年2月頃以降にLAMBDA関数とそれに関係する多くの関数が365で順次リリースされています。


LAMBDA以降の新関数について
・LAMBDA関数とLAMBDA関数を引数に指定できるヘルパー関数群 ・TEXT処理関数 ・配列操作関数群
LAMBDA以降の新関数の問題集 ・・・ 解答は別ページになっています。
・目次 ・LAMBDA踊るぞ編 ・LAMBDA踊るぞ編2 ・SCAN編 ・MAP編 ・REDUCE編 ・山手線営業の旅編 ・BYROW,BYCOL編 ・ここからはフリー問題だよ編 ・好きな関数を使ってくれ編 ・いろんな関数を使ってね編 ・魔球編 ・豚が木に登れば落ちることもある編 ・たまには100点とってみたいものだ編 ・これは何と言う処理なんだろ編 ・数字は嫌いなのだ編 ・外堀から埋めていくぞ編 ・なぜわざわざそうしたいのか編 ・かっこつけてんじゃないよ編 ・頭の体操だけど新関数の出番はあるか?編 ・定番だけど出してなかったよね編

以下では、ツイッターでLAMBDA以降の関数を使用した例題に取り組んだものを順次追加しています。
したがって掲載している数式は特に吟味した数式であるとか、定番のやり方だという事ではありません。
新関数がでたので、練習がてら問題に取り組んだものを記事として残したものと捉えてください。


目次

LAMBDA , MAP , MAKEARRAY , TOCOL , TOROW , HSTACK
HSTACK , LAMBDA , MAP
LAMBDA
LAMBDA , MAKEARRAY , BYROW
VSTACK , HSTACK , CHOOSECOLS
TEXTSPLIT , CHOOSEROWS , TOCOL , TOROW , LAMBDA , MAKEARRAY , BYROW
TAKE
WRAPROWS , HSTACK , TOROW , MAKEARRAY , LAMBDA
TEXTSPLIT , TEXTBEFORE , EXPAND , LAMBDA , MAP
WRAPCOLS , TEXTBEFORE , TEXTAFTER , LAMBDA , MAP , BYROW , REDUCE
LAMBDA , BYCOL
LAMBDA , SCAN , MAP , CHOOSECOLS , TAKE
LAMBDA , REDUCE
LAMBDA , REDUCE
文字列を数字と数字以外で分割
LAMBDA , SCAN , REDUCE , TEXTSPLIT
縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)
・出題のツイート ・解答ツイート ・INDEX+MATCH ・FILTER+MATCH ・CHOOSEROWS+MATCH ・無理矢理XLOOKUPを使ってみたら… ・総評
↑こちらは長いので別ページです。
直積(クロス結合、交差結合)とピボット解除
LAMBDA以降の新関数の練習問題をツイッターで出題しています。今回は、直積(クロス結合、交差結合)の作成とピボット解除についての2問です。LAMBDA以降の新関数について LAMBDA以降の新関数の使用例・2つの1次元配列から、それをクロス結合した結果を返す・A列が同じ行のB列の値を連結して、A列の一意な値ととも…
↑こちらは長いので別ページです。
数列内の連続偶数のみ順序を入れ替える
・出題ツイート ・引用ツイートでの回答 ・出題者としての回答
↑こちらは別クイズで出したので別ページです。


2つの1次元配列から、それをクロス結合した結果を返す

Excel エクセル LAMBDA新関数
https://twitter.com/yamaoka_ss/status/1559069253344497664

2つの1次元配列から、それをクロス結合(2つの配列の全ての組み合わせ)した結果を返します。

数式1
=LAMBDA(x,y,
MAP(
SEQUENCE(COUNTA(x)*COUNTA(y),2),
LAMBDA(z,
IF(ISODD(z),
INDEX(x,QUOTIENT(z/2,COUNTA(y))+1),
INDEX(y,MOD(z/2-1,COUNTA(y))+1)))))(A2:A5,B1:D1)

数式2
=LET(
縦,A2:A5,
横,B1:D1,
MAKEARRAY(COUNTA(縦)*COUNTA(横),2,
LAMBDA(x,y,
IF(y=1,
INDEX(縦,QUOTIENT(x+COUNTA(横)-1,COUNTA(横))),
INDEX(横,MOD(x-1,COUNTA(横))+1)))))

どちらにしても、単純に数列を作ってINDEXで取り出すという力技になっています。
正直なんだかなーというきしかしない・・・
また、そのうち考えることにします。
とりあえず、はけたさんの数式が簡単で良さそうなので、必要な時はそれを使うという事で。

Excel エクセル LAMBDA新関数
https://twitter.com/excelspeedup/status/1558650046195048451


はけたさんが、すっきりした数式を作られました。
Excel エクセル LAMBDA新関数
https://twitter.com/excelspeedup/status/1563025515329384448


この式を縦横2項の直積だけにしました。
=LAMBDA(r,c,
LET(tc,LAMBDA(x,y,TOCOL(x&IF(y=y,""))),
HSTACK(tc(r,c),tc(c,r))
)
)(A2:A4,B1:E1)

縦*縦の場合は、引数でTOROWすれば良いと思います。
数式の中に入れることもできますが、数式が見づらくなってしまいます。

Excel エクセル LAMBDA新関数


A列が同じ行のB列の値を連結して、A列の一意な値とともに出力

Excel エクセル LAMBDA新関数https://twitter.com/yamaoka_ss/status/1559127863407742976

A列が同じ行のB列の値を連結して、A列の一意な値とともに出力してください。
※添付画像は365insiderの新関数を使って作りました。
※insider新関数使わずに作れるかは分かりません。

引用リツイートにより寄せられた回答

私の作った数式
=LET(
a,A1:A12,
b,B1:B12,
uq,UNIQUE(a),
HSTACK(
uq,
MAP(uq,LAMBDA(x,CONCAT(FILTER(b,a=x))))
))

名前定義を使わずにLAMBDA関数で再帰する方法

名前定義を使わずにLAMBDA関数で再帰する特種な方法です。

Excel エクセル LAMBDA新関数
https://twitter.com/yamaoka_ss/status/1555177131759398912

=LET(
     Z, LAMBDA(f, LET(g, LAMBDA(x, f(LAMBDA(v, LET(xx, x(x), xx(v) )))), g(g))),
     MYLOVE, Z(LAMBDA(RECUR, LAMBDA(x, IF(RIGHT(x,24)=REPT("ドドスコスコスコ",3),x&"ラブ注入",RECUR(x&IF(RANDBETWEEN(0,1),"ドド","スコ")))))),
     MYLOVE("")
)
なんと、これで再帰できているのですが・・・
ちょっと理解不能ではあります。

元記事はこちら

文字列を大文字小文字変換して大小文字の全組み合わせを出力

Excel エクセル LAMBDA新関数
https://twitter.com/yamaoka_ss/status/1561573944976556032


【エクセル問題】※新関数を覚えよう編
A1に入力されている英文字列
この文字列を大文字小文字変換して大小文字の全組み合わせを出力(出力数=2^文字数)してください。
※特に制限なし。新旧関数および作業列なんでもあり

Excel エクセル LAMBDA新関数


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

LAMBDAを使うにしても書き方は人により様々な数式になります。
副題として「※新関数を覚えよう編」なので、新関数の練習に取り組んでもらえれば良いかなという出題でした。
後は手法として、LOWER,UPPERを使う、文字コードを使う、これらは古くからあるものですね。

私の作った数式
=LET(
a,A1,
LN,LEN(a),
LW,LOWER(MID(A1,SEQUENCE(,LN),1)),
UP,UPPER(LW),
ary,IF(MAKEARRAY(2^LN,LN,LAMBDA(x,y,MID(DEC2BIN(x-1,LN),y,1)))*1=0,LW,UP),
BYROW(ary,LAMBDA(x,CONCAT(x)))
)
あまりすっきり書けていない感じもしますが、一例として。


2つのテーブルの片方しかない行を縦に連結出力

出題ツイートへのリンク
【エクセル問題】※新関数を覚えよう編
シートに「テーブル1」と「テーブル2」があります。
片方にしかない行を抽出して縦に並べてください。
idがキーで、役職、氏名は一意に決まっているものとします。
※添付参照してください。

Excel エクセル LAMBDA新関数

【追加のお題】
どっちのテーブルに存在しているかを一覧の後ろに出力。
"テーブル1","テーブル2"でも"左","右"でも分かれば良し。
※添付画像を参照

Excel エクセル LAMBDA新関数


引用リツイートにより寄せられた回答
追加お題の引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

私の作った数式
=UNIQUE(VSTACK(テーブル1,テーブル2),,TRUE)

追加のお題
=LET(
uq,UNIQUE(VSTACK(テーブル1,テーブル2),,TRUE),
HSTACK(uq,IF(COUNTIFS(テーブル1[id],CHOOSECOLS(uq,1)),"左","右"))
)

色々な人からの回答は引用リツイート等からご覧ください。
私の作成した数式は、
=UNIQUE(VSTACK(テーブル1,テーブル2),,TRUE)
まあ、この問題が答えありきだったかも…
このように、最新関数で今までは出来ない(出来てもとても難しい数式)がこうもすっきり書けるようになるんですね。


【追加のお題】
=LET(
uq,UNIQUE(VSTACK(テーブル1,テーブル2),,TRUE),
HSTACK(uq,IF(COUNTIFS(テーブル1[id],CHOOSECOLS(uq,1)),"左","右"))
)
これは書き方がいろいろありそうですね。
いずれにしても、以前に比べれば格段に簡単な数式にはなると思います。


3連単、3連複のフォーメーション買目を全て列挙する

出題ツイートへのリンク

配列関数も増えたので、ずっと懸案になっていた、
3連単
3連複
この組み合わせの列挙・組み合わせ数を返す数式に再チャレンジ
うーん、ムズイ、すっきりいかない、結局ゴリ押ししかない・・・
02,03→03,01,04→01,05,02,04 ・・・ 13通り
02,03-03,01,04-01,05,02,04 ・・・ 9通り


3連単
数式が長くて140文字超えているので貼り付けられない・・・
=LET(dl,"→",
in,IFNA(TEXTSPLIT(A1,",",dl),""),
in_1,SORT(CHOOSEROWS(in,1),,,TRUE),
in_2,SORT(CHOOSEROWS(in,2),,,TRUE),
in_3,SORT(CHOOSEROWS(in,3),,,TRUE),
in_t1,FILTER(in_1,in_1<>""),
in_t2,FILTER(in_2,in_2<>""),
in_t3,FILTER(in_3,in_3<>""),
in_12,TOCOL(in_t1&dl&TOCOL(in_t2)),
out,TOCOL(in_12&dl&in_t3),
FILTER(out,(MID(out,1,2)<>MID(out,4,2))*(MID(out,1,2)<>MID(out,7,2))*(MID(out,4,2)<>MID(out,7,2)))
)

Excel エクセル LAMBDA新関数

3連複
さらに長くなった・・・
=LET(dl,"-",
in,IFNA(TEXTSPLIT(A1,",",dl),""),
in_1,SORT(CHOOSEROWS(in,1),,,TRUE),
in_2,SORT(CHOOSEROWS(in,2),,,TRUE),
in_3,SORT(CHOOSEROWS(in,3),,,TRUE),
in_t1,FILTER(in_1,in_1<>""),
in_t2,FILTER(in_2,in_2<>""),
in_t3,FILTER(in_3,in_3<>""),
in_12,TOCOL(in_t1&dl&TOCOL(in_t2)),
out,TOCOL(in_12&dl&in_t3),
out_2,FILTER(out,(MID(out,1,2)<>MID(out,4,2))*(MID(out,1,2)<>MID(out,7,2))*(MID(out,4,2)<>MID(out,7,2))),
out_3,MAKEARRAY(COUNTA(out_2),3,(LAMBDA(x,y,MID(CHOOSEROWS(out_2,x),(y-1)*3+1,2)))),
UNIQUE(BYROW(out_3*1,LAMBDA(x,TEXT(MIN(x),"00"&dl)&TEXT(SMALL(x,2),"00"&dl)&TEXT(MAX(x),"00"))))
)

Excel エクセル LAMBDA新関数


@excelspeedupさんからご指導いただきました。
Excel エクセル LAMBDA新関数


LAMBDAで関数化・抽象化することで数式を短くかつ見やすく変更

完成した数式
3連単
=LET(dl,"→",
i,TEXTSPLIT(A1,",",dl,,,""),
c,LAMBDA(n,SORT(CHOOSEROWS(i,n),,,1)),
f,LAMBDA(a,FILTER(a,a<>"")),
p,LAMBDA(x,y,TOCOL(TOCOL(x)&dl&TOROW(y))),
t,p(f(c(1)),f(c(2))),
o,TOCOL(t&dl&f(c(3))),
m,LAMBDA(x,y,MID(o,x,2)<>MID(o,y,2)),
FILTER(o,m(1,4)*m(4,7)*m(7,1))
)

3連複
=LET(dl,"-",
i,TEXTSPLIT(A1,",",dl,,,""),
c,LAMBDA(n,SORT(CHOOSEROWS(i,n),,,1)),
f,LAMBDA(a,FILTER(a,a<>"")),
p,LAMBDA(x,y,TOCOL(TOCOL(x)&dl&TOROW(y))),
t,p(f(c(1)),f(c(2))),
o,TOCOL(t&dl&f(c(3))),
m,LAMBDA(x,y,MID(o,x,2)<>MID(o,y,2)),
q,FILTER(o,m(1,4)*m(4,7)*m(7,1)),
r,MAKEARRAY(COUNTA(q),3,(LAMBDA(x,y,MID(CHOOSEROWS(q,x),(y-1)*3+1,2)))),
UNIQUE(BYROW(r*1,LAMBDA(x,TEXT(MIN(x),"00"&dl)&TEXT(SMALL(x,2),"00"&dl)&TEXT(MAX(x),"00"))))
)


FILTER関数の出力行数・列数を指定する

出題ツイートへのリンク

【エクセル問題】※お好きな関数でどうぞ編
A:Cの表からA列=F1で絞り込み、かつ、F2行数F3列数に減らして出力してください。
ただし、F2,F3が実際より大きい数字の時にはエラーにせずA列絞り込みのまま出力してください。
※添付参照してください。

Excel エクセル LAMBDA新関数

Excel エクセル LAMBDA新関数


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

これも答えありきの問題になってしまったかもしれませんが。
数式は、
=TAKE(FILTER(A:C,A:A=F1),F2,F3)
最新関数なら、こうも簡単な数式で出来てしまうという事です。


TAKE関数が無ければ、書き方はいろいろあるにしても、
=LET(
f,FILTER(A:C,A:A=F1),
INDEX(f,SEQUENCE(MIN(F2,ROWS(f))),SEQUENCE(1,MIN(F3,COLUMNS(f))))
)
結構面倒な数式になってしまいますね。
行列数を大きい数字指定した時にエラーにしないというのが面倒ですね。


月が縦で日が横の表を、曜日(7列)で縦に折り返す

出題ツイートへのリンク

【エクセル問題】※お好みのやり方でどうぞ編
元データは、月が縦で日が横になっいます。
これを週で折り返した表に変換してください。
A2セルの値を開始日としてください。
B7セルから、月~日で下に折り返して出力です。
※添付画像参照

Excel エクセル LAMBDA新関数


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

新関数のWRAPROWSとWRAPCOLSは、使い道が難しいというか使い道が少ないかもしれないですね。
=LET(
in,TOROW(B2:AF4,1),
pd,"",
bf,MAKEARRAY(1,WEEKDAY(A2,3),LAMBDA(x,y,pd)),
WRAPROWS(HSTACK(bf,in),7,pd)
)
日付のない部分の埋め文字を指定できるようにしてみました。


開始日前の空欄部分の配列作成がちょっと面倒ですね。 IFでSEQUENCEの数字を消す(または別文字にする)でも同じです。 単に空白の配列を作成するだけなら、 T(SEQUENCE(,WEEKDAY(A2,3))) これで良さそうです。 WRAP○関数では、開始位置も指定できると便利かもしれないと思いました。


追記、
=LET(
in,TOROW(B2:AF4,1),
pd,"",
bf,EXPAND("",1,WEEKDAY(A2,3),pd),
WRAPROWS(HSTACK(bf,in),7,pd)
)
先頭の空の配列は、これで作れますね。

※上記数式は、月曜開始に対応できていませんでした。
以下では月曜開始に対応しています。
LAMBDA以降の新関数の問題集-なぜわざわざそうしたいのか編


文字列内の括弧()()の中の文字を取り出して列挙

出題ツイートへのリンク

【エクセル問題】※そろそろ最新関数覚えたかな編
A1文字列の()()の中の文字を取り出して列挙してください。
括弧の全角半角は区別せず、どっちが使われていても良しとする。

Excel エクセル LAMBDA新関数
Excel エクセル LAMBDA新関数


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

ここは無理やりにでもTEXTBEFOREかTEXTAFTERを使ってみたいという気持ちで出した問題ですね。
作成した数式は、
=LET(
ds,{"(","("},
de,{")",")"},
s,TEXTSPLIT(A1,ds),
t,MAP(s,LAMBDA(x,TEXTBEFORE(x,de,,,,""))),
FILTER(t,t<>"")
)

作成された配列の先頭(TEXTAFTERを使うなら最後)の空白や、
文字列中に括弧が対になっていない場合を考慮して、FILTERで排除するように数式を組んでみました。


表内にあるセル内改行を複数行に展開

この出題は添付画像が違っていて再ツイートしていたり、追加で難しすぎる内容も書いてしまったので、
出題内容については以下を参照してください。
【エクセル問題】※なんでもあり編
表1を表2に変換してください。
・手作業
・シート数式
・パワク
・VBA
なんでもあり、とにかく作れと言われました。
(という設定でw)
※というか、私はまだ答えを持っていないw

Excel エクセル LAMBDA新関数

Excel エクセル LAMBDA新関数

すみません、表2は規則がはっきりしないかもしれない・・・
表2は、セル内改行を縦に展開して、空欄は上セルと同値にする。


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

とりあえず作成しましたが・・・
これはもう無茶ですね。
不足部分の埋め方が、最初の改行前の文字列を埋めているのでサンプルと違ってしまった。最後の改行以降をとるのって…
VBAが良いですね。
あれ、これってパワクで出来るのですか?私は知らない・・・

=LET(in,A1:E4,
改行数,MAP(in,LAMBDA(x,LEN(x)-LEN(SUBSTITUTE(x,CHAR(10),""))+1)),
最大改行数,BYROW(改行数,LAMBDA(x,MAX(x))),
改行不足,最大改行数-改行数,
改行揃え,LAMBDA(x,y,z,x&REPT(CHAR(10)&TEXTBEFORE(x,CHAR(10),,,,x),y))(in,改行不足,改行数),
全結合,REDUCE("",TRANSPOSE(改行揃え),LAMBDA(x,y,x&IF(x="","",CHAR(10))&y)),
WRAPCOLS(TEXTSPLIT(全結合,CHAR(10)),SUM(最大改行数))
)

Excel エクセル LAMBDA新関数

不足部分を最後の改行以降で埋める場合は、ここだけ変更
TEXTBEFORE(x,CHAR(10),,,,x)

TEXTAFTER(x,CHAR(10),-1,,,x)
Excel エクセル LAMBDA新関数

一応ですが、不足部分を埋めない場合は、
TEXTBEFOREまたはTEXTAFTERの部分を消せば良いです。
というか、出題としてはこれを出した方が良かった気がしなくもない・・・
Excel エクセル LAMBDA新関数


文字列の中から1文字削除の全パターン出力

出題ツイートへのリンク

【エクセル問題】※関数は組み合わせだ編
脱字メーカー
A列の文字列から1字消した全パターンを出力して下ください。

Excel エクセル LAMBDA新関数


この問題は最新関数としての問題ではなく、旧来の関数を使っての出題でした。
普通に数式を書く場合については以下を参照してください。
脱字メーカー(文字列から1文字削除)
・出題ツイート ・引用リツイートでの回答 ・出題者としての解答


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

最後に最新関数を使って…
=LAMBDA(x,
LET(
L,LEN(x),
vs,SEQUENCE(L),
hs,SEQUENCE(,L),
ar,MID(x,vs,1),
vh,LAMBDA(x,y,IF(x=y,0,x)),
BYCOL(vh(vs,hs),LAMBDA(x,CONCAT(FILTER(ar,x)))))
)(A1)
無駄に難しくしてしまったか😅

Excel エクセル問題 脱字メーカー


分かりづらいのはこの部分でしょうか。
vh,LAMBDA(x,y,IF(x=y,0,x))
この関数にSEQUENCE(L)と,SEQUENCE(,L)、つまり縦配列と横配列を入れることで2次元の配列を作成しています。
BYCOL(vh(vs,hs),LAMBDA(x,CONCAT(FILTER(ar,x))))
この配列をBYCOLで列ごとに処理させてFILTERで0を除いています。

Excel エクセル問題 脱字メーカー


MID(x,vs,1)
これで1文字ずつの縦配列を作成。
この配列をFILTERの引数「配列」に入れて、「含む」に先の2次元の数列からBYCOLで1列ずつ取り出しながら入れていきます。
BYCOL(vh(vs,hs),LAMBDA(x,CONCAT(FILTER(ar,x))))
FILTERの結果をCOCATでつなげて完成です。

Excel エクセル問題 脱字メーカー


クロスABC分析

出題ツイートへのリンク

【エクセル問題】※最新関数「なにもわからない」編
クロスABC分析を作成
片方だけなら別セルでやっても良いけど2つは面倒…
ということで、
売上や粗利の数値範囲を指定することでABCに分けられる数式を作成してください。
※<=70%:A、<=90%:B、>90%:C
※作成方法は添付2枚目参照

Excel エクセル問題 クロスABC分析

Excel エクセル問題 クロスABC分析


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

回答者さんとのやり取りで、もう少し問題設定とか説明が必要だったと反省。
ランク境界の同値や、<=70%と<70%の違いを気にしなければこれで。
(そのような数値になる事は稀ですし問題にならない場合も多い)
=XLOOKUP(SUMIFS(B2:B11,B2:B11,">="&B2:B11)/SUM(B2:B11),{0;0.7;0.9},{"A";"B";"C"},,-1)


では作成した数式です。
=LAMBDA(x,
LET(入力,x,
順序,SEQUENCE(ROWS(入力)),
配列,SORT(HSTACK(入力,順序),,-1),
累計,SCAN(0,CHOOSECOLS(配列,1),LAMBDA(x,y,x+y)),
ABC,MAP(累計/TAKE(累計,-1,-1),LAMBDA(x,IFS(x<=0.7,"A",x<=0.9,"B",TRUE,"C"))),
SORTBY(ABC,CHOOSECOLS(配列,2)))
)(B2:B11)


SCANを使う出題が無かったので作成した問題です。

順序,SEQUENCE(ROWS(入力))
元の順序の確保。
ROW()だけでは配列を入れた時に動かないので。

配列,SORT(HSTACK(入力,順序),,-1)
対象数値と入力順で2次元配列を作成。


累計,SCAN(0,CHOOSECOLS(配列,1),LAMBDA(x,y,x+y))
出題としてはここがメインでした。
累積する時にSCANを使います。
配列の上から順次足し上げていきます。


ABC,MAP(累計/TAKE(累計,-1,-1),LAMBDA(x,IFS(x<=0.7,"A",x<=0.9,"B",TRUE,"C"))),
最初の説明の通り、XLOOKUP等の近似値では<70%になってしまうのでIFSで処理。
TAKE(累計,-1,1)はSUM(入力)でも良いが、せっかくなのでTAKEを使用。
合計は先に変数作成しておいた方が数式は読みやすいかも。


SORTBY(ABC,CHOOSECOLS(配列,2)))
元の入力順に戻して完成です。
案外この処理が面倒で、ここの工夫の仕方で大きく数式が変わって来るようです。
SCANを使う目的の問題としては大げさになってしまったかもしれません。


最後に、LAMBDAに入れるセル範囲をデータ増減に対応させるために列全体にしたい場合。
対応方法はいろいろありそうですが、
(FILTER(B:B,($A:$A<>"")*(ROW($A:$A)>1)))
今回の場合であればB列空欄があるのかないのか…
さすがにA列が空欄と言うのは無いのでこれで判定すれば良いと思います。


月利が毎月変動する月複利の計算

出題ツイートへのリンク

【エクセル問題】※最新関数そろそろお終いにしようかな編
毎月変動する利率で月複利の計算です。
日割はしません。
開始日は月初、終了日は月末が指定されるとして、月単位の計算のみ。
※利率は年利です。
※利息円未満は切り捨て。
※画像1の利率は乱数ですが一応ALTに。
※画像2は検算

Excel エクセル問題 月変動の月複利
月\年,2022,2023,2024
1,3.85%,3.98%,4.83%
2,4.65%,4.72%,4.37%
3,3.09%,4.86%,4.01%
4,4.42%,3.01%,4.80%
5,4.15%,3.46%,4.51%
6,3.35%,3.65%,3.14%
7,3.56%,4.16%,4.10%
8,3.22%,4.09%,4.33%
9,4.26%,4.69%,3.70%
10,3.62%,3.04%,3.29%
11,4.21%,4.76%,3.46%
12,3.68%,3.45%,4.51%
Excel エクセル問題 月変動の月複利


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

解答です。
なんと専用関数がありました😅
ただし期間途中で端数処理をしない方式なので、実際に使う場面においてそれで良いのかどうか、私にはそこは分かりません。
また、結局は利率配列の不要部分の処理等が必要なのでその部分が面倒になりそうです。
https://twitter.com/mikimomo_as/status/1568224255304962048


作成した数式です。
=LAMBDA(入金,金利,開始,終了,LET(
年月,EOMONTH(開始,SEQUENCE(DATEDIF(開始,終了,"m")+1)-1),
月利,INDEX(金利,MATCH(MONTH(年月),TAKE(金利,,1),0),MATCH(YEAR(年月),TAKE(金利,1),0))/12,
REDUCE(入金,月利,LAMBDA(x,y,x+INT(x*y))))
)(H2,A1:D13,G2,G3)


REDUCEを使う為の問題として作成したのですが、、、
横に年、縦に月の利率から当該月の利率を取得する部分の方が面倒な数式になってしまいます。
年月,EOMONTH(開始,SEQUENCE(DATEDIF(開始,終了,"m")+1)-1),
これで、開始日から終了日までの月末日の配列を作成しています。

Excel エクセル問題 月変動の月複利


月利,INDEX(金利,MATCH(MONTH(年月),TAKE(金利,,1),0),MATCH(YEAR(年月),TAKE(金利,1),0))/12,
開始日から終了日までの月利(年利/12)の配列を作成しています。
定番のINDEX+MATCH+MATCH
この問題でやったアンピボットを使って縦展開してからFILTERしても良いと思います。
https://twitter.com/yamaoka_ss/status/1567084986859425792


REDUCE(入金,月利,LAMBDA(x,y,x+INT(x*y)))
この問題の核心部分です。
REDUCEは配列を順次処理して合計を求めたりする場合に使います。
LAMBDA関数次第なので、数値合計だけではなくいろいろな処理を書くことができます。
こちらの解答でも使いました。
https://twitter.com/yamaoka_ss/status/1563808818433499136


レーベンシュタイン距離

深夜に突然レーベンシュタイン距離をシート関数でやろうとして悩んでいるツイートをしました。
ボケ防止深夜の頭の体操
この時点で私が書いていた数式はここまででした。
=LAMBDA(x,y,
LET(
a,SEQUENCE(1,x,0),
b,SEQUENCE(y,1,0),
IF(-a=b,0,IFS(a=0,b,b=0,a,TRUE,0))
))(5,4)
このツイートに返信を頂いて、さらに最終的に数式を作ってくれました。
(すみません、私は寝てしまいました。)
素晴らしいですね。
Excel エクセル問題 レーベンシュタイン距離
https://twitter.com/ksgiksg/status/1576673876603387904

最終的なレーベンシュタイ距離の取り出しと、外側にLAMBDAを付けて使いまわせるようにした数式が以下になります。
(内部の数式は手を付けずにそのままにしています。)
=LAMBDA(strA,strB,LET(
lenA,LEN(strA),lenB,LEN(strB),
arrA,HSTACK("",MID(strA,SEQUENCE(1,lenA),1)),
arrB,HSTACK("",MID(strB,SEQUENCE(1,lenB),1)),
初期配列,IFERROR(VSTACK(SEQUENCE(1,lenA+1,0),SEQUENCE(lenB)),0),
結果配列,REDUCE(
  初期配列,
  SEQUENCE((lenA)*(lenB)),
    LAMBDA(arr,i,
      LET(
        A,MOD(i-1,lenA)+1,
        B,INT((i-1)/lenA)+1,
        txA,INDEX(arrA,A+1),
        txB,INDEX(arrB,B+1),
        ①,INDEX(arr,B,A+1)+1,
        ②,INDEX(arr,B+1,A)+1,
        ③,INDEX(arr,B,A)+(txA<>txB),
        min,MIN(①,②,③),
        拡張,IFERROR(VSTACK(EXPAND(0,B,lenA+1,0),HSTACK(EXPAND(0,lenB-B+1,A),min)),0),
        arr+拡張
      )
    )
  ),
INDEX(結果配列,lenB,lenA)))(A1,B1)




文字列を数字と数字以外で分割

出題ツイートへのリンク

これが3年5カ月前ですか。
なんだかずいぶん前のような気がします。
「エクセル問題」等でこれの最新関数使用バージョンは既にやっていますか?
もし既に出ているなら教えてもらえると嬉しい。
もしまだなら、このまま問題として出しておきます。
※↓この時は、ちゅんさんが作ってくれました。
「数学上の未解決問題」 のノリで投げておく。
セルに文字数値の組み合わせで入っている値を、別セルに文字と数値に分割する。
ab123→abと123に分割・・・これは難しいができるはず
ab123DEF45→ab,123,DEF,45・・・これが可能できるか
ちなみに、私には無理w


引用リツイートにより寄せられた回答

筆者の解答ツイートへのリンク

私の作成した数式
=LAMBDA(セル,LET(
分割,MID(セル,SEQUENCE(LEN(セル)),1),
isN,LAMBDA(x,ISNUMBER(x*1)),
区切,SCAN(TAKE(分割,1),分割,LAMBDA(x,y,IF(isN(RIGHT(x))=isN(y),y,CHAR(1)&y))),
配列,TEXTSPLIT(CONCAT(区切),CHAR(1)),
IFERROR(配列*1,IFERROR(配列,""))))(A1)
※ツイートに収まった😇

Excel エクセル問題 数字と数字以外で分割


最後のIFERRORのネスト部分は、数値は数値としてセル出力する為と、空欄セル指定の対応です。
isNを関数にしたところ以外は特に工夫もないですね。
そのまま素直に書いてみた感じです。


REDUCEで。対して変わらない…
=LAMBDA(セル,LET(
分割,MID(セル,SEQUENCE(LEN(セル)-1)+1,1),
isN,LAMBDA(x,ISNUMBER(x*1)),
区切,REDUCE(LEFT(セル),分割,LAMBDA(x,y,IF(isN(RIGHT(x))=isN(y),x&y,x&CHAR(1)&y))),
配列,TEXTSPLIT(CONCAT(区切),CHAR(1)),
IFERROR(配列*1,IFERROR(配列,""))))(A1)


ISNUMBER使っているので全角数字が数字判定になっているのですが、これを非数値扱いにするなら、isN関数を工夫すれば良さそうですかね。isN,LAMBDA(x,AND(CODE(x)>=CODE("0"),CODE(x)<=CODE("9"))),
いろいろ工夫できると思います。

Excel エクセル問題 数字と数字以外で分割


縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)

こちらは長いので別ページです。
縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)
・出題のツイート ・解答ツイート ・INDEX+MATCH ・FILTER+MATCH ・CHOOSEROWS+MATCH ・無理矢理XLOOKUPを使ってみたら… ・総評

直積(クロス結合、交差結合)とピボット解除

こちらは長いので別ページです。
直積(クロス結合、交差結合)とピボット解除
LAMBDA以降の新関数の練習問題をツイッターで出題しています。今回は、直積(クロス結合、交差結合)の作成とピボット解除についての2問です。LAMBDA以降の新関数について LAMBDA以降の新関数の使用例・2つの1次元配列から、それをクロス結合した結果を返す・A列が同じ行のB列の値を連結して、A列の一意な値ととも…




同じテーマ「エクセル入門」の記事

TEXTSPLIT関数(列と行の区切り記号で文字列を分割)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)
LAMBDA以降の新関数の使用例
縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)
直積(クロス結合、交差結合)とピボット解除
複数の文字列を検索して置換するSUBSTITUTE
LAMBDA以降の新関数の問題集
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)
LAMBDA以降の新関数の問題と解説(配列操作関数編)
PY関数(Pythonコードをセル内で実行)


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ