スプレッドシートの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.co.jp/
Discussion