
ExcelのFORMULATEXT & ISFORMULA — セル内の数式を読み取り、監査する
FORMULATEXT(reference) はセルの数式をテキストとして返し、ISFORMULA(reference) はセルが数式を保持していれば TRUE を返します。考え方の軸——これらはシートを監査する関数であって、計算はしない——、数式でないセルで返る #N/A、すべての数式セルを強調表示する条件付き書式のテクニック、そして「数式の表示」の代わりにこれらを使うべき場面を解説します。

FORMULATEXT(reference) はセルの数式をテキストとして返し、ISFORMULA(reference) はセルが数式を保持していれば TRUE を返します。考え方の軸——これらはシートを監査する関数であって、計算はしない——、数式でないセルで返る #N/A、すべての数式セルを強調表示する条件付き書式のテクニック、そして「数式の表示」の代わりにこれらを使うべき場面を解説します。

CELL(info_type, [reference]) はセルの値ではなく、そのメタデータ——アドレス、行、列、表示形式、内容の種類、ブックのファイル名——を返します。考え方の軸、なぜ info_type がキーワード文字列なのか、いまも唯一無二に得意な仕事(ファイルパスとシート名の取得)、そして結果が誤って見える再計算の罠を解説します。

TYPE(value) はセルが保持する値の種類をコードで返します——1 数値、2 テキスト、4 論理値、16 エラー、64 配列——、N(value) は値を数値に強制変換します。考え方の軸、TYPE が「文字列として保存された数値」をどう突き止めるか、なぜ N は何を渡してもエラーにせず 0 を返すのか、そして数式の中にコメントを埋め込む古典的な N() のテクニックを解説します。

SWITCH は1つの式を「完全一致する値のリスト」と照合し、最初に一致した結果を返します:=SWITCH(expr, val1, res1, val2, res2, default)。考え方の軸、なぜ完全一致だけなのか(そしてそれが SWITCH と IFS の境界線である理由)、default 引数を忘れると #N/A が返る罠、範囲を扱う SWITCH(TRUE()) のテクニック、そしてネストした IF の代わりに使うべき場面を解説します。

CHOOSE はリストから位置でN番目の項目を返します:=CHOOSE(index_num, value1, value2, …)。考え方の軸、なぜ一致ではなく位置で選ぶのか(CHOOSE と SWITCH の境界線)、インデックスが範囲外のときに出る #VALUE!、そして使われていない必殺技——範囲まるごとを返してシナリオを切り替えたり、左方向ルックアップのために列を並べ替えたりする使い方——を解説します。

MAXIFS と MINIFS は、1つ以上の条件を満たす値のうち最大・最小のものを返します:=MAXIFS(max_range, criteria_range1, criteria1, …)。考え方の軸、SUMIF ユーザーがつまずく引数の順序、なぜ古い {=MAX(IF())} 配列数式を置き換えるのか、そして一致する行がないときに返る「静かな 0」の罠を解説します。

COUNTは数値だけを、COUNTAは空でないセルすべてを、COUNTBLANKは空のセルを数えます——1つの「いくつ?」に見えて、実は3つの別々の問いに3つの関数が答えます。テキストのIDが並ぶ列に =COUNT を使うと0が返る理由、空文字列を返す数式までCOUNTAが数えてしまう理由、そしてCOUNTAとCOUNTBLANKの合計が必ずしもセル総数と一致しない理由を解説します。

COUNTIFは1つの条件を満たすセルを数えます——`=COUNTIF(範囲, 条件)`——そして条件とは、テキストで書いた小さなテストです。演算子を引用符の中に入れる理由、& でセルの値をしきい値にする方法、テキスト照合のワイルドカード、長い数値での15桁の罠、そしてCOUNTIFSへ切り替えるべきタイミングを解説します。

Excelには COUNTUNIQUE 関数がないため、重複を除いた値を数える方法は2つに分かれます。今どき(365/2021)の `=COUNTA(UNIQUE(範囲))` と、古いバージョン向けの昔ながらの `=SUMPRODUCT(1/COUNTIF(範囲,範囲))` です。空白が数を1増やす理由、FILTER で空白を除く方法、昔ながらの式が #DIV/0! を出す理由、そして重複を除いた値と1回だけ現れる値の違いを解説します。

