La funzione AND fornisce un risultato VERO per una cella vuota, VUOTA - perché?


31

Ho una cella B2 vuota.

= ISBLANK (B2) dà VERO

Un semplice test logico su di esso restituisce FALSO

= IF (B2, TRUE, FALSE) indica FALSE

Tuttavia, se usato direttamente in un'istruzione AND, restituisce VERO

= AND (B2, TRUE) dà VERO

Naturalmente, se usato indirettamente in una dichiarazione AND, restituisce FALSO

= AND (IF (B2, TRUE, FALSE), TRUE) indica FALSE

Potresti spiegarmi per favore perché il mio Excel si comporta in quel modo?

Risposte:


41

Estratto da qui , cerca la sezione intitolata Funzioni logiche di Excel - fatti e cifre :

In Excel quando si utilizzano funzioni logiche (AND, XOR, NOT, OR), se uno degli argomenti contiene valori di testo o celle vuote , tali valori vengono ignorati.


2
Questo è fantastico da sapere !!
Gary's Student

2
Forse potresti aggiungere la regola che copre l'espressione IF(B2,TRUE,FALSE)? Inoltre, speravo che le congiunzioni e le disgiunzioni logicamente corrette (ma un po 'contro-intuitive) degli insiemi vuoti risultanti sarebbero state restituite, cioè AND(B2)sarebbero vere mentre OR(B2)erano false, ma la sperimentazione mostra che restituiscono un errore.
PJTraill

2
se uno qualsiasi ma non TUTTI gli argomenti contiene valori di testo o celle vuote, tali valori vengono ignorati. Ma se TUTTI gli argomenti contengono valori di testo o celle vuote, la funzione restituisce #VALORE!
ThunderFrame,

Buona risposta. Anche il commento di ThunderFrame è fondamentale.
Raystafarian,

C'è ancora un avvertimento. C'è una differenza tra il testo passato come riferimento di cella, al contrario del testo passato come letterale stringa. Vedi la mia risposta per i dettagli.
ThunderFrame,

6

TL; DR : è un artefatto di come Excel archivia e scambia i contenuti delle celle internamente. Una cella vuota è un VARIANTE senza valore, che si converte in FALSO a causa del modo in cui i linguaggi di programmazione trattano la verità di valori zero e diversi da zero.

Il comportamento di AND()(e di tutte le altre funzioni logiche) è di convertire entrambi gli argomenti in booleani, quindi eseguire un'operazione logica andsu di essi. È possibile staccare le copertine e dare un'occhiata a come viene definito nel modello a oggetti di Excel utilizzando il browser degli oggetti dell'editor di Visual Basic:

E nel browser degli oggetti

Si noti che restituisce a Boolean, non a Variant. Ciò significa che ad un certo punto durante il processo di valutazione della funzione, tutti gli argomenti devono essere convertiti in Booleans . Il comportamento effettivamente osservato indica che ciò viene fatto all'inizio dell'elaborazione: Excel tenta di essere intuitivo tentando di convertire tutti gli argomenti e, se ha esito positivo, di utilizzare i valori convertiti nel calcolo. Questo può essere dimostrato passando i Stringvalori "True" e "False" alla funzione:

=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.

Può anche essere dimostrato con argomenti numerici: considera qualsiasi valore diverso da zero come vero e zero come falso:

=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.

Ha lo stesso comportamento in combinazioni:

=AND("false",0) <---Results in FALSE
Etc.

Ormai dovresti avere l'immagine. Quindi, come si collega al test di una cella vuota? La risposta a questo sta nel modo in cui Excel archivia internamente il contenuto di una cella. Ancora una volta, il modello a oggetti di Excel è illuminante:

Valore della cella nel browser degli oggetti

Si noti che è una struttura COM VARIANT . Questa struttura contiene sostanzialmente 2 parti: un tipo, che indica al codice che lo utilizza come interpretarlo, e un'area dati. Una cella senza contenuto in Excel avrà un "valore" rappresentato da un Variantcon il sottotipo VT_EMPTY. Ancora una volta, questo può essere confermato con una macro:

Sub DemoMacro()
    'Displays "True" if cell A1 on the active sheet has no contents.
    MsgBox Range("A1").Value2 = vbEmpty
