📑

スプレッドシートのARRAYFORMULA / BYROW / BYCOLの違いをちゃんと理解する

に公開

スプレッドシートを触っていると、ARRAYFORMULAはよく使うと思います。

ただ、少し複雑なことをやろうとすると「なんか思った通りに動かない」ことが増えてきます。
その原因の大半は、ARRAYFORMULAとBYROW/BYCOLの役割の違いを曖昧に理解していることにあります。

今回はこの3つをシンプルに整理します。


結論だけ先に

まずはこれだけ覚えればOKです。

  • ARRAYFORMULA = 同じ位置同士を計算する
  • BYROW = 1行ずつ処理する
  • BYCOL = 1列ずつ処理する

まず共通のデータ

今回の例ではこのようなデータを使います。


ARRAYFORMULAは「位置対応」

例えばこれ。

=ARRAYFORMULA(A1:A + B1:B)

これは

A1 + B1
A2 + B2
A3 + B3

のように、「同じ行のセル同士」をそのまま計算しています。

つまり、

「縦方向に並んだデータを、そのまま同じ位置で処理する」

のがARRAYFORMULAです。


BYROWは「1行を1単位で処理」

例えば行ごとの合計を出したい場合。

=BYROW(A1:C, LAMBDA(r, SUM(r)))

これは内部的には

SUM(A1:C1)
SUM(A2:C2)
SUM(A3:C3)

のように動きます。

ポイントは

「1行をまとめて1つのデータとして扱う」

というところです。


BYCOLは「1列を1単位で処理」

逆に列ごとに処理したい場合。

=BYCOL(A1:C, LAMBDA(c, SUM(c)))

これは

SUM(A列)
SUM(B列)
SUM(C列)

になります。

つまり

「縦に並んだ列全体を1つの単位として扱う」

のがBYCOLです。


よくある勘違い

「複数列を扱うならARRAYFORMULA」

これは半分正しくて、半分間違いです。

例えば

  • A列とB列を足す → ARRAYFORMULA
  • 行ごとの合計(A〜C列) → BYROW

ここを間違えると、SUMがうまく動かなかったりします。


判断基準

迷ったらこれで考えるとだいたい解決します。

  • 同じ行同士の計算か? → ARRAYFORMULA
  • 1行の中で完結するか? → BYROW
  • 1列をまとめて処理したいか? → BYCOL

BYROWを使うべき具体例

ここまで読んでも「結局いつ使うの?」となりがちなので、実務でよくあるパターンをいくつか出します。


① 列が多いときの合計

例えばA〜K列まで工数が入っていて、行ごとの合計を出したい場合。

=BYROW(A2:K, LAMBDA(r, IF(COUNTA(r)=0, "", SUM(r))))

これをARRAYFORMULAでやろうとすると、

=ARRAYFORMULA(A2:A + B2:B + C2:C + ...)

のように、列が増えるたびに式を伸ばす必要があります。

BYROWなら列が増えても式はそのままです。


② 複数条件の判定(IF地獄回避)

例えば

  • B列が3以上
  • C列が5以上
  • D列が空じゃない

この条件を満たしたらOKとする場合。

=BYROW(B2:E4, LAMBDA(r,
IF(AND(INDEX(r,1)>=3, INDEX(r,2)>=5, INDEX(r,3)<>""), "OK", "")
))

ARRAYFORMULAでも書けますが、

条件が増えると可読性が一気に落ちます。

「1行をまとめて判断する」という意味ではBYROWの方が自然です。


③ SUMIF / COUNTIFを行単位でやりたい

例えば「1行の中で3以上の値だけ合計する」みたいなケース。
よくあるのはSUMIFをだだーーっと下に書いていくと思いますが、BYROWなら一発で書けます。

=BYROW(B2:E4, LAMBDA(r, SUMIF(r, ">=3")))

これはARRAYFORMULAではほぼ書けません。


④ 行の中に特定の値があるか判定

例えば「1行の中に"6"が含まれていたらNG」。
これもIF(COUNTIF をだだーっと書きがち。

=BYROW(B2:E4, LAMBDA(r, IF(COUNTIF(r, "6")>0, "NG", "OK")))

これも「横方向の判定」なのでBYROWがハマります。


⑤ 列構成が変わる可能性がある場合

後から列が増える/減る可能性がある場合もBYROWが強いです。

A〜KだったのがA〜Mになっても

=BYROW(A2:M, ...)

にするだけで対応できます。

ARRAYFORMULAで列を個別に足していると、ここが壊れます。


まとめると

BYROWが活きるのはこういうときです。

  • 横方向(1行)をまとめて扱いたい
  • 列数が可変
  • 条件が増えて式が長くなりがち

ARRAYFORMULAで無理に書いて読めなくなるくらいなら、BYROWに寄せた方がシンプルになります。

まとめ

この3つは「似た関数」ではなく、役割が違うだけです。

  • ARRAYFORMULAは「セル単位」
  • BYROWは「行単位」
  • BYCOLは「列単位」

ここが分かると、スプレッドシートの式はかなり整理されます。

無理にARRAYFORMULAで全部やろうとするより、
「どの単位で処理したいか」を先に決めるほうが楽です。

oneframe

Discussion