TRIM と CLEAN はどちらも取り込んだテキストから見えないゴミを取り除きますが、対象が違います。TRIM は余分なスペース(ASCII 32)を、CLEAN は印刷されない制御文字(0〜31)を削除します。どちらも Web や PDF の貼り付けで紛れ込む改行なしスペース CHAR(160) は消せません。これが『TRIM が効かない』最大の原因です。考え方と、すべてを一括で片づける唯一の数式を解説します。

UPPER・LOWER・PROPER はテキストの大文字小文字を変えますが、Excel における大文字小文字は表示やエクスポートの問題であって、照合の問題ではありません。= 比較も VLOOKUP も、そもそも大文字小文字を区別しないからです。本当の落とし穴は PROPER です。すべての単語の先頭を大文字にするため、McDonald を Mcdonald に、iPhone を Iphone に壊してしまいます。大文字小文字が本当に効いてくる場面と、PROPER が仕上げではなく出発点にすぎない理由を解説します。

LEN はセル内の文字数を数えますが、その真価は診断にあります。末尾のスペースや印刷されない文字まで含めてすべての文字を数えるため、『Apple』に見えるセルが実は 6 文字の『Apple 』であることを LEN が証明してくれます。検証、LEN 引く LEN の出現回数カウント術、動的な抽出、そして LEN が表示形式を無視する理由を解説します。

VLOOKUP はテーブルの左端の列を上から下へ探し、そこから右へN列数えるだけ——その一方通行の設計こそ、すべてのバグの元凶です。なぜ第4引数(range_lookup)はほぼ常に FALSE でなければならないのか、なぜ VLOOKUP は左を見られないのか、なぜ列番号をベタ書きすると列を挿入した瞬間に静かに壊れるのか、そして「見つからない」を意味する #N/A の直し方を解説します。

INDEX と MATCH は検索を2つの仕事に分けます:MATCH が位置を見つけ(「どの行?」)、INDEX がその位置の値を返します(「そこに何がある?」)。検索と取得を切り離すことこそ、INDEX/MATCH に VLOOKUP が欠くすべてを与えます——右と同じくらい簡単に左を見て、挿入された列に耐え、真の二次元検索をこなします。パターン、match_type の罠、そしてそれでも XLOOKUP に勝つ場面を学びましょう。

HLOOKUP は VLOOKUP を90度回転させたもの——最初の行を探して下へ読みます。LOOKUP は VLOOKUP の先祖で、その致命的な欠陥は完全一致オプションがないこと:常に近似し、ソート済みデータを要求します。水平レイアウトが HLOOKUP を正解にする場面、古典的な LOOKUP(2,1/…) の技が今も古いシートに現れる理由、そしてなぜ両者がほぼ XLOOKUP に道を譲るのかを学びましょう。

