Rangordning
Rangordna tal kan ibland underlätta att analysera data. I tabellen nedan visas några grundläggande möjligheter för att rangordna tal inbördes.
Den första rangordningen är fallande och utan att rangordna tal som förekommer fler gånger. Formeln utgörs här av:
- =RANG(A3;$A$3:$A$7)
För att erhålla en fallande rangordning som beaktar tal som förekommer flera gånger måste en annorlunda formel användas:
- =RANG(A3;$A$3:$A$7)+ANTAL.OM($A$3:A3;A3)-1
För att rangordna stigande och utan att rangordna tal som förekommer flera gånger kan följande formeln användas:
- =RANG(A3;$A$3:$A$7;1)
För att rangordna tal som förekommer flera gånger kan följande formeln användas vid stigande rangordning:
- =RANG(A3;$A$3:$A$7;1)+ANTAL.OM($A$3:A3;A3)-1
Vill man kasta om rangordningen för tal som förekommer flera gånger kan det ske mha formeln:
- =ANTAL($A$3:$A$7)-(RANG(A3;$A$3:$A$7)+ANTAL.OM($A$3:A3;A3))+2
Vill man skapa en formel för hela listan kan det lösas mha en matrisformel enligt nedanstående tabell:
Det kan ibland vara önskvärt att låta XL rangordna värden, som förekommer flera gånger, sekventiellt. I tabellen nedan demonstreras tre (komplexa) formeltekniska lösningar för det.
Rangordningen i "Rang 1" bygger på följande matrisformel:
- {=SUMMA(1*(A2>=$A$2:$A$6))-(SUMMA(1*(A2=$A$2:$A$6))-1)/2}
Rangordningen i "Rang 2" sker i stigande ordning och utgår från matrisformeln:
- {=SUMMA(1*(A2>$A$2:$A$6))+1+OM(RAD(A1)-RAD($A$1)=0;0;
SUMMA(1*(A2=FÖRSKJUTNING($A$1;0;0;INDEX(RAD(A1)-RAD($A$1)+1;1)-1;1))))}
Alternativt kan följande enklare formel användas:
- =PRODUKTSUMMA((A2>$A$2:$A$6)+(A2=$A$2:$A$6))
Rangordningen i "Rang 3" är i fallande ordning och den formeltekniska lösning är:
- {=SUMMA(1*(A2<$A$2:$A$6))+1+OM(RAD(A1)-RAD($A$1)=0;0;
SUMMA(1*(A2=FÖRSKJUTNING($A$1;0;0;INDEX(RAD(A1)-RAD($A$1)+1;1)-1;1))))}
Skillnaden mellan "Rang 2" och Rang 3" är att uttrycket ">" är ersatt i "Rang 3 " av uttrycket "<" !
Vill man rangordna rader istället för kolumner ersätts RAD-funktionen i formlerna ovan med KOLUMN-funktionen.
För de som håller på med diverse spel i XL kan följande vara av intresse.
Rankningen i tabellen bygger på grundläggande formler enligt ovan. För att erhålla namnen enligt fallande rangordning används följande formel:
- {=FÖRSKJUTNING(A$3;PASSA(MINSTA($C$3:$C$6;RAD()-RAD(D$3)+1);$C$3:$C$6;0)-1;0)}
För att få fram en lista över namn stigande används följande formel:
- =FÖRSKJUTNING(A$3;PASSA(MINSTA(B$3:B$6;RAD()-RAD(F$3)+1);B$3:B$6;0)-1;0)
Antag att du har en lista med enheter och deras utfall för en period. Du vill nu ha reda på hur dessa enheter rangordnas sinsemellan. Tabellen nedan visar förutsättningarna.
Lösningen är (tyvärr) en relativ komplex formel. Utöver att den kan rangordna enligt önskemål så kan den även hantera när t ex två enheter har samma resultatutfall.
- {=INDEX($B$2:$B$6;PASSA(STÖRSTA($A$2:$A$6+0,5-
RAD($A$2:$A$6)/(10*RADER($A$2:$A$6));RAD($A$2:$A$6)-
RAD($A$2)+C2);$A$2:$A$6+0,5-RAD($A$2:$A$6)/(10*
RADER($A$2:$A$6));0))}
Genom att lägga till 0,5 och utföra en multiplikation med 10 kan formeln hantera lika resultatutfall. Cellreferensen C2 i formeln ger rangordningstalet.
Se också Dynamisk sortering.
Vill man erhålla automatisk/dynamisk fallande rangordning för textlistor så kan det lösa mha följande formel:
- {=INDEX(Område;PASSA(MINSTA((MMULT
((TRANSPONERA(Område)<(Område))*1;
RAD(Område)-RAD(Område)+1));RAD(Område)
-MIN(RAD(Område))+1);(MMULT((TRANSPONERA
(Område)<(Område))*1;RAD(Område)-RAD(Område)+1));0))}
Namnet "Område" avser det cellområde som håller den ursprungliga listan med text. Då det är en matrisformel så ska cellområdet som ska hålla den nya sorterade listan vara lika stort som den ursprungliga.
- Markera den nya cellområdet
- Mata in formeln
- Tryck samtidigt Ctrl+Skift+Enter
Vill man ha stigande sortering så ska MINSTA-funktionen i formeln ersättas med STÖRSTA-funktionen.
Se också Matriskalkylering.
Om man har en lista som består av två kolumner, namn och resultat, och man vill ha dynamisk sortering. Hur gör man då?
I tabellen nedan visas både den osorterade listan och den dynamiskt sorterade listan.
Hm, hur ser den tekniska lösningen ut då? Jo, för att skapa denna dynamiska lösning krävs att man markerar ett lika stort område som den ursprungliga listan omfattar och skriver in följande monstruösa matrisformel:
- {=INDEX(Tabell;PASSA(STÖRSTA(INDEX(Tabell;;2)-(RAD(INDEX
(Tabell;;2))-RAD(INDEX(INDEX(Tabell;;2);1;1)))/2^HELTAL
(LOG(RADER(INDEX(Tabell;;2));2)+1);RAD(INDIREKT("1:"&RADER
(D14:D20))));INDEX(Tabell;;2)-(RAD(INDEX(Tabell;;2))-RAD(INDEX
(INDEX(Tabell;;2);1;1)))/2^HELTAL(LOG(RADER(INDEX(Tabell;;2));2)
+1);0);{1;2})}
Namnet Tabell i formeln avser cellområdet A2:B8. Detta exempel finns ej att tillgå för hämtning.
Se också Dynamisk sortering.
Rangordna formler
Om vi antar att vi har formler i en lista, vilka vi vill rangordna, kan det inte ske med de inbyggda sorteringsfunktionerna.
För det krävs ett annat förfarande, vilket detta tips belyser.
Exemplet har sin utgångspunkt i följande uppställning:
I B-kolumnen i tabellen återfinns underliggande formler, vars värden ska rangordnas. Den innerhåller enkla SUMMA-funktioner, =SUMMA(A2:A3), vilken har kopierats nedåt i kolumnen.Rangordningen sker mha en matrisformel och anges i lika många celler som antal formler i listan - Här i området C2:C11 för stigande sortering - samtidigt:
För stigande sortering används följande matrisformel:
- {=MINSTA(B2:B11;RAD(A1:A10))}
För fallande sortering används matrisformeln:
- {=STÖRSTA(B2:B11;RAD(A1:A10))}
Korrekt rangordning?
Här belyses hur vi kan lösa ett rangordningsproblem som kan uppstå när vi ska rangordna utifrån flera kolumner.
Följande tabell visar förutsättningarna:
För att erhålla de största värdena används följande formel som kopieras nedåt i kolumn E:
- =INDEX($B$2:$B$9;PASSA(STÖRSTA($B$2:$B$9;C2);($B$2:$B$9);0))
Om vi använder oss av samma formel för att erhålla avdelningsnamnen uppstår ett problem. Har vi, som i exemplet, flera namn med samma värden (de blå markerade raderna) erhålls inte alla namnen utan bara det första - "AA".
Följande matrisformel löser dock problemet och som kopieras nedåt i D-kolumnen:
- {=INDEX($A$2:$A$9;PASSA(STÖRSTA($B$2:$B$9-RAD(B2:B9)/10000;C2);$B$2:$B$9-RAD(B2:B9)/10000;0))}
Vill vi istället ha en omvänd rangordning räcker det med att sortera C-kolumnen i fallande ordning.
Rangordna kolumnerI detta tips visas hur vi kan rangordna värden i kolumner mha av en matrisformel, vilken knyter an till tipset ovan.
Exemplet i sin helhet:
För att erhålla poäng används följande formel, som skapas och kopieras nedåt i kolumn I:
- =STÖRSTA($A$3:$E$3;G2)
För att erhålla vem som har de tre högsta poängen används följande matrisformel, som skapas och som därefter kopieras nedåt i kolumn H:
- {=INDEX($A$2:$E$2;PASSA(STÖRSTA($A$3:$E$3-KOLUMN(A2:E2)/1000;G2);$A$3:$E$3-KOLUMN(A2:E2)/1000;0))}
Rangordna inom subgrupper
Här belyses hur vi mha formler kan rangordna värden inom enskilda subgrupper. Den tekniska lösningen är såpass generell till sin karaktär att det inte finns någon begränsning när det gäller villkor.
Dessutom tillåter den att beräkningar av variabler kan göras direkt vid rangordningen, vilket inte den inbyggda funktionen RANG tillåter.
Exemplet i sin helhet visas i följande bild:
Följande namn används i exemplet:
- Avdelning: A2:A10
- Månad: B2:B10
- Antal: C2:C10
I det första exemplet (Rang 1) sker rangordning för samtliga poster utan hänsyn till tillhörighet. Här används standardfunktionen RANG:
- =RANG(Antal;Antal)
I det andra exemplet (Rang 2) sker rangordning utifrån subgruppen Månad:
- =PRODUKTSUMMA((Månad=B2)*(Antal>C2))+1
I det tredje och sista exemplet (Rang 3) sker rangordning utifrån subgrupperna Avdelning och Månad
- =PRODUKTSUMMA((Avdelning=A2)*(Månad=B2)*(Antal>C2))+1
De två sistnämnda exemplen visar att vi kan bygga ut formeln nästan oändligt, dvs vi kan arbeta med stora datamängder och få den rangordnad mha denna formel!
Rangordna inom intervall
Här belyses hur vi kan bestämma inom vilket intervall en rangordning ska ske för i listor och hur denna rangordning ska numreras.
Bilden nedan visar exemplet i sin helhet:
I cellerna F1 och F2 anges lägsta respektive högsta värden som ska ingå i rangordningen.
I B-kolumnen används följande formel för att få fram vilka tal som kvalificerar sig för att ingå i rangordningen:
- =OM(OCH(A2>=$F$1;A2<=$F$2);A2;"")
i C-kolumnen sker själva rangordningen mha följande formel:
- =OM(B2<>"";99+RANG(B2;$B$2:$B$11);"")
Vill vi inte använda oss av flera interrimformler så kan vi använda oss av följande formel (och som visas i D-kolumnen ovan):
- =OM(OCH($A$2:$A$11>=$F$1;$A$2:$A$11<=$F$2);$F$1-10-
ANTAL.OM($A$2:$A$11;"<"&$F$1)+RANG(A2;OM(($A$2:$A$11>=$F$1)
*($A$2:$A$11<=$F$2);$A$2:$A$11;0);1);"")
Vill vi ha en annan numrering för rangordningen ändras värdet 10 i formeln ovan.
Rangordna färger
Här demonstreras två tekniker för att rangordna dels utifrån cellers fyllningsfärg och dels på basis av teckenfärg. Lösningarna baseras på XL4-makron, vilket du kan läsa mer om här»
Bilden nedan visar det färdiga resultatet av att rangordna utifrån fyllningsfärg:
Skapa ett namn, i exemplet används "Färg", och referera till följande formel:
- =HÄMTA.CELL(38;FÖRSKJUTNING(INDIREKT("RC";FALSKT);0;-1))*1
"-1" i formeln anger att formeln ska hämta fyllningsfärgen från cellen till vänster. "*1" har lagts till för att omräkning ska ske vid förändring av fyllningsfärgen. Ange namnet, =Färg, och kopiera den nedåt i kolumnen.
Bilden nedan visar det färdiga resultatet av att rangordna utifrån teckenfärg:
Skapa ett namn, i exemplet används Fontfärg, och referera till följande formel:
- =HÄMTA.CELL(24;FÖRSKJUTNING(INDIREKT("RC";FALSKT);0;-1))*1
Ange namnet, =Fontfärg, och kopiera den nedåt i kolumnen.
OBS! Vid ändring av fyllningsfärg eller teckenfärg måste omräkning av arbetsbladet ske. Enklast är att trycka ned F9-knappen.