End Sub

Quindi cosa succede quando la ANDfunzione lo converte in a Boolean? Buona domanda! Capita di essere falso, simile a come i linguaggi di programmazione in genere trattano zero:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Puoi vedere lo stesso comportamento omettendo completamente gli argomenti:

=AND(,)

... è la stessa cosa di ...

=AND({vbEmpty},{vbEmpty})

... che è lo stesso di ...

=AND(0,0)

...che è:

=AND(FALSE,FALSE)

1
Ma l'OP riporta che un argomento con cella vuota viene trattato come Vero, non (come dici tu) Falso.
Nekomatic

@nekomatic - Ho perso quella parte. Modifica in arrivo.
Comintern,

Se A1 contiene: TRUEe B1 contiene testo preceduto da un apostrofo:, 'FALSEquindi =AND(A1,B1)restituisce VERO. mwa-ha-ha-ha.
ThunderFrame,

Non la risposta corretta in questo caso, ma comunque una bella spiegazione generale della valutazione delle funzioni. Considera questo commento come un +1.
mtone,

@ThunderFrame: qual è il tuo punto? Se A1 contiene TRUEe B1 contiene qualsiasi valore di testo (inclusa una stringa vuota) , quindi =AND(A1,B1)restituisce TRUE.
Scott,

2

Secondo il mio commento sulla risposta di @ jcbermu, con una piccola correzione:

Se uno qualsiasi ma non TUTTI gli argomenti contengono valori di testo nei valori di cella o celle vuote, tali valori vengono ignorati. Ma se TUTTI gli argomenti contengono valori di testo in valori di cella o celle vuote, la funzione restituisce#VALUE!

Con la correzione che implica:

Se uno o più argomenti sono testo da un valore letterale stringa, anziché testo in un riferimento di cella, il risultato è #VALUE!

Cioè, se la cella A1ha valore "abc", quindi =AND(A1,TRUE)ritorna TRUE, ma =AND("abc",TRUE) ritorna #VALUE!. Vedi le righe da 9 a 13 nell'immagine qui sotto.

inserisci qui la descrizione dell'immagine

Ma diventa più strano ...

Se uno degli argomenti è un errore, ANDrestituirà il primo errore. Tranne , se uno qualsiasi degli argomenti è un valore letterale stringa, allora il valore restituito è#VALUE!

=AND(TRUE,TRUE,"abc") = #VALUE!

=AND(1/0,foo(),TRUE) = #DIV/0!

=AND(foo(),1/0,TRUE) = #NAME?

=AND(1/0,foo(),"abc",TRUE) = #VALUE!

=AND(foo(),1/0,"abc",TRUE) = #VALUE!


0

=ISBLANK(B2)
dà VERO se B2 è vuoto, non vuoto

=AND(B2,TRUE) dovresti
=AND(B2="",TRUE)scrivere il valore (B2 vuoto restituisce True) e la seconda logica è True e restituirà True
=IF(B2,TRUE,FALSE)dovrebbe essere =IF(B2="",TRUE,FALSE)darà True
=AND(IF(B2,TRUE,FALSE),TRUE)dovrebbe essere =AND(IF(B2="",TRUE,FALSE),TRUE)fornirà True
Prova sempre a scrivere tutto il test e non pensare che Excel farà.
Ricorda sempre Logical Test, nelle tue formule, non testare per B2
Come usare la funzione IF
Excel AND


8
Penso che ti sia mancato il punto OP. = ISBLANK (B2) è solo per dimostrare che la cella B2 è vuota. = AND (B2, TRUE) ha lo scopo di testare il valore booleano della cella B2. Quindi l'unico modo in cui questo viene valutato su TRUE è se la cella B2 viene valutata su TRUE. Ciò è quindi contraddetto dal seguente test, = IF (B2, TRUE, FALSE) che restituisce FALSE. Questa è una domanda fantastica poiché non sapevo che Excel ignora alcuni valori di cella invece di valutarli in un valore booleano (VERO o FALSO).
Linhartr22,

6
Perché questo è stato votato? AND(B2,TRUE)sicuramente non dovrebbe essere AND(B2="",TRUE)nel contesto della domanda.
Dmitry Grigoryev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.