{
  "category": "Information functions",
  "display_name": "ISFORMULA",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.ISFORMULA",
  "implementation_state": {
    "answer_bank": null,
    "detail": "Recorded: 16 workbook cells.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "matches",
    "state_label": "Matches every recorded Excel answer",
    "summary": "Matches all 16 recorded answers",
    "workbook_corpus": {
      "cells": 17,
      "matched": 16,
      "pending": 1
    }
  },
  "implementations": [
    {
      "commit": "9e1884369a678158dd82d3d74188daf986995e87",
      "flavour": "excel-compatibility-candidate",
      "language": "Rust",
      "name": "CalcFunc",
      "own_code": [
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/information.rs#L103-L103",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/information.rs#L256-L281"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/aggregate::reader",
        "catalogue/aggregate::read_reference",
        "catalogue/information::unary",
        "catalogue/information::scalar",
        "catalogue/information::known",
        "catalogue/information::each",
        "catalogue/information::n",
        "catalogue/information::n_of",
        "catalogue/information::referenced"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/information.rs#L103-L103",
      "state": "matches",
      "suite": null,
      "summary": "Matches all 16 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.ISFORMULA.json",
  "name": "ISFORMULA",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n### Relationships\n\n\n- **`FORMULATEXT(reference)`** returns the formula's text where `ISFORMULA` returns a boolean.\n  They arrived together in Excel 2013 and are usually used together:\n  `IF(ISFORMULA(A1), FORMULATEXT(A1), A1)` renders a sheet's formulas alongside its constants.\n  `FORMULATEXT` returns `#N/A` where `ISFORMULA` returns `FALSE`, which is why the guard is\n  worth writing.\n- **`TYPE`** explicitly cannot answer this question; Microsoft says so on its own page.\n- **`CELL(\"contents\", ref)`** returns the value, \"not a formula\" in Microsoft's own words — the\n  same limitation stated a third time.\n- **`ISREF`** tests whether an expression *is* a reference; `ISFORMULA` tests what is stored at\n  one. Both are reference-aware and they are easy to confuse.\n- **`ISBLANK`** is the companion in the `=\"\"` diagnosis described above.\n- **`SHEET`, `SHEETS`, `CELL`, `INFO`** are the other host-backed members of the Information\n  category.\n\n\n",
    "how-to-implement": "\n### Notes for implementers\n\n\n1. **`ISFORMULA` cannot be answered from values.** It requires a workbook that stores cell\n   *content* distinctly from cell *value*. An engine whose model is \"cells hold values\" cannot\n   implement it, and should refuse rather than guess.\n2. **The reference must survive preparation unresolved.** Dereferencing loses the subject\n   entirely: the value at the cell says nothing about whether a formula produced it.\n3. **The documented `#VALUE!` is a real, reachable path**, not a fallback. It fires for a\n   defined name that is not a reference, which is a case an implementation must distinguish from\n   an unresolvable name (`#NAME?`).\n4. **Decide the multi-cell and spill cases deliberately** and record them as decisions awaiting\n   evidence; the documentation covers neither.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n\nReturns a `Logical`.\n\n- **A cell containing a constant is `FALSE`** — including a constant that was typed as the\n  result of a formula and then pasted as values, which is the workflow this function exists to\n  audit.\n- **An empty cell is `FALSE`.** It contains no formula.\n- **A cell whose formula evaluates to an error is still `TRUE`.** The formula is there; its\n  result is irrelevant. This is the property that makes `ISFORMULA` useful for auditing a broken\n  sheet — `ISERROR` finds the symptom, `ISFORMULA` finds whether there is anything to fix.\n- **A cell whose formula returns the empty string is `TRUE`**, while `ISBLANK` on it is `FALSE`\n  and it *looks* empty. The three-way disagreement between what the eye sees, what `ISBLANK`\n  says and what `ISFORMULA` says is the standard way to find `=\"\"` helper columns.\n- **A spilled cell.** The anchor of a dynamic array holds the formula; the spilled-into cells do\n  not hold formulas of their own. What `ISFORMULA` reports for a spilled-into cell is **not\n  established here**, and it is the single most interesting open question about this function on\n  a modern build.\n- **Volatility.** The function is declared `NonVolatile`, unlike `CELL` and `INFO` — editing a\n  cell's *content* is a change Excel's dependency graph tracks, so `ISFORMULA` does not need to\n  recalculate on a timer the way a formatting query does.\n\n\n\n### Errors\n\n\n- **`#VALUE!`** — documented, verbatim: \"If reference is not a valid data type, such as a\n  defined name that is not a reference, ISFORMULA returns the #VALUE! error value.\" This covers\n  a literal, a computed value, and a defined name that resolves to a constant or an expression.\n- **`#NAME?`** would arise before `ISFORMULA` runs, from an unresolvable name, in reference\n  resolution ([coercion and lifting](../model/02-coercion-and-lifting.md)).\n- **`#REF!`** likewise, from a reference whose target has been deleted.\n- **Arity** — zero arguments or two. Expected to be refused at formula entry rather than\n  evaluated ([the call pipeline](../model/03-call-pipeline.md)).\n\nNote that `ISFORMULA` is one of the few IS-named functions with a *documented* error return.\nThe classifiers have none; `ISFORMULA` has one because its argument can genuinely be of the\nwrong kind.\n\n\n",
    "sources": "- Microsoft, \"ISFORMULA function\" —\n  <https://support.microsoft.com/en-us/office/isformula-function-e4d1355f-7121-4ef2-801e-3839bfd6b1e5>.\n  Read for this page: the description, the syntax, the `reference` argument description verbatim,\n  and the `#VALUE!` remark verbatim.\n- Microsoft, \"TYPE function\" —\n  <https://support.microsoft.com/en-us/office/type-function-45b4e688-4bc3-48b3-a105-ffa892995899>.\n  Read for the remark that `TYPE` cannot determine whether a cell contains a formula.\n- Microsoft, \"CELL function\" —\n  <https://support.microsoft.com/en-us/office/cell-function-51bd39a5-f338-4dbe-a33f-955d67c2b2cf>.\n  Read for the `\"contents\"` row, \"Value of the upper-left cell in reference; not a formula.\"\n- Handbook, [the execution context](../model/04-execution-context.md) — the workbook state a\n  host query reads.\n- Handbook, [coercion and lifting](../model/02-coercion-and-lifting.md) — reference resolution\n  and its failure modes.\n\n\n",
    "version-differences": "No comparison between specific Excel builds is recorded here yet. This does not establish that all builds behave alike.",
    "what-it-does": "\n`ISFORMULA(reference)` returns `TRUE` if the referenced cell contains a formula, and `FALSE` if\nit does not.\n\nMicrosoft's description, verbatim: \"Checks whether there is a reference to a cell that contains\na formula, and returns TRUE or FALSE.\"\n\nThe important word is **contains**. `ISFORMULA` asks about the cell's *content* — is there a\nformula stored there — not about the cell's value. A cell holding `=1+1` and a cell holding the\nliteral `2` display the same thing, produce the same value everywhere downstream, and are\ndistinguished by exactly one worksheet function: this one.\n\nMicrosoft's `TYPE` page states the complementary limitation from the other side: \"You cannot use\nTYPE to determine whether a cell contains a formula.\" `ISFORMULA`, added in Excel 2013, is the\nfunction that filled that hole.\n\n\n\n### Arguments\n\n\n`reference` — required, exactly one. The published signature is `ISFORMULA(reference)`.\n\nMicrosoft's argument description, verbatim: \"Reference is a reference to the cell you want to\ntest. Reference can be a cell reference, a formula, or a name that refers to a cell.\"\n\nTwo things that sentence settles, and one it does not:\n\n- **A defined name is admissible** provided it resolves to a reference. A name that refers to a\n  constant or to a formula expression is not a reference and is an error — see \"Errors\".\n- **\"A formula\" in that list means an expression that *produces* a reference**, such as\n  `INDIRECT(\"A1\")` or `OFFSET(A1,0,0)`. `ISFORMULA(INDIRECT(\"A1\"))` asks whether `A1` holds a\n  formula, not whether `INDIRECT(...)` is one.\n- **What it does not settle** is the multi-cell case. `ISFORMULA(A1:A10)` is not addressed by the\n  documentation, and whether it spills a column of booleans on a modern build or intersects to a\n  single answer is not established here.\n\nThe argument is a **reference position, not a value position**. Handing `ISFORMULA` a computed\nvalue is a failure, not a coercion, and that is exactly what the documented `#VALUE!` condition\ncovers.\n\n\n"
  },
  "signature": {
    "display": "ISFORMULA(reference)",
    "parameters": [
      {
        "description": null,
        "name": "reference",
        "optional": false,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 1,
        "min": 1
      },
      "category": "Information functions",
      "classification": {
        "arg_preparation_profile": "RefsVisibleInAdapter",
        "coercion_lift_profile": "Custom",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "Composite",
        "host_interaction_class": "WorkbookState",
        "kernel_signature_class": "Custom",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "Composite",
        "thread_safety_class": "HostSerialized",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": "TRUE when the cell holds a formula",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Returns TRUE if there is a reference to a cell that contains a formula",
        "microsoft_url": "https://support.microsoft.com/en-us/office/isformula-function-e4d1355f-7121-4ef2-801e-3839bfd6b1e5"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "ISFORMULA"
        },
        {
          "locale": "bg-BG",
          "name": "ISFORMULA"
        },
        {
          "locale": "cs-CZ",
          "name": "ISFORMULA"
        },
        {
          "locale": "da-DK",
          "name": "ER.FORMEL"
        },
        {
          "locale": "de-DE",
          "name": "ISFORMULA"
        },
        {
          "locale": "el-GR",
          "name": "ISFORMULA"
        },
        {
          "locale": "en-AU",
          "name": "ISFORMULA"
        },
        {
          "locale": "en-GB",
          "name": "ISFORMULA"
        },
        {
          "locale": "en-US",
          "name": "ISFORMULA"
        },
        {
          "locale": "es-ES",
          "name": "ESFORMULA"
        },
        {
          "locale": "et-EE",
          "name": "ISFORMULA"
        },
        {
          "locale": "fi-FI",
          "name": "ONKAAVA"
        },
        {
          "locale": "fr-FR",
          "name": "ESTFORMULE*"
        },
        {
          "locale": "he-IL",
          "name": "ISFORMULA"
        },
        {
          "locale": "hr-HR",
          "name": "ISFORMULA"
        },
        {
          "locale": "hu-HU",
          "name": "KÉPLET"
        },
        {
          "locale": "id-ID",
          "name": "ISFORMULA"
        },
        {
          "locale": "it-IT",
          "name": "ISFORMULA"
        },
        {
          "locale": "ja-JP",
          "name": "ISFORMULA"
        },
        {
          "locale": "ko-KR",
          "name": "ISFORMULA"
        },
        {
          "locale": "lt-LT",
          "name": "ISFORMULA"
        },
        {
          "locale": "lv-LV",
          "name": "ISFORMULA"
        },
        {
          "locale": "nb-NO",
          "name": "ISFORMULA"
        },
        {
          "locale": "nl-NL",
          "name": "ISFORMULE"
        },
        {
          "locale": "pl-PL",
          "name": "CZY.FORMUŁA"
        },
        {
          "locale": "pt-BR",
          "name": "ISFORMULA"
        },
        {
          "locale": "pt-PT",
          "name": "É.FORMULA"
        },
        {
          "locale": "ro-RO",
          "name": "ISFORMULA"
        },
        {
          "locale": "ru-RU",
          "name": "ЕФОРМУЛА"
        },
        {
          "locale": "sk-SK",
          "name": "ISFORMULA"
        },
        {
          "locale": "sl-SI",
          "name": "ISFORMULA"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "ISFORMULA"
        },
        {
          "locale": "sv-SE",
          "name": "ÄRFORMEL"
        },
        {
          "locale": "th-TH",
          "name": "ISFORMULA"
        },
        {
          "locale": "tr-TR",
          "name": "EFORMÜLSE"
        },
        {
          "locale": "uk-UA",
          "name": "ISFORMULA"
        },
        {
          "locale": "vi-VN",
          "name": "ISFORMULA"
        },
        {
          "locale": "zh-CN",
          "name": "ISFORMULA"
        },
        {
          "locale": "zh-HK",
          "name": "ISFORMULA"
        },
        {
          "locale": "zh-TW",
          "name": "ISFORMULA"
        }
      ],
      "signature": {
        "display": "ISFORMULA(reference)",
        "parameters": [
          {
            "description": null,
            "name": "reference",
            "optional": false,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "ISFORMULA",
      "version_marker": null,
      "xlcall": {
        "code": "589",
        "symbol": "xlfIsformula"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/isformula-function-e4d1355f-7121-4ef2-801e-3839bfd6b1e5"
  },
  "try_it": {
    "formula": "=ISFORMULA(B2)",
    "inputs": {
      "B2": 1
    }
  },
  "url": "https://handbook.dnacalc.com/functions/ISFORMULA.html",
  "variants": [],
  "versions": []
}