概要
「この範囲の中で、“手入力の値だけ” 抜き出したい」
「数式と値が混ざっているけど、値セルだけ別表にしたい」
こういうときに使えるのが
NOT(ISFORMULA) を条件にした抽出です。
- ISFORMULA … そのセルが「数式かどうか」を TRUE / FALSE で判定
- NOT(ISFORMULA) … 「数式ではない(=値セル)」なら TRUE
これを FILTER などと組み合わせれば、
「値セルのみ抽出」がきれいにできます。
NOT(ISFORMULA) の基本
ISFORMULA のおさらい
まずは ISFORMULA から。
=ISFORMULA(参照)
参照したセルが数式なら TRUE
参照したセルが数式でない(手入力の数値、文字列、空白など)なら FALSE
という動きをします。
例:A2 にそれぞれ入っているとします。
=1/0(#DIV/0! になる式)=ISFORMULA(A2) → TRUE(中身は数式)
100(手入力の数値)=ISFORMULA(A2) → FALSE
#DIV/0! を「文字として」打ち込んだだけ=ISFORMULA(A2) → FALSE(数式ではない)
NOT(ISFORMULA) で「値セル」判定に変える
NOT は TRUE / FALSE を反転させる関数です。
=NOT(ISFORMULA(A2))
とすると、
A2 が数式 → ISFORMULA(A2) は TRUE → NOT で FALSE
A2 が値(または空白) → ISFORMULA(A2) は FALSE → NOT で TRUE
つまり
「数式ではないセル」(値セル)だけ TRUE
にできます。
この TRUE を「抽出条件」に使う、というのが本題です。
値セルのみ抽出の基本形
テンプレート
FILTER 関数と組み合わせると、形はこうなります。
=FILTER(抽出したい範囲, NOT(ISFORMULA(判定したい範囲)))
NOT(ISFORMULA(判定範囲)) が TRUE の行だけ、
FILTER が拾ってきてくれます。
つまり
「数式ではないセル(値セル)の行だけ」
抽出される、という仕掛けです。
1列から「値セルだけ」を抜き出す
A列の中で値セルのみを縦に抽出
例:A2:A20 に数式と値が混ざっているとします。
この中から「値セルだけ」を別の場所に一覧表示したい。
別セル(たとえば C2)にこう書きます。
=FILTER(A2:A20, NOT(ISFORMULA(A2:A20)))
動きはこうです。
A2:A20 の中で
数式セル → ISFORMULA = TRUE → NOT で FALSE → 抽出されない
値セル → ISFORMULA = FALSE → NOT で TRUE → 抽出される
結果として、値セルだけが上から詰めて並びます。
「一時的な手入力だけを集めたい」
「値を上書きしてしまったセルだけ確認したい」
といったときに便利です。
行ごと「値行だけ」を抜き出す
計算列が“値になってしまった行”を見たい
たとえば、A〜D列が表、D列が本来「数式で埋まっていてほしい列」だとします。
誰かが D列の一部を手入力で上書きしてしまったかもしれない、という状況。
「D列が値になってしまっている行だけ」を抜き出すには、こう書けます。
別セル(たとえば F2)に:
=FILTER(A2:D20, NOT(ISFORMULA(D2:D20)))
動き。
D列が数式の行
ISFORMULA(D) = TRUE → NOT = FALSE → 抽出されない
D列が値や空白の行
ISFORMULA(D) = FALSE → NOT = TRUE → 抽出される
つまり
「D列が“値セル”になっている行だけ」
が丸ごと抽出されます。
計算列の「破損行(値上書き行)」を見つけるのにとても役立ちます。
値セルだけを別表にして加工する
数式結果ではなく「手入力データ」だけを対象にしたい場合
たとえば、A2:A50 に「最終値」が入っているとして、
その中には
- 元からの手入力の値
- 数式で計算された結果
が混ざっているとします。
「手入力の値だけを別表にして、別の分析をしたい」とき。
=FILTER(A2:A50, NOT(ISFORMULA(A2:A50)))
とすれば、「人が入力した値」だけが抽出されます。
抽出した値をさらに別の式で加工しても、
「元が数式だったもの」は含まれないので、
“生データだけの分析” にも使いやすくなります。
値セルが一つもない場合の対策
FILTER の「該当なしエラー」を避ける
もし対象範囲が「全部数式」で「値セルが一つもない」場合、
NOT(ISFORMULA(範囲)) は全部 FALSE になり、FILTER は #CALC! エラーになります。
これを避けたいときは、IFERROR で包みます。
=IFERROR(
FILTER(A2:A20, NOT(ISFORMULA(A2:A20))),
""
)
値セルが1つ以上ある
→ 普通に抽出される
値セルが1つもない
→ ""(空白)を返す
という安全な動きになります。
例題
問題1
A2:A20 に数式と値が混在しています。
この中から「数式ではないセル(値セル)」だけを縦に抽出したいです。
B2 に書く FILTER × NOT(ISFORMULA) の式を書いてください。
=FILTER(A2:A20, NOT(ISFORMULA(A2:A20)))
問題2
A〜D列の表があり、D列は本来「数式で埋まっているべき列」です。
D列が“数式ではない行”(値または空白)だけを、A〜D列ごと別表に抽出したいです。
E2 に書く式を書いてください。
=FILTER(A2:D20, NOT(ISFORMULA(D2:D20)))
問題3
B2:B100 に最終結果が入っています。
この中から「手入力の値だけ」を別の列(D列)に抽出したいです。
D2 に書く FILTER × NOT(ISFORMULA) の式を書いてください。
=FILTER(B2:B100, NOT(ISFORMULA(B2:B100)))
問題4
A2:A20 の中で、値セルが一つもない場合は空白(””)を返し、
1つ以上ある場合は値セルだけを抽出したいです。
B2 に書く IFERROR と FILTER、NOT、ISFORMULA を組み合わせた式を書いてください。
=IFERROR(FILTER(A2:A20, NOT(ISFORMULA(A2:A20))), "")
問題5
B2 に数式と値が混在する可能性があります。
B2 が「数式ではないときだけ TRUE、数式のときは FALSE」を返す判定式を書いてください。
=NOT(ISFORMULA(B2))
まとめ
「値セルのみ抽出 → NOT(ISFORMULA)」のポイントは、
- ISFORMULA で「数式かどうか」を判定
- NOT で反転して「数式ではない(=値セル)だけ TRUE」にする
- その TRUE を FILTER の条件に使う
という流れです。
型としては、次の2つを覚えておくと応用が効きます。
=NOT(ISFORMULA(セル)) ' そのセルが値かどうか
=FILTER(範囲, NOT(ISFORMULA(判定範囲))) ' 値セルだけ抽出
数式と値がごちゃまぜになっていてモヤモヤする表があれば、
一度「数式セルだけ」「値セルだけ」に分けて眺めてみると、
構造も問題点もぐっと見えやすくなります。
