
Generisk formel
=MMULT(--(data>TRANSPOSE(data)),ROW(data)^0)
Resumé
For dynamisk at sortere og udtrække unikke værdier fra en dataliste kan du bruge en matrixformel til at etablere en rang i en hjælpekolonne og derefter bruge en specielt konstrueret INDEX- og MATCH-formel til at udtrække unikke værdier. I det viste eksempel er formlen til at etablere rang i C5: C13:
=IF(data="",ROWS(data),MMULT(--(data>TRANSPOSE(data)),ROW(data)^0))
hvor "data" er det navngivne område B5: B13.
Bemærk: dette er en formel med flere celler, indtastet med kontrol + skift + enter.
Forklaring
Bemærk: kerneideen med denne formel er tilpasset fra et eksempel i Mike Girvins fremragende bog Control + Shift + Enter.
Det viste eksempel bruger flere formler, som er beskrevet nedenfor. På et højt niveau bruges MMULT-funktionen til at beregne en numerisk rang i en hjælpekolonne (kolonne C), og denne rang bruges derefter af en INDEX- og MATCH-formel i kolonne G for at udtrække unikke værdier.
Rangordning af dataværdier
MMULT-funktionen udfører matrixmultiplikation og bruges til at tildele en numerisk rang til hver værdi. Den første matrix oprettes med følgende udtryk:
--(data>TRANSPOSE(data))
Her bruger vi TRANSPOSE-funktionen til at oprette et vandret array af data , og alle værdier sammenlignes med hinanden. I det væsentlige sammenlignes hver værdi med hver anden værdi for at besvare spørgsmålet "er denne værdi større end enhver anden værdi". Dette resulterer i et todimensionelt array, 9 kolonner x 9 rækker, fyldt med SAND og FALSK værdier. Den dobbelte negative (-) bruges til at tvinge de SANDE FALSKE værdier til 1s og nuller. Du kan visualisere det resulterende array som dette:
Matricen på 1s og nuller ovenfor bliver array1 inde i MMULT-funktionen. Array2 oprettes med dette udtryk:
ROW(data)^0
Her hæves hvert række i "data" til magten nul for at skabe et endimensionelt array, 1 kolonne x 9 rækker, fyldt med tallet 1. MMULT returnerer derefter matrixproduktet for de to arrays, som bliver værdier set i rangkolonnen.
Vi får alle 9 placeringer tilbage på samme tid i en matrix, så vi er nødt til at placere resultaterne i forskellige celler på én gang. Ellers viser hver celle kun den første placeringsværdi i det array, der returneres.
Bemærk: dette er en formel med flere celler, der er indtastet med kontrol + skift + enter, i området C5: C13.
Håndtering af blanke celler
Tomme celler håndteres med denne del af rangformlen:
=IF(data="",ROWS(data)
Her, før vi kører MMULT, kontrollerer vi, om den aktuelle celle i "data" er tom. I så fald tildeler vi en rangværdi, der svarer til antallet af rækker i data. Dette gøres for at tvinge tomme celler til bunden af listen, hvor de let kan udelukkes senere, når unikke værdier ekstraheres (forklaret nedenfor).
Tæller unikke værdier
For at tælle unikke værdier i dataene er formlen i E5:
=SUM(--(FREQUENCY(rank,rank)>0))-(blank>0)
Da rangeringsformlen ovenfor tildeler en numerisk rang til hver værdi, kan vi bruge FREKVENS-funktionen med SUM til at tælle unikke værdier. Denne formel forklares detaljeret her. Vi trækker derefter 1 fra resultatet, hvis der er tomme celler i dataene:
-(blank>0)
hvor "blank" er det navngivne område E8 og indeholder denne formel:
=COUNTBLANK(data)
I det væsentlige reducerer vi det unikke antal med en, hvis der er tomme celler i dataene, da vi ikke inkluderer disse i resultaterne. Den unikke optælling i celle E5 hedder "unik" (til unik optælling) og bruges af INDEX og MATCH-formlen til at filtrere tomme celler ud (beskrevet nedenfor).
Uddrag af unikke værdier
For at udtrække unikke værdier indeholder G5 følgende formel, kopieret ned:
=IF(ROWS($G$5:G5)>unique,"",INDEX(data,MATCH(MIN(IF(ISNA(MATCH(data,$G$4:G4,0)),rank)),rank,0)))
Før vi kører INDEX- og MATCH-formlen, kontrollerer vi først, om det aktuelle rækkeantal i ekstraktionsområdet er større end det unikke antal det navngivne interval "unikt" (E5):
=IF(ROWS($G$5:G5)>unique,"",
Hvis ja, er vi færdige med at udtrække unikke værdier, og vi returnerer en tom streng (""). Hvis ikke, kører vi ekstraktionsformlen:
INDEX(data,MATCH(MIN(IF(ISNA(MATCH(data,$G$4:G4,0)),rank)),rank,0))
Bemærk, at der er to MATCH-funktioner her, den ene inden i den anden. Den indre MATCH bruger et ekspanderende interval for en matrix og det navngivne interval "data" til opslagsværdien:
MATCH(data,$G$4:G4,0)
Bemærk det udvidede interval begynder på "rækken over", række 4 i eksemplet. Resultatet fra den indre MATCH er en matrix, der for hver værdi i data indeholder enten en numerisk position (værdien er allerede blevet ekstraheret) eller # N / A-fejlen (værdien er endnu ikke blevet ekstraheret). Vi bruger derefter IF og ISNA til at filtrere disse resultater og returnere rangværdien for alle værdier i "data", der endnu ikke er ekstraheret:
IF(ISNA(results),rank))
Denne operation resulterer i en matrix, der føres ind i MIN-funktionen for at få den "mindste rangværdi" for dataværdier, der endnu ikke er ekstraheret. MIN-funktionen returnerer denne værdi til den ydre MATCH som en opslagsværdi, og det navngivne interval "rangeres" som arrayet:
MATCH(min_not_extracted,rank)),rank,0)
Endelig returnerer MATCH placeringen af den laveste rangværdi til INDEX som et række nummer, og INDEX returnerer dataværdien i den aktuelle række i ekstraktionsområdet.