TL;DR —
NOTflips one verdict:NOT(TRUE)isFALSE.XORis exclusive or — with two inputs it'sTRUEonly when they differ. Two traps do the damage. First,NOTtakes exactly one argument, so to negate a compound you must writeNOT(AND(a, b))— and its real value is De Morgan's law, rewriting a tangled condition into a simpler one. Second,XORwith 3 or more inputs does not mean "exactly one is true" — it returnsTRUEfor an odd number ofTRUEs. For "exactly one of many," count instead.NOTworks everywhere;XORneeds Excel 2013+.
=IF(NOT(ISBLANK(A2)), "Filled", "Empty") ' invert one verdict
=XOR(A2="Yes", B2="Yes") ' TRUE if exactly one says Yes
NOT and XOR are the two logical functions people reach for last and misuse
most. NOT feels redundant until you learn the one thing it's genuinely good at;
XOR feels obvious until it quietly returns the opposite of what you expected on
three inputs. Both make sense the moment you see what each is actually for.
What you'll learn
- The mental model:
NOTis a flip switch,XORis a difference detector - Why
NOTtakes exactly one argument — and the compound-condition trap - When
NOTearns its place, and when it's just<>dressed up - De Morgan's law: the rewrite that makes
NOTworth knowing XORwith two inputs ("they differ") vs the odd-count surprise on 3+- The right tool for "exactly one of many" — and it isn't
XOR
The mental model: a flip switch and a difference detector
NOT is a light switch for a single verdict. Whatever TRUE/FALSE goes in, the
opposite comes out — nothing more. XOR is a difference detector: hand it two
conditions and it answers "are these two different?"
=NOT(A2>10) ' TRUE when A2 is NOT greater than 10
=XOR(A2>10, B2>10) ' TRUE when exactly one of them is greater than 10
Keep those two pictures separate — a flip and a difference — and you'll never
confuse them with AND/OR, which combine conditions rather than invert or
compare them.
NOT takes exactly one argument (the compound trap)
NOT negates a single logical value. This is the error people hit first —
trying to negate two conditions at once:
=NOT(A2>0, B2>0) ' WRONG — too many arguments
=NOT(AND(A2>0, B2>0)) ' RIGHT — negate the combined verdict
To invert a compound condition you first combine it (with
AND/OR) into one verdict, then flip that
verdict. NOT is the last link in the chain, never the combiner.
When NOT earns its place — and when it's just <> in disguise
Here's the honest part most guides skip: a lot of NOT usage is pure noise.
NOT(A2="x") is exactly A2<>"x", only longer and harder to read:
=NOT(A2="Done") ' works, but...
=A2<>"Done" ' ...this is clearer
=NOT(A2>10) ' works, but A2<=10 is clearer
For a simple comparison, use the inverse operator (<>, <=, >=) and skip
NOT entirely. NOT earns its keep in two places: negating a function that
already returns a boolean where there's no operator to flip —
NOT(ISBLANK(A2)), NOT(ISNUMBER(A2)) (see the IS
functions) — and negating a named or compound
condition so the formula reads like a sentence. If you can express the same test
with one comparison operator, that's almost always the better call.
De Morgan's law: NOT's real superpower
The reason NOT is worth knowing at all is that it lets you rewrite tangled
logic. De Morgan's law says negating an AND turns it into an OR of the
negations, and vice versa:
' "NOT (both A and B)" is the same as "(not A) OR (not B)"
=NOT(AND(A2="EU", B2>1000)) = =OR(A2<>"EU", B2<=1000)
' "NOT (either A or B)" is the same as "(not A) AND (not B)"
=NOT(OR(Status="Void", Status="Draft")) = =AND(Status<>"Void", Status<>"Draft")
This matters because one form is almost always easier to read and to feed into
an IF or a FILTER. If
you find yourself writing "keep everything that is not cancelled and not a
draft," the AND(...<>...) form on the right is clearer than a NOT(OR(...))
wrapper. Knowing the swap lets you pick whichever reads better instead of being
stuck with the shape you first wrote.
XOR with two inputs: "they differ"
With exactly two conditions, XOR is the "one but not both" test — TRUE when the
inputs disagree, FALSE when they match:
| A | B | OR |
XOR |
|---|---|---|---|
| FALSE | FALSE | FALSE | FALSE |
| TRUE | FALSE | TRUE | TRUE |
| FALSE | TRUE | TRUE | TRUE |
| TRUE | TRUE | TRUE | FALSE |
The only row where XOR and OR disagree is the last one: OR says "yes, at
least one," XOR says "no — both is not allowed." That's the real use case —
mutually exclusive flags that should never both be set:
=IF(XOR(C2="Paid", D2="Refunded"), "OK", "Check: both or neither")
The XOR surprise: 3+ inputs means "odd count," not "exactly one"
Here is the trap that catches almost everyone. It's natural to read XOR as
"exactly one is true." With two inputs that happens to be correct. With three or
more it is not — XOR returns TRUE when an odd number of inputs are true:
=XOR(TRUE, TRUE, TRUE) ' -> TRUE (three trues = odd), NOT "exactly one"
=XOR(TRUE, TRUE, FALSE) ' -> FALSE (two trues = even)
=XOR(TRUE, FALSE, FALSE) ' -> TRUE (one true = odd)
XOR is really a parity check — it counts how many trues there are and reports
whether that count is odd. That's occasionally exactly what you want (parity bits,
toggle chains), but it is almost never what someone means when they say "exactly
one of these boxes is ticked."
For "exactly one of many," count instead
When you genuinely need "one and only one of these is true," stop using XOR
and count the trues directly — then check the count equals 1:
=(--(A2="Yes") + --(B2="Yes") + --(C2="Yes")) = 1 ' exactly one Yes
=COUNTIF(B2:D2, "Yes") = 1 ' same idea over a range
The -- coerces each TRUE/FALSE to 1/0 (the same trick that powers
SUMPRODUCT), so the sum is literally "how
many are true." Comparing that to 1 says "exactly one"; to >=1 says "at least
one" (that's OR); to =0 says "none." Counting scales to any number of
conditions and never surprises you with parity.
The judgment call
- Flip a single verdict from a boolean-returning function →
NOT(e.g.NOT(ISBLANK(...))). - Negate a simple comparison → use
<>,<=,>=, notNOT. - Simplify a tangled
NOT(AND/OR(...))→ apply De Morgan's law and keep the readable side. - Two mutually-exclusive flags →
XOR. - "Exactly one of several" → count with
--/COUNTIF, neverXORon 3+ inputs.
How ExcelMaster helps
The logic that trips people up here is subtle — "not both," "exactly one," "none
of these" — and the wrong function fails quietly, returning a plausible answer
that's wrong on the edge cases. ExcelMaster reads the rule the way you say it
— flag rows where exactly one approval box is ticked — and writes the form that
actually means that (a counted =1, not a parity XOR), or applies De Morgan's
law to turn a double-negative into something you can read six months from now.
Frequently asked questions
What does the NOT function do in Excel?
NOT reverses a single logical value: NOT(TRUE) is FALSE and NOT(FALSE) is
TRUE. It takes exactly one argument, so to negate a compound condition you wrap
it: NOT(AND(A2>0, B2>0)).
Do I even need NOT, or can I use <> instead?
For a plain comparison, <> (and <=, >=) is clearer: A2<>"x" beats
NOT(A2="x"). Use NOT mainly to flip a function that returns a boolean —
NOT(ISBLANK(A2)) — or to negate a whole AND/OR compound.
What is the difference between OR and XOR in Excel?
With two inputs they agree except when both are true: OR returns TRUE,
XOR returns FALSE. XOR is "one but not both." Use OR for "at least one,"
XOR for mutually-exclusive flags.
Why does XOR return TRUE when three conditions are true?
Because XOR tests parity, not "exactly one." It returns TRUE for an odd
number of TRUE inputs, so three trues (odd) gives TRUE. For "exactly one of
many," count the trues instead: COUNTIF(range, TRUE)=1.
How do I test that exactly one of several cells is filled?
Count and compare to 1: =COUNTIF(B2:D2, "Yes")=1, or
=(--(A2="Yes")+--(B2="Yes")+--(C2="Yes"))=1. Don't use XOR for more than two
conditions — it checks odd/even, not "exactly one."
Tested in
Tested in: Excel 365 (Windows 11) — last verified 2026-07-04.
Related guides: Excel AND & OR · Excel IS functions · Excel IF · Excel SUMPRODUCT · Excel FILTER
