[[20250919133037]] 『空欄の列を除いた数値を返す関数』(訓練中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『空欄の列を除いた数値を返す関数』(訓練中)

	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


Microsoft365なら TRIMRANGEが使えるのでは?

 =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.