AND と OR は判断をしません——複数の TRUE/FALSE 判定を1つの結論にまとめ、それを IF やルールやフィルターへ渡すだけです。なぜ AND は IF の第1引数の中に入れる(ネストしたIFを包むのではなく)べきなのか、素の =AND(...) がなぜ TRUE という文字を表示するだけなのか、なぜ Excel はすべての引数を評価する(ショートサーキットしないので #DIV/0! を起こしうる)のか、そして配列マスクの +/* に切り替えるのはいつかを解説します。

NOT は1つの TRUE/FALSE の結論を反転し、XOR は AND や OR では表せない排他的論理和です。なぜ NOT は引数をちょうど1つしか取らない(だから複合条件には NOT(AND(...)) と書く)のか、NOT が実は <> の変装にすぎないのはいつか、ド・モルガンの法則こそ NOT の真の武器である理由、そして誰も警告しない XOR の意外な点——入力が3つ以上だと「ちょうど1つ」ではなく TRUE の個数が奇数のとき TRUE を返す——を解説します。

IS ファミリーはセルを調べて TRUE/FALSE の結論を返します——分類はしますが、決して変換はしません。なぜ ISBLANK は「空に見える」より厳密なのか(数式の空文字列は空白ではない)、なぜ ISERROR は本物のバグを隠し ISNA や IFNA の方がたいてい安全なのか、なぜ IF(ISERROR(x),…,x) は x を二度計算するのか、そして ISNUMBER の切り札——SEARCH をきれいな部分一致テストに変える——を解説します。

TEXT 関数は、書式コードを使って数値や日付を書式付きのテキスト文字列に変換します。=TEXT(1234.5,"$#,##0.00") は "$1,234.50" を返します。基本となる考え方(書式を実際の文字列に焼き込むのか、セルの表示専用の表示形式にするのか)、最大の罠(出力はテキストなので SUM が無視する #VALUE! の遠因)、数値と日付の書式コード速習、先頭ゼロとロケール、そしてセルの表示形式・CONCAT・ROUND のほうが適している場面を解説します。

VALUE は数値に見えるテキスト文字列 —— "1,234.50" や "$9.00" —— を、合計・並べ替え・グラフ化できる本物の数値に解析します。TEXT の逆関数です。基本となる考え方、現実世界での最大の原因(インポートや貼り付けの後に文字列として格納された数値)、なぜ VALUE はシステムのロケールに従うのか、そしてヨーロッパ式の "1.234,56" を NUMBERVALUE がどう解決するか、より速い数式なしの解決策(*1、二重単項マイナス、区切り位置)、そして最新の Excel が一部のテキストを暗黙変換しても SUM は決してしない理由を解説します。

Excel の日付は、実は日付書式をまとったシリアル値です。テキストとして到着した日付は、並べ替えも引き算も DATEDIF への受け渡しもできない偽者です。DATEVALUE はテキストの日付をそのシリアル値に、TIMEVALUE はテキストの時刻を 1 日の端数に解析します。基本となる考え方、テキスト日付の症状、03/04/2026 という地域依存の曖昧さの罠、日付と時刻の結合方法、DATEVALUE が文字列を解析できない場面、そして DATE(LEFT,MID,RIGHT) と区切り位置という代替手段を解説します。

INDIRECT は "A1" や "Sheet2!B3" のような文字列を、生きたセル参照に変えます。考え方の軸、最大の落とし穴(文字列は自動追従しないため、シート名を変更するとすべての INDIRECT が #REF! で壊れる)、なぜ揮発性で Excel の依存関係トレーサーから見えないのか、閉じたブックで #REF! になる罠、唯一の決定的な用途(セルに書かれたシート名から値を引く)、そしてテーブル・3D 参照・CHOOSE の方が良い場面までを解説します。

OFFSET はアンカーから決まった行数・列数だけ離れた参照を返し、必要ならブロック全体へリサイズできます。考え方の軸、なぜ値ではなく参照を返すので SUM に渡せるのか、揮発性という代償、定番の動的名前付き範囲の技とテーブルやスピル範囲が今やそれに勝る理由、端を越えると #REF! になる罠、そして肝心の判断(範囲へのインデックス取り出しには非揮発性の INDEX を使い、OFFSET は本当に動く窓のためだけに残す)を解説します。

ADDRESS はセル番地のテキストを組み立てます — =ADDRESS(1,1) は A1 の中身ではなく、文字列 "$A$1" を返します。考え方の軸(INDIRECT の入力側の逆)、値ではなく文字列を返すという最大の誤解、$ ロックを制御する abs_num 引数、INDIRECT や OFFSET と違ってなぜ揮発性でないのか、本当の用途(MATCH でどこに値があるか報告する・INDIRECT へ渡す参照を組み立てる)、そして現代の Excel でどれほどニッチかについての率直な見解を解説します。

SUMPRODUCTは配列を要素ごとに掛け合わせ、その結果を合計します。1つのセルで内積を計算する関数です。次元不一致による#VALUE!の落とし穴、なぜANDでは真偽値配列を掛け算しORでは足し算するのか(AND()/OR()を使ってはいけない理由)、二重マイナス(--)が必要になる場面、そしてSUMIFSでは今なお手が届かない加重合計と列をまたぐORの仕事を解説します。

SUBTOTALはフィルターを認識する集計です。フィルターで非表示になった行をスキップするので、リストの末尾の数字がフィルターに合わせて更新されます。function_numの一覧表、1〜11 vs 101〜111の落とし穴(手動で行を隠しても集計が変わらない理由)、SUBTOTALが他のSUBTOTALを無視して総合計が二重計上にならない仕組み、そしてエラーをスキップできない理由 — それこそAGGREGATEが作られた目的 — を解説します。

AGGREGATEはSUBTOTALに2つの強化を加えたものです。関数が11個ではなく19個になり、エラー値・非表示行・ネストした集計を無視できるoptions引数が付きました。function_num + optionsのグリッド、最も使われていない技 — IFERRORで掃除せずに #N/A を含む列を合計する技 — そして余分なk引数を必要とする配列形式の関数(LARGE、SMALL、PERCENTILE)を解説します。

LEFT・RIGHT・MID は文字列を位置で切り出します。左から、右から、あるいは決まった場所から数えるだけ。なぜ MID は1始まりなのか、なぜ結果が常にテキストになり SUM が壊れるのか、そして位置をハードコードした式がシートの中で最も壊れやすい一行になる本当の理由を解説します。

FIND と SEARCH は、ある文字列が別の文字列の中で始まる位置を返します。これは MID や LEFT に渡すアンカーです。本当に重要な2つの違い(FIND は大文字小文字を区別しワイルドカード不可、SEARCH は区別せずワイルドカード可)、一致がないとなぜ両方とも #VALUE! を投げるのか、そして ISNUMBER(SEARCH()) の「含むか」判定テクニックを解説します。

SUBSTITUTE と REPLACE はどちらもテキストを置き換えますが、考え方が違います。SUBSTITUTE は内容で一致させ(すべての 'x' を、あるいは N 番目だけを置換)、REPLACE は位置で動きます(5文字目から9文字目を上書き)。どちらを使うか、なぜ SUBSTITUTE が大文字小文字を区別するのか、そして LEN 引く LEN の出現回数カウントのテクニックを解説します。

ROUND は格納されている値そのものを指定した小数桁に丸めますが、セルの表示形式は見た目を変えるだけです。この差が請求合計を1円ずれさせる理由、num_digits の使い分け(正・ゼロ・負)、ROUNDUP と ROUNDDOWN が ROUND とどう違うか、そしてなぜ「上下」ではなく「ゼロからの距離」で丸めるのかを解説します。

MROUND・CEILING・FLOOR は、小数の桁数ではなく、ある数の最も近い倍数 — 5セント、15分、1カートン丸ごと — に丸めます。第2引数が桁数ではなく倍数である理由、古い CEILING が負の数で #NUM! を出す理由、CEILING.MATH と FLOOR.MATH が安全な現代の選択肢である理由、そしてそれぞれをいつ選ぶかを解説します。

INT と TRUNC はどちらも小数を落としますが、INT はマイナス無限大の方向に丸め、TRUNC は単にゼロへ向けて切り落とすため、負の数で結果が分かれます。MOD は余りを返し、Excel では余りは数値ではなく除数の符号を引き継ぎます。1だけずれるワナ、日付と時刻の分離、シマ模様パターンを解説します。

IFは一つのYes/Noを問い、2つのうち1つの答えを返します。3つ目の引数を省くとFALSEが出る理由、ネストしたIFのピラミッドが2段を超えると崩れる理由(代わりにIFSやルックアップを使う)、ネストせずにAND/ORで条件をまとめる方法、IFの文字列比較が大文字小文字を無視する理由を解説します。

IFSは条件のリストを上から下へ確認し、最初に一致したものを返します。SWITCHは1つの値を複数のケースと照合します。バグの大半を生む2つの罠——IFSには既定値(else)がなく、振り分けを忘れると #N/A になること、そして先勝ちなので順序が命であること——に加え、IFS・SWITCH・ルックアップ表の使い分けを解説します。

IFERRORは数式のエラーをフォールバック値に置き換えますが、あらゆる種類のエラーを捕まえます——だから #REF! や #NAME? のような本物のバグまで静かに隠します。なぜルックアップにはたいてい IFNA が正しい道具なのか、すべてを IFERROR で包むのがアンチパターンである理由、そして XLOOKUP の if_not_found が両者に勝る理由を解説します。

SUMIFSは、すべての条件を満たした行だけを合計します。SUMIFとSUMIFSで引数の順番が逆になる理由(合計を間違える原因No.1)、セルと比較する ">"&A1 の書き方、ANDは標準でORは別という仕組み、UNIQUEで集計表を丸ごとスピルさせる方法を解説します。

COUNTIFSはすべての条件を満たした行を数えますが、条件を間違えるとエラーも出さずに「もっともらしいが間違った数」を返します。セルと比較するときは演算子を連結する正しい書き方、ANDは標準でORは別という仕組み、2つの日付の間を数える方法、そして重複を除いた数にはCOUNTIFSではなくUNIQUEが要る理由を解説します。

AVERAGEIFSはすべての条件を満たした行だけを平均しますが、1件も一致しないと(SUMIFSのように0ではなく)#DIV/0! を返し、ゼロは数えて空白は飛ばします。空集合のガード、ゼロと空白の罠、逆になる引数の順番、そして加重平均ができない理由を解説します。

LET を使えば、1 つの数式の中で名前付き変数を宣言できます。名前はペア・結果は最後という基本ルール、各値を一度しか計算しないから速い(ただ整理されるだけではない)理由、命名の落とし穴、そして 200 文字のネスト数式を LET に書き換えるべきタイミングを解説します。

LAMBDA は数式を、名前付きで再利用できる関数に変えます。VBA は不要です。裸の LAMBDA が #CALC! を返す理由、末尾カッコで呼び出すコツ、名前の管理で登録してブック全体から使う方法、そして LAMBDA が自分自身を呼び出す再帰の仕組みを解説します。

MAP, REDUCE, SCAN, BYROW, BYCOL は LAMBDA を配列全体に走らせます。マクロなしの For Each です。#CALC! を解決する BYROW の単一値ルール、REDUCE のアキュムレータパターン、各ヘルパーが返す形、そして素の SUMIFS のほうが勝つ場面を解説します。

VSTACKは範囲を縦に積み重ね、HSTACKは横に並べて、複数の表を自動更新される1つの配列に統合します。コピペなしでシートを結合する方法、サイズが不揃いだと#N/Aで埋まる理由、DROPとSORTで仕上げる方法を解説します。

SEQUENCEは数値の配列を何もないところから生み出します。フィルハンドルの代わりではなく、動的配列の連番・日付シリーズ・グリッドを支える「エンジン」です。引数の順番(行、列、開始、増分)、生きたカレンダーの作り方、#SPILL!の直し方、ドラッグやROW()を置き換える場面を解説します。

TAKEは配列の最初または最後のN行・N列を残し、DROPはそれらを取り除きます。2つで動的配列をどちらの端からも切り出せます。上か下かを決める正負のコツ、SORTと組んだ生きたTop 10、DROPでVSTACKの見出しを外す方法を解説します。

TEXTJOINは区切り文字つきのグルーガン。空白セルを勝手に飛ばしてくれます。誰もが見落とすignore_empty引数、#VALUE!を招く32,767文字の上限、CONCATや&より優れる場面、スピルした配列を1セルにまとめる方法を解説します。

TEXTSPLITは数式版の「区切り位置」。ただし結果は元データと一緒に更新される生きた配列です。列と行へ同時に分割する方法、複数の区切り文字を配列定数で渡すコツ、#SPILL!の直し方、LEFT/MID/FINDを置き換える場面を解説します。

CONCATはCONCATENATEを置き換え、範囲をまるごと一度に取れます。ただし区切り文字なし、空白もスキップしません。CONCATが勝つ場面、CONCATENATEが過去の遺物である理由、2次元範囲を行優先で読む挙動、数値書式の罠、TEXTJOINへ直行すべき場面を解説します。

FILTERは「検索」ではなく「クエリ」。条件に一致する行をすべて返し、スピルして自動更新します。AND/ORの掛け算・足し算のコツ、空の結果で出る#CALC!、#SPILL!の原因、VLOOKUPやオートフィルターからの置き換えどころを解説します。

UNIQUEは範囲から重複を除いた値を返し、自動で最新に保ちます——一度きりで破壊的な「重複の削除」ボタンとは別物。exactly_onceの落とし穴、重複しない件数の数え方、UNIQUEがほぼ常にSORTやドロップダウンの中で使われる理由を解説します。

SORT関数は元データが変わると並べ替え直す「並んだコピー」を返します——破壊的なリボンの並べ替えボタンとは別物。列インデックスのルール、複数キー並べ替え、SORTBYの出番、生きた SORT(UNIQUE(FILTER())) パターンを解説します。