Topp ti bestilling i Excel basert på komplekse grupperegler

stemmer
3

Jeg har en excel regneark i et format som ligner på følgende ...

| NAME  | CLUB | STATUS | SCORE |
| Fred  |  a   | Gent   | 145   |
| Bert  |  a   | Gent   | 150   |
| Harry |  a   | Gent   | 195   |
| Jim   |  a   | Gent   | 150   |
| Clare |  a   | Lady   | 99    |
| Simon |  a   | Junior | 130   |
| John  |  b   | Junior | 130   |
   :
   :
| Henry |  z   | Gent   | 200   |

Jeg trenger å konvertere denne tabellen til en liste over Top Ten lag. Reglene er

  • Hvert lag scorer er tatt fra summen av fire medlemmer av den klubben.
  • Disse summer skal være av de beste fire score unntatt ...
    • Hvert lag må bestå av minst en Junior eller Lady

For eksempel i tabellen ovenfor teamet score for klubben ville A være 625 ikke 640 som du vil ta resultatet for Harry (190), Bert (150), Jim (150), og Simon (130). Du kan ikke ta Fred (145) score som som vil gi deg bare Gents.

Mitt spørsmål er, kan dette ordnes raskt som en serie av Excel formel, eller må jeg ty til å bruke noe mer prosessuelle?

Ideelt løsningen må være automatisk i teamet valg, jeg ønsker ikke å ha for å lage egen håndlaget formelen for hvert lag. Jeg vil heller ikke nødvendigvis har et pent sortert liste over hver klubber medlemmer. Selv om jeg kunne sikkert generere listen via en ekstra beregning ark.

Publisert på 11/09/2008 klokken 21:41
kilden bruker
På andre språk...                            


6 svar

stemmer
0

Bruk en pivot tabell som vil fungere som en database spørring på data du har. Pivot slik at lagene gå ned søyler og lagets medlemmer sammen med sin status typen gå over pivottabell. Jeg er ikke sikker for 2003, men Excel 2007 kan du deretter sortere så de høyeste poengsummene vises til venstre. Så din første sum kan bare ta de tre første score for hvert lag. Men for å få den siste personer sum, må du finne ut om du kan bruke den fjerde score, eller hvis du må bruke maks av junior eller Lady typer. Det kan gjøres ved hjelp av et komplekst og rå kraft formel noe som dette:

if (type stilling 1 er en junior eller en dame eller ... 2 eller 3 ...), og bruk posisjon 4 annet hvis posisjon 5 er en junior eller dame deretter bruke 5 else if p 6 er ... og så videre .

Svarte 11/09/2008 kl. 21:52
kilden bruker

stemmer
0

Skrive en løsning i VBA ville være mitt førstevalg, spesielt hvis reglene har muligheten til å bli mer komplisert.

Svarte 11/09/2008 kl. 21:54
kilden bruker

stemmer
0

Jeg tror ikke at dette kan gjøres med mindre tabellen er sortert på en eller annen måte. De fleste av Excel oppslagsfunksjoner krever ordnede lister. Dette kan sikkert gjøres med en VBA-funksjon.

Svarte 11/09/2008 kl. 22:07
kilden bruker

stemmer
2

Public Function TopTen(Club As String, Scores As Range)

    Dim i As Long
    Dim vaScores As Variant
    Dim bLady As Boolean
    Dim lCnt As Long
    Dim lTotal As Long

    vaScores = FilterOnClub(Scores.Value, Club)
    vaScores = SortOnScore(vaScores)

    For i = LBound(vaScores, 2) To UBound(vaScores, 2)
        If lCnt = 3 And Not bLady Then
            If vaScores(3, i) <> "Gent" Then
                lTotal = lTotal + vaScores(4, i)
                bLady = True
                lCnt = lCnt + 1
            End If
        Else
            lTotal = lTotal + vaScores(4, i)
            lCnt = lCnt + 1
            If vaScores(3, i) <> "Gent" Then bLady = True
        End If

        If lCnt = 4 Then Exit For
    Next i

    TopTen = lTotal

End Function

Private Function FilterOnClub(vaScores As Variant, sClub As String) As Variant

    Dim i As Long, j As Long
    Dim aTemp() As Variant

    For i = LBound(vaScores, 1) To UBound(vaScores, 1)
        If vaScores(i, 2) = sClub Then
            j = j + 1
            ReDim Preserve aTemp(1 To 4, 1 To j)
            aTemp(1, j) = vaScores(i, 1)
            aTemp(2, j) = vaScores(i, 2)
            aTemp(3, j) = vaScores(i, 3)
            aTemp(4, j) = vaScores(i, 4)
        End If
    Next i

    FilterOnClub = aTemp

End Function

Private Function SortOnScore(vaScores As Variant) As Variant

    Dim i As Long, j As Long, k As Long
    Dim aTemp(1 To 4) As Variant

    For i = 1 To UBound(vaScores, 2) - 1
        For j = i To UBound(vaScores, 2)
            If vaScores(4, i) < vaScores(4, j) Then
                For k = 1 To 4
                    aTemp(k) = vaScores(k, j)
                    vaScores(k, j) = vaScores(k, i)
                    vaScores(k, i) = aTemp(k)
                Next k
            End If
        Next j
    Next i

    SortOnScore = vaScores

End Function

Bruk som =TopTen(H2,$B$2:$E$30)der H2inneholder klubben brevet.

Svarte 12/09/2008 kl. 22:11
kilden bruker

stemmer
2

kan dette gjøres enkelt som en serie av Excel formel

Korte svaret, JA. (Avhengig av din definisjon av "lett").

Lange svaret ...

(Jeg tror dette fungerer)

