2015-10-27 23 views
6

Questa domanda riguarda il modo in cui la funzione COUNTIF di Excel tratta tipi di dati diversi quando viene utilizzata come formula di matrice.Comportamento COUNTIF imprevisto quando si mischia numero e testo (EXCEL)

Ci sono molti buoni messaggi là fuori in dettaglio come usare COUNTIF per attività come l'estrazione di valori univoci da un elenco, ad esempio this post. Sono riuscito a utilizzare esempi da questo e altri post per risolvere problemi specifici, ma sto cercando di ottenere una comprensione più approfondita delle formule di array al fine di adattare le mie formule alle nuove esigenze.

Mi sono imbattuto in un comportamento particolare di COUNTIF. In generale, Excel sembra trattare le stringhe come "più grandi di" numeri, in modo che i seguenti esempi sono validi:

Cell Formula  Returns 
=1<2    TRUE 
="a"<"b"   TRUE 
="a">"b"   FALSE 
=1<"b"   TRUE 

Ora, gamma supponiamo A1: A6 contiene la seguente serie di dati:

1 
2 
3 
A 
B 
C 

Per ogni cella di questo set, voglio verificare quante di tutte le celle dell'insieme sono più piccole o uguali a quella cella (una tecnica utile in formule più complesse). Entro la seguente formula di matrice nella gamma B1: B6:

{=COUNTIF($A$1:$A$6,"<="&$A$1:$A$6)} (CTRL + MAIUSC + INVIO)

Sulla base di esempi precedenti confrontando numeri e stringhe (illustrati anche nella colonna D qui di seguito), mi sarei aspettato il l'output mostrato di seguito è simile alla colonna C. Tuttavia, la formula della matrice restituisce il risultato mostrato nella colonna B, il che suggerisce che le stringhe e gli elementi numerici vengano conteggiati separatamente da COUNTIF in ordine decrescente.

Column A  Column B  Column C  Column D 
1   1   1   A1<"C" = TRUE 
2   2   2   A2<"C" = TRUE 
3   3   3   A3<"C" = TRUE 
A   1   4   A4<"C" = TRUE 
B   2   5   A5<"C" = TRUE 
C   3   6   A6<"C" = FALSE 

Quindi la domanda è come produrre l'output nella colonna C? (EDIT:Giusto per chiarire, sto specificamente alla ricerca di soluzioni che fanno uso di proprietà di matrice di COUNTIF.)

Qualsiasi visione per cui COUNTIF arraywise apparentemente comporta in modo diverso rispetto agli esempi monocellulari sarebbe anche molto più apprezzato.

NOTA: ho tradotto gli esempi da una versione non inglese di Excel, quindi mi scuso in anticipo per qualsiasi refuso.

PS. Per uno sfondo, mi sono imbattuto in questo problema quando ho provato a creare una formula che avrebbe sia estrarre valori univoci da un elenco con possibili duplicati, e ordinare i valori univoci in ordine numerico/alfabetico. La mia soluzione attuale è di farlo in due fasi. Una soluzione per come farlo in un passo is proposed here.

+0

Credo che si sta utilizzando 'COUNTIF' in modo non corretto. –

+0

La sintassi '{= COUNTIF ($ A $ 1: $ A $ 6," <= "e $ A $ 1: $ A $ 6)}' è in realtà estratta da una formula molto più complessa che si comporta esattamente come previsto, e quale è stata usato da altri per risolvere problemi simili. Questo post illustra un passaggio intermedio in quella formula. – Egalth

risposta

2

Il diverso comportamento può facilmente dimostrare se si confronta

=COUNTIF($A$1:$A$6,"<=A")

con

{=COUNT(IF($A$1:$A$6<="A",1))}

Il primo servirà solo a ottenere i valori di testo da $A$1:$A$6 perché è chiaramente testo da confrontare ed è più veloce ignorando altre val Allora. =COUNTIF($A$1:$A$6,"<=3") otterrà solo valori numerici da $A$1:$A$6 a causa degli stessi motivi. Anche se il criterio fosse una concatinazione con un riferimento di cella, la concatinazione sarebbe il primo processo e porterebbe a "< = A" o "< = 3". Quindi è sempre chiaro cosa confrontare, testo o numeri.

