Excel-formel: Telle unike tekstverdier med kriterier

Innholdsfortegnelse

Generisk formel

(=SUM(--(FREQUENCY(IF(criteria,MATCH(vals,vals,0)),ROW(vals)-ROW(vals.first)+1)>0)))

Sammendrag

For å telle unike tekstverdier i et område med kriterier, kan du bruke en matriseformel basert på FREKVENS- og MATCH-funksjonene. I eksemplet vist er formelen i G6:

(=SUM(--(FREQUENCY(IF(C5:C11=G5,MATCH(B5:B11,B5:B11,0)),ROW(B5:B11)-ROW(B5)+1)>0)))

som returnerer 3, siden tre forskjellige personer jobbet med prosjektet Omega.

Merk: dette er en matriseformel og må angis med kontroll + skift + enter.

Forklaring

Dette er en kompleks formel som bruker FREKVENS til å telle numeriske verdier som er avledet med MATCH-funksjonen. MATCH-funksjonen fungerer fra innsiden og ut og brukes til å få posisjonen til hver verdi som vises i dataene:

MATCH(B5:B11,B5:B11,0)

Resultatet fra MATCH er en matrise som dette:

(1;1;3;1;1;6;7)

Fordi MATCH alltid returnerer posisjonen til den første kampen, gir verdier som vises mer enn en gang i dataene samme posisjon. For eksempel, fordi "Jim" vises 4 ganger i listen, dukker han opp i denne matrisen 4 ganger som nummer 1.

Utenfor MATCH-funksjonen brukes IF-funksjonen til å anvende kriterier, som i dette tilfellet innebærer testing av om prosjektet er "omega" (fra celle G5):

IF(C5:C11=G5 // filter on "omega"

IF-funksjonen fungerer som et filter, og lar bare verdiene fra MATCH passere hvis de er assosiert med "omega". Resultatet er en matrise som dette:

(FALSE;FALSE;FALSE;1;1;6;7) // after filtering

Den filtrerte matrisen leveres direkte til FREKVENS-funksjonen som argumentet data_array . Deretter brukes ROW-funksjonen til å lage en sekvensiell liste med tall for hver verdi i dataene:

ROW(B3:B12)-ROW(B3)+1

Dette skaper en matrise som dette:

(1;2;3;4;5;6;7;8;9;10)

som blir argumentet bins_array i FILTER. På dette punktet har vi:

FREQUENCY((FALSE;FALSE;FALSE;1;1;6;7),(1;2;3;4;5;6;7))

FREKVENS returnerer en rekke tall som indikerer en telling for hver verdi i dataarrayet, organisert etter bin. Når et tall allerede er talt, vil FREKVENS returnere null. Resultatet fra FREQUENCY er en matrise som dette:

(2;0;0;0;0;1;1;0) // result from FREQUENCY

Merk: FREKVENS returnerer alltid en matrise med ett mer element enn bins_array .

På dette punktet kan vi omskrive formelen slik:

=SUM(--((2;0;0;0;0;1;1;0)>0))

Vi ser etter verdier større enn null, som konverterer tallene til SANT eller FALSK:

=SUM(--((TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE)))

Deretter bruker vi en dobbeltnegativ for å tvinge de logiske verdiene til 1s og 0s:

=SUM((1;0;0;0;0;1;1;0))

Til slutt returnerer SUM-funksjonen 3 som det endelige resultatet.

Merk: dette er en matriseformel og må angis ved hjelp av Control + Shift + Enter.

Håndtering av tomme celler i området

Hvis noen celler i området er tomme, må du justere formelen for å forhindre at tomme celler overføres til MATCH-funksjonen, noe som vil føre til en feil. Du kan gjøre dette ved å legge til en annen nestet IF-funksjon for å se etter tomme celler:

(=SUM(--(FREQUENCY(IF(B5:B11"",IF(C5:C11=G5,MATCH(B5:B11,B5:B11,0))),ROW(B5:B11)-ROW(B5)+1)>0)))

Med to kriterier

Hvis du har to kriterier, kan du utvide logikken til formelen ved å legge til en annen nestet IF:

(=SUM(--(FREQUENCY(IF(c1,IF(c2,MATCH(vals,vals,0))),ROW(vals)-ROW(vals.1st)+1)>0)))

Hvor c1 = kriterier1, c2 = kriterier2 og vals = verdiområdet.

Med boolsk logikk

Med boolsk logikk kan du redusere nestede IF-er:

(=SUM(--(FREQUENCY(IF((criteria1)*(criteria2),MATCH(vals,vals,0)),ROW(vals)-ROW(vals.1st)+1)>0)))

Dette gjør det lettere å legge til og administrere flere kriterier.

Gode ​​lenker

Mike Girvins bok Control-Shift-Enter

Interessante artikler...