Her er min (kort) test data:


    A          B    C        D
 1 NAME      CLUB STATUS  SCORE
 2 Kevin    a   Gent    145
 3 Lyle     a   Gent    150
 4 Martin   a   Gent    195
 5 Norm     a   Gent    150
 6 Oonagh   a   Lady    100
 7 Arthur   b   Gent    200
 8 Brian    b   Gent    210
 9 Charlie  b   Gent    190
10 Donald   b   Gent    220
11 Eddie    b   Junior  150
12 Quentin  c   Gent    145
13 Ryan     c   Gent    150
14 Sheila   c   Lady    195
15 Trevor   c   Gent    150
16 Ursula   c   Junior  200

Nå, hvis jeg har forstått reglene riktig, vil vi de beste fire poeng, bortsett fra at hvis den høyeste poengsummen av enten en dame eller en junior er ikke i den beste fire, vi bruker det i stedet for den fjerde høyeste. Jeg har omarbeidet det noe, av grunner som kan bli synlig ...

OK. Matriseformler til unnsetning! (Jeg håper)

Den høyeste poengsum fra teamet en bør være

{=LARGE(IF(B2:B16="a",D2:D16,0),1)}

hvor {} indikerer at en matrise formel opprettet ved hjelp av kontroll-Shift-Enter for å bruke formelen. Den øverste fire er tilsvarende opprettet. For Lady / Junior bit, trenger vi litt mer kompleksitet. Tar Lady, trenger vi dette:

{=LARGE(IF($B$2:$B$16=$J3,IF($C$2:$C$16="Lady",$D$2:$D$16,0),0),1)}

Junior kan trygt stå som en øvelse for studenten, håper jeg.

Jeg nå ser på en tabell med følgende layout for klubben "a"


     J    K      L      M      N      O      P
 1 Club    1      2      3      4   Lady  Junior
 2 a     195    150    150    145    100      0

Klubben poengsum skal være de beste tre "noen" score pluss den beste dame eller junior hvis de ikke allerede er blant de fire beste .

Så i Q2 Jeg setter dette:

=SUM(K2:M2)+MIN(MAX(O2,P2),N2)

MAX (O2, P2) forteller meg det beste dame eller junior score, som må inkluderes. Hvis det er høyere enn den fjerde høyeste lag scorer, så er det allerede i listen, og vi bare ta de fire beste. Ellers, vi erstatte den fjerde høyeste score med de beste dame / junior ett.

Nå kunne vi gjøre alt i en formel, ved å erstatte delene i den endelige formelen:

{=LARGE(IF($B$2:$B$16=$J3,$D$2:$D$16,0),1)+
LARGE(IF($B$2:$B$16=$J3,$D$2:$D$16,0),2)+
LARGE(IF($B$2:$B$16=$J3,$D$2:$D$16,0),3)+
MIN(LARGE(IF($B$2:$B$16=$J3,$D$2:$D$16,0),4),
MAX(LARGE(IF($B$2:$B$18=$J3,IF($C$2:$C$18="Lady",$D$2:$D$18,0),0),1),
LARGE(IF($B$2:$B$18=$J3,IF($C$2:$C$18="Junior",$D$2:$D$18,0),0),1)))}

Men jeg anbefaler ikke det ...

Så for de ovennevnte data, ender jeg opp med dette:


            Anyone                                          Lady        Junior                
Club        1           2           3           4           1           1           Total     
a           195         150         150         145         100         0           595       
b           220         210         200         190         0           150         780       
c           200         195         150         150         195         200         695       

Rotter. I min begeistring på (tror jeg) å få den harde delen til å fungere jeg glemte å nevne at

  • Listen over score kan være i hvilken som helst rekkefølge
  • Du kan få klubben rangeringer med RANK ()
  • Du kan deretter trekke de 10 beste i en annen tabell ved hjelp av MATCH () og INDEX ()

    A               B       C       D           E       F       G               H    
1   club            Sc      Rank    UniqRk              Pos     Club            Score
2   third-equal#1   80      3       79.999980   1       1       best            100  
3   second          90      2       89.999970   2       2       second          90   
4   third-equal#2   80      3       79.999960   3       3       third-equal#1   80   
5   best            100     1       99.999950   4       3       third-equal#2   80   
6   worst           70      5       69.999940   5       5       worst           70   

Kolonner A og B er våre beregne skår, er kolonne E i hvilken rekkefølge klubber vil være utgang i den endelige tabell. De andre formler er som følger:

C: =RANK(B2,$B$2:$B$6)      # what it says, with ties both getting the lower number
D: =B2-ROW()*0.00001        # score, modified slightly to ensure uniqueness
F: =SMALL($C$2:$C$6,E2)     # first output column, ranks including ties
G: =INDEX($A$2:$A$6,MATCH(LARGE($D$2:$D$6,E2),$D$2:$D$6,0))
                            # club name for position, using the modified score in D
H: =INDEX($B$2:$B$6,MATCH(LARGE($D$2:$D$6,E2),$D$2:$D$6,0))
                            # as G, but indexes into scores
Svarte 15/09/2008 kl. 09:16
kilden bruker

stemmer
1

Hva jeg gjør er halt, men det fungerer.

Bare lage en ny kolonne og deretter sette inn denne formelen =If(a1=N,b1,0)der A1er kriteriene kolonne, Ner kriteriene og B1er i kolonnen som du prøver å få den store fra. Så jeg bare gjøre det store formelen i en annen kolonne.

Noen ganger får jeg all lyst og i stedet for å rulle ut en N, vil jeg gjøre det si $C$1, så stave ut kriteriene i den cellen.

Den perfekte løsningen ville være å ha Microsoft legger i en largeifs(les denne Microsoft)

Svarte 13/09/2011 kl. 23:04
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more