『空欄の列を除いた数値を返す関数』(訓練中)
A列 B列 C列 D列 E列 F列 1 名称 直近 26回 25回 24回 23回 2 あ 89 80 90 91 3 い 146 135 4 う 106 104 5 え 77 ・ ・ ・
という表があります。
B2セル→89
B3セル→146
B4セル→106
B5セル→77
という様に、C列〜F列の中で、
空欄セルの列を除いた数値を
B列に返す関数が知りたいです。
どなたか教えていただけないでしょうか。
よろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
もっとスマートな方法があると思いますが B2 =BYROW(C2:F5,LAMBDA(x,INDEX(TEXTSPLIT(TEXTJOIN(",",,x),","),,1))) (あ) 2025/09/19(金) 13:47:14
B2 =BYROW(C2:F5,LAMBDA(x,LET(y,TRANSPOSE(x),TAKE(FILTER(y,y<>0),1)))) とか。 (い) 2025/09/19(金) 14:05:38
「空欄セルの列を除いた数値」じゃなく「空欄セルの列を除いた最初の数値」ということですね。 こんな書き方もあるかもしれません。 =BYROW(C2:F5,LAMBDA(r,TAKE(FILTER(r,r<>""),1,1))) (xyz) 2025/09/19(金) 14:20:10
殆ど同じでした。失礼しました。 数値限定の必要性とか最初の数値が0のケースとか つらつら考えていたら前発言を見逃していました。
(xyz) 2025/09/19(金) 14:47:32
=BYROW(C2:F5,LAMBDA(x,TAKE(TRIMRANGE(x),,1))) (d-q-t-p) 2025/09/19(金) 14:52:56
A B C D E F 1 名称 直近 26回 25回 24回 23回 2 あ 89 89 80 90 91 3 い 146 146 135 4 う 106 106 104 5 え 77 77
CSE配列式 =INDEX(C2:F2,MIN(IF((C2:F2)>0,COLUMN(C2:F2),""))-2) を入力したセル B2 のフィルハンドルを憎々し気に「エイヤッ!」とダブル クリック
オ・シ・マ・イ (Mike) 2025/09/20(土) 15:54:32
単純に B2=IF(C2<>"",C2,IF(D2<>"",D2,IF(E2<>"",E2,F2))) ↓ へコピー (単純) 2025/09/20(土) 16:38:27
皆さん教えて下さい。 Microsoft365ですと、配列数式(CSE)にしなくても基本的にはOKかと思っています。 .xlsブック(古いExcel)を除いて、依然としてCSEが必要となるケースをどなたかご存じでしたら教えて下さい。 (xyz) 2025/09/20(土) 17:11:35
捻り出すとすれば、ですが・・
CSEの特徴は 1.配列を計算対象にできる。 2.戻り値が配列の場合、表示範囲(行列数)を限定できる。
1に関しては、365では不要と思われる。 2については、365は勝手にスピルするので、表示範囲が限定出来ないとも言える。 またその副産物(?)として、指定した範囲に懸かる行や列の挿入を妨害してくれる。
(半平太) 2025/09/21(日) 12:43:34
半平太さんコメントありがとうございました。 「出力範囲を特定セルに限定したいとき」は思いつきもしませんでした。なるほどそうですね。 そういうニーズの頻度はそう高くなくてもありそうですね。(TAKE,DROPの併用と言う手段はありますけども) AIさんに聞いてみたら、FREQUENCYやLINESTなどの一部関数ではCSEが引き続き必要と回答がありました。 いえいえそんなことないでしょうと議論して、AIが誤りを認めました。 部分配列への限定といった論点は提示されませんでした。
(xyz) 2025/09/21(日) 15:45:53
TEXTSPLIT結果の先頭要素だけ欲しい
...みたいな時が私の実務の中で割と頻繁にあったりするんですが、 イメージとしてはそんな感じでしょうかね。
(ワタシm365使ってないんで想像^^;)
(白茶) 2025/09/22(月) 10:57:27
皆様のご回答のおかげで
解決できました。
ありがとうございます。
また、皆様にご回答いただいた物すべて、
試して、理解して、自分の力でできるよう、
訓練していきます。
IF(C2<>"",C2,IF(D2<>"",D2,IF(E2<>"",E2,F2)))
については、列がG,H,I…と増えていく予定なので、
今回は見送らせていただきますが、
今回以外で使える場面が来るかもしれないので、
参考にさせていただきます。
INDEX+TEXTSPLIT+TEXTJOINや
INDEX+MINという発想はでてきませんでした。
XLOOKUP、FILTERができてから、
INDEX+MATCHのようなものを使わなくなっていました…
このような発想もできるよう努力します。
ついでに知ったXMATCHについても後で訓練したいと思います。
LAMBDA
LET
は少しずつ使う様にしています。
まだまだ訓練中です。
BYROW
TAKE
TRIMRANGE
は初見なのでいろいろ試しながら訓練していきます。
本当にありがとうございました。
(訓練中) 2025/09/22(月) 11:03:36
>XLOOKUP、FILTERができてから、 XLOOKUPだけでも可能です =XLOOKUP("*?",C2:F2&"",C2:F2,"",2) (はてな) 2025/09/22(月) 11:26:02
↓コピペを省くのなら =BYROW(C2:F5,LAMBDA(x,XLOOKUP("?*",x&"",x,"",2))) (はてな) 2025/09/22(月) 11:33:46
XLOOKUP関数を使うと =XLOOKUP(TRUE,ISNUMBER(C1:F1),C1:F1,"") =XLOOKUP(TRUE,C2:F2<>"",C2:F2,"") =XLOOKUP(FALSE,ISBLANK(C3:F3),C3:F3,"") とか、いろいろ応用できて面白いですよね (´・ω・`) 2025/09/22(月) 11:36:18
白茶さんありがとうございました。 たしかにそういう機会はありそうですね。
(xyz) 2025/09/22(月) 15:17:12
余談部分が意味不明でしたでしょうから、書き直しました。
# 余談ですけど、 # Google SpreadsheetとMicrosoft365では、配列数式の限定配列の扱いが異なります。 # # ・A1セルに "a,b,c,d,e"という文字列をセットして、 # B1,C1セルを選択状態にして = split(A1,",")を入れて、CTRL+SHIFT+ENTERとすると、 # 式が # =ArrayFormula(split(A1,",")) # に変わり、B1〜F1にそれぞれの文字列が展開されてしまいます。 # ・一方で、Microsoft365 で同様にするとB1,C1セルだけに結果が返ります。 # ・たぶんこれは歴史的経緯によるものと思います。 # 過去が殆ど無いものと、過去をひきずったものとの違いでしょう。
# Google Spreadsheetにはtake関数に相当するものがなくて回答に難儀した記憶があります。 # もちろん関数を組み合わせると可能なようですが、直感的でない気がしました。 (xyz) 2025/09/22(月) 17:40:33
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.