Il secondo richiede prima un array di confronti, quindi esegue il numero IF, ottiene così un array di 1 o FALSE e conta poi. Ma la "A" potrebbe anche essere un riferimento di cella. Quindi non è chiaro cosa confrontare all'inizio e il primo array deve confrontare tutti i valori in $A$1:$A$6.

Quindi COUNTIF(S) e SUMIF(S) non possono essere confrontati con testo misto e dati numerici.

La soluzione è già indicata da XOR LX.

Btw .: con il tuo PS. For a background si dovrebbe prendere in considerazione la seguente soluzione da un sito di Excel in tedesco: http://www.excelformeln.de/formeln.html?welcher=236.

Nel tuo esempio legato:

Formula in B2 verso il basso

{=INDEX($A$2:$A$99,MATCH(LARGE(COUNTIF(A$2:A$99,">="&A$2:A$99)+99*ISNUMBER(A$2:A$99),ROWS($1:1)),COUNTIF(A$2:A$99,">="&A$2:A$99)+99*ISNUMBER(A$2:A$99),0))&""} 

In questa soluzione la si confronta con COUNTIF>= in modo che il più grande testo o il numero conteranno più basso e quindi ottenere la posizione più bassa. Tutte le posizioni numeriche sono aggiunte con 99. Quindi sono sempre più grandi di tutte le possibili posizioni di testo. Quindi abbiamo una matrice decrescente. Quindi, utilizzando LARGE, l'elenco viene creato dalla posizione più alta a quella più bassa.

+0

Grazie, questo ha un senso :) – Egalth

+0

E grazie ancora per il collegamento aggiuntivo! – Egalth

0

Dubito che countif sia la funzione giusta per ciò che si vuole ottenere qui.

provare questo (Ctrl + Shift + Invio):

={SUM(IF(A1>=$A$1:$A$6,1,0))} 

Si otterrà

1 
2 
3 
4 
5 
6 

PS: ContaSe è sostanzialmente una funzione di matrice internamente. Usandolo in un'altra funzione di matrice risulta in più funzioni di matrice e il loro comportamento diventa complesso. Le funzioni array sono utilizzate al meglio con un percorso logico chiaro.

come testato in Excel 2013, si otterrà solo 1 in tutti i risultati, invece di ciò che è stato proposto nella colonna B.

Attualmente, nella funzione da Lei forniti, countif non si può capire quale cella da confrontare con il quale cellula. Le funzioni della matrice espandono gli intervalli e quindi eseguono l'azione fornita. Pertanto, sta confrontando ogni cella con la stessa cella e risultante in 1.

+0

Forse puoi chiarire il tuo commento "Dubito che countif sia la funzione giusta per ciò che vuoi ottenere qui."? Su quali basi ne dubiti? Quali approfondimenti ti hanno portato a questa conclusione, che potrebbe anche essere utile all'OP per aiutarli a comprendere il comportamento di COUNTIF di cui sono stati testimoni? –

+0

Inoltre, perché il riferimento di cella A1 è tra parentesi? Le parentesi –

+0

non sono obbligatorie. –

3

Prima di tutto, una domanda ottimamente strutturata e su un argomento interessante da avviare.

Ho anche sollevato un sopracciglio quando mi sono imbattuto per la prima volta in questo comportamento delle funzioni COUNTIF(S)/SUMIF(S). In loro difesa, suppongo che potremmo costruire situazioni in cui, in realtà, stringhe e numeri vanno considerati separatamente.

Per costruire l'array in formula richiesta, avrete bisogno di qualcosa di simile a:

MMULT(0+(TRANSPOSE($A$1:$A$6)<=$A$1:$A$6),ROW($A$1:$A$6)^0)

se nota che la trasposizione necessaria significa che qualsiasi set-up che include questa costruzione richiederà commettere con CSE.

saluti

+0

Grazie! Penso che andrò in CSE, è troppo utile non commettere .. – Egalth

0

Prova questa FormulaArray in B1 quindi copiare fino B6:

=SUM(($A$1:$A$6<=$A1)*1) 
+0

Grazie, sicuramente funziona per la riproduzione di Column C. (avrei dovuto essere più specifico in quanto cercavo soluzioni con COUNTIF in particolare, che può essere esteso a situazioni con intervalli dinamici per i critici.) – Egalth

Problemi correlati