Logical functions

NOT

Refuses 2 of 1,377 recorded calls; the rest match

Of 1,377 recorded answers (1,227 in the answer bank and 150 workbook cells), 2 do not match: 2 are refused. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicNOT
BulgarianNOT
CzechNOT
DanishNOT
GermanNICHT
GreekNOT
English (Australia)NOT
English (United Kingdom)NOT
English (United States)NOT
SpanishNO
EstonianNOT
FinnishNOT
FrenchNON
HebrewNOT
CroatianNOT
HungarianNOT
IndonesianNOT
ItalianNOT
JapaneseNOT
KoreanNOT
LithuanianNOT
LatvianNOT
NorwegianNOT
DutchNOT
PolishNOT
Portuguese (Brazil)NOT
Portuguese (Portugal)NÃO
RomanianNU
RussianNOT
SlovakNOT
SlovenianNOT
Serbian (Latin)NOT
SwedishINTE
ThaiNOT
TurkishDEĞİL
UkrainianNOT
VietnameseNOT
Chinese (Simplified)NOT
Chinese (Hong Kong)NOT
Chinese (Traditional)NOT

Names from Microsoft's support site.

What it does

NOT(logical)

NOT returns the logical complement of the truthiness of its single argument.

The rule is two steps, and both are worth naming:

  1. Truthiness. A Logical is itself. A Number is false when it is exactly 0 and true otherwise. Anything that is neither must first coerce to a number, and text that does not read as a number fails.
  2. Complement. Return TRUE if step 1 produced false, FALSE if it produced true.

NOT is the only function in Excel's logical group with a fixed arity of exactly one. It is not a reducer, so none of the scan and skip machinery of AND, OR, and XOR applies to it: there is no "ignore text in a range" rule, because there is no range scan.

Arguments

NOT(logical)

  • The argument is a value to test for truthiness, not specifically a logical value. Numbers are admissible and are tested against zero.

The commonly misunderstood point is that NOT is not a filter or a set complement. NOT(A1:A3) is not "everything except those cells"; it is a single-value test whose behaviour on a multi-cell reference is a shape question, addressed below.

Try it

Input cells (optional)

Example: {"B2": 3, "B3": 4}. A1 holds the formula. Other cells need values before a formula can read them.

Enter a formula, then calculate.

Runs locally in your browser with OneCalc. Its answer may differ from Excel. Use English function names and commas between arguments.

Quirks

Result and edge cases

Returns a Logical, or an Error.

  • Zero. NOT(0) is TRUE. This is the case people rely on for "is this blank-or-zero".
  • Any nonzero number. FALSE, including negatives and very large magnitudes. There is no tolerance band around zero.
  • Error input. Propagates.
  • Arrays. NOT is a scalar-shaped function; how a multi-cell argument is handled is governed by the lifting rules in Coercion and lifting rather than by anything specific to NOT.

Errors

ErrorCondition
#VALUE!The argument is text that does not read as a number, or is empty.
any incoming errorPropagates unchanged.

How to implement

Notes for implementers

  1. Do not share the reducer's item classifier. AND's classifier maps blank and skipped text to "contributes nothing"; NOT has no such bucket and must fail instead. Reusing one function for both is the natural refactor and it silently changes NOT's blank behaviour.
  2. The zero test must be an exact IEEE comparison against 0.0. Negative zero compares equal to zero and therefore yields TRUE — worth a vector when a suite exists.
  3. NOT has no non-finite path: its result is always a logical or an error, so the publication policy is the default one (NonFinite::Allow in the classification axes) and there is no #NUM! route.

Rust code

Show the CalcFunc source of this function

Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.

NOT · 9 lines · calc-func/src/catalogue/logical.rs on GitHub
CatalogueEntry {
    id: NOT,
    spelling: "NOT",
    notation: Notation::Call,
    arity: CallableArityShape::exact(1),
    parameters: &[Parameter::value("logical")],
    demand: ArgumentDemand::Eager,
    kernel: Kernel::Eager(not),
}
not · 17 lines · calc-func/src/catalogue/logical.rs on GitHub
/// NOT: its argument read as a logical (as IF reads its condition), reversed; the argument's
/// error is the result. An array argument, over which NOT lifts, and a callable are refused as not
/// modelled.
fn not(
    arguments: &[CalcValue],
    services: &mut EvalServices<'_>,
) -> Result<CalcValue, FunctionFault> {
    let site = Site::new(NOT, services);
    Site::finish(
        site.scalar_operands(arguments)
            .and_then(|()| not_callable(&site, 0, &arguments[0]))
            .and_then(|()| {
                let logical = site.argument(0, coerce::logical(&arguments[0]))?;
                Ok(CalcValue::logical(!logical))
            }),
    )
}

Kernels shared with other functions

Argument and result plumbing

No implementation has been published with a Handbook test suite for this function.

Version differences

The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.

Excel 16.0 buildPlatform and CPUCaptured inputs
20430Windows, 64-bit, CPU not recorded1,227

The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.

Recorded environments and comparison details.

Excel 16.0 build 20430

Windows, 64-bit, CPU not recorded

1,227 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.

Alternatives

Relationships

  • AND, OR, XOR are the variadic members of the same group; NOT is the unary one, and the asymmetry in blank handling between them is real, not an editorial simplification.
  • De Morgan's laws relate NOT to AND and OR for the well-classified cases. They do not extend to the family's #VALUE!-on-empty-scan behaviour, which has no algebraic counterpart: NOT(AND(range)) and OR(NOT-of-each) can differ when the range contains no truth values.
  • <> (FUNC.OP_NOT_EQUAL) is a comparison, not a complement, and is what readers usually want when they write NOT(a = b).
  • IFERROR and ISERROR are what readers want when they write NOT(ISERROR(...)); the double-negation idiom NOT(ISERROR(x)) is exactly ISNUMBER-style inspection and is often better written with the positive test.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents