BYROW 関数は、表を1 行ずつ取り出して計算し、結果を縦に並べる関数です。BYCOL 関数は同じことを1 列ずつ行い、結果を横に並べます。=BYROW(B2:D6,LAMBDA(r,SUM(r))) と書くと、1 人ずつの合計点が 1 つの式で出ます。
SUM を下にコピーする代わりに 1 つの式で済み、行が増えても式を直す所は 1 か所です。この記事では、BYROW・BYCOL の基本と LAMBDA の書き方を、実際の Excel で確かめた結果で説明します。どちらも Microsoft 365 の関数です。
BYROW・BYCOL 関数の書き方
=BYROW(範囲, LAMBDA(行, 計算))
=BYCOL(範囲, LAMBDA(列, 計算))
| 引数 | 意味 |
|---|---|
| 範囲 | 計算したい表(見出しは含めない) |
| LAMBDA(r, 計算) | 1 行ぶん(BYCOL なら 1 列ぶん)を r という名前で受け取り、計算のしかたを書く |
| r(名前は自由) | 取り出した 1 行。SUM(r) ならその行の合計 |
LAMBDA の r は自分で付ける名前です。名前は 1 文字目を英字にして、r や row のように短く付けます。計算の結果は、1 行につき値 1 つにします。
1. 1 人ずつの合計点(BYROW)
B2:D6 を 1 行ずつ取り出して、SUM で合計します。
=BYROW(B2:D6,LAMBDA(r,SUM(r)))

佐藤さんは 217、鈴木さんは 213、高橋さんは 265 でした。SUM を 5 回コピーしたのと同じ結果です。
2. 1 人ずつの最高点(BYROW)
SUM を MAX に変えると、1 行ずつの最高点になります。MIN・AVERAGE・COUNT も同じように使えます。
=BYROW(B2:D6,LAMBDA(r,MAX(r)))

上から 80・90・92・81・73 になりました。
3. 科目ごとの平均(BYCOL)
BYCOL は 1 列ずつ取り出すので、科目ごとの平均が横に並びます。
=BYCOL(B2:D6,LAMBDA(c,AVERAGE(c)))

国語 72.2・数学 71.6・英語 74.2 でした。
4. 全科目 60 点以上なら合格(BYROW+IF)
1 行のいちばん低い点(MIN)が 60 以上なら「合格」とします。LAMBDA の中には IF などふつうの式を書けます。
=BYROW(B2:D6,LAMBDA(r,IF(MIN(r)>=60,"合格","不合格")))

結果は 合格 / 不合格 / 合格 / 不合格 / 不合格 でした。鈴木さん(国語 55)、田中さん(数学 48)、伊藤さん(英語 59)が不合格です。1 科目でも 60 点未満があると不合格になります。IF の使い方は IF関数の使い方で説明しています。
【実機で検証】BYROW でつまずくところ

| ためしたこと | 式 | 結果 |
|---|---|---|
| LAMBDA を使った合計(佐藤) | =INDEX(BYROW(BYROW!B2:D6,LAMBDA(r,SUM(r))),1) | 217 |
| LAMBDA を省いて SUM だけ(佐藤) | =INDEX(BYROW(BYROW!B2:D6,SUM),1) | 217 |
| SUM(B2:D6) だけだと | =SUM(BYROW!B2:D6) | 1090 |
| 1 行に 2 つ以上の値を返すと | =BYROW(BYROW!B2:D6,LAMBDA(r,r*2)) | #CALC! |
| 空白の行(B7:D7)をふくめた合計の 6 行目 | =INDEX(BYROW(BYROW!B2:D7,LAMBDA(r,SUM(r))),6) | 0 |
佐藤さんの合計は、LAMBDA を使っても(217)、BYROW(B2:D6,SUM) と関数名だけを書いても(217)同じでした。SUM・MAX などをそのまま使うだけなら、短く書けます。
SUM(B2:D6) だけでは、全員の合計 1090 が 1 つ出るだけです。1 行ずつにしたいときに BYROW を使います。
LAMBDA の結果が 1 行に 2 つ以上(配列)になると #CALC! になりました。1 行につき値は 1 つにします。空白の行は SUM で 0 になるので、範囲は表のぴったりにします。
よくある質問
BYROW が使えない(#NAME?)ときは?
BYROW・BYCOL は Microsoft 365 の関数です。Excel 2021 以前では、SUM などを 1 行目に書いて下へコピーします。
MAP 関数とのちがいは?
MAP はセルを 1 つずつ計算します。BYROW は 1 行ぶんをまとめて受け取るので、行の合計や最大のような「行の中で集計する」計算に向いています。
分類ごとにまとめたいときは?
1 行ずつではなく分類ごとに合計したいときは GROUPBY 関数を使います。

コメント