Frage

Ich habe eine Excel-Tabelle in einem Format ähnlich den folgenden ...

| 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   |

Ich brauche diese Tabelle in eine Liste der „Top Ten“ Teams zu konvertieren. Die Regeln sind

  • Jedes Team Ergebnis aus der Summe von vier Mitgliedern dieses Clubs genommen wird.
  • Diese Summen der besten vier Noten sein sollen, außer ...
    • Jedes Team besteht aus mindestens einem Junior oder Lady muss

Zum Beispiel in der obigen Tabelle der Mannschaftswertung für Verein A würde 625 sein nicht 640, wie Sie die Noten für Harry nehmen würden (190), Bert (150), Jim (150), und Simon (130). Sie konnten nicht Freds (145) der Gäste nehmen wie würden Sie nur Herren geben.

Meine Frage ist, kann dies leicht als eine Reihe von Excel-Formel durchgeführt werden, oder werde ich mit etwas mehr Verfahren greifen muß?

Im Idealfall muss die Lösung in der Teamauswahl automatisch sein, ich will nicht getrennt handgefertigte Formel für jedes Team haben, zu erstellen. Ich werde auch nicht zwingend eine ordentlich geordnete Liste der einzelnen Clubs Mitglieder. Obwohl ich wahrscheinlich die Liste über ein zusätzliches Berechnungsblatt erzeugen könnte.

War es hilfreich?

Lösung

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

Als =TopTen(H2,$B$2:$E$30) wo H2 den Club Brief enthält.

Andere Tipps

  

kann dies leicht als eine Reihe von getan werden   Excel-Formel

Kurze Antwort, YES. (Je nach Definition von „leicht“).

Lange Antwort ...

(I denken das funktioniert)

Hier sind meine (kurz) Testdaten:


    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

Nun, wenn ich die Regeln richtig verstanden habe, wollen wir die besten vier Noten, mit der Ausnahme, dass, wenn die höchste Punktzahl von entweder einer Dame oder einem Junior nicht in der vier besten ist, verwenden wir, dass anstelle des vierthöchste. Ich habe es etwas angepasst, aus Gründen, die deutlich werden kann ...

OK. Array Formeln zur Rettung! (Hoffe ich)

Die höchste Punktzahl von Team einer sollte

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

, wo die {} zeigt eine Formel Array erstellt unter Verwendung von ctrl-Umschalt-Eingabe der Formel einzugeben. Die ersten vier werden auf ähnliche Weise erstellt. Für die Dame / Junior Bit, müssen wir ein wenig mehr Komplexität. Unter der Dame, müssen wir diese:

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

Junior sicher links für den Schüler als eine Übung sein kann, hoffe ich.

Ich suche jetzt an einem Tisch mit dem folgende Layout für Club "a"


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

Die Club-Score sollten die drei „jedermann“ Partituren plus die beste Dame oder Junior , wenn sie nicht bereits in den ersten vier sind .

in Q2 Ich setze diese:

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

MAX (O2, P2) sagt mir, die beste Dame oder Junior-Score, die enthalten sein muss. Wenn es höher als die vierthöchste Team der Gäste, dann ist es bereits in der Liste, und wir nehmen nur die ersten vier Plätze. Ansonsten haben wir den vierthöchste Punktzahl mit der besten Dame / junior ersetzen.

Jetzt konnten wir sie alle in einer Formel tun, indem Sie die Teile in die endgültige Formel ersetzt:

{=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)))}

Aber ich würde es nicht empfehlen ...

Sie also die oben genannten Daten, ich mit diesem Ende:


            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       

Ratten. In meiner Aufregung an (glaube ich) auf den harten Teil des Weg zur Arbeit ich vergessen zu erwähnen

  • Die Liste der Noten in beliebiger Reihenfolge sein kann
  • Sie können die Clubrangliste mit RANK get ()
  • Sie können dann ziehen die Top 10 in einer anderen Tabelle MATCH () verwendet und 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   

Spalten A und B von uns berechneten Werte sind, Spalte E ist die Reihenfolge, in den Clubs Ausgabe in dem Finaltisch sein. Die anderen Formeln sind wie folgt:

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

Was ich tue, ist lahm, aber es funktioniert.

So stellen Sie eine neue Spalte dann diese Formel =If(a1=N,b1,0) einsetzen, wo A1 Kriterien Spalte, N Kriterien und B1 ist in der Spalte, die Sie von den großen zu bekommen versuchen. Dann mache ich gerade die große Formel in einer anderen Spalte.

Manchmal habe ich alle Lust und stattdessen eine N von Roll-out, werde ich es $C$1 machen sagt, dann in dieser Zelle die Kriterien formulieren.

Die perfekte Antwort wäre zu haben Microsoft in einem largeifs hinzufügen (lesen Sie bitte Microsoft)

eine Lösung in VBA Schreiben wäre meine erste Wahl, vor allem, wenn die Regeln die Möglichkeit, immer komplexer haben.

eine Pivot-Tabelle verwenden, die als eine Datenbankabfrage auf den Daten handeln Sie haben. Pivot so dass die Teams die Spalten und Teammitglieder nach unten gehen zusammen mit ihrem Statustyp über die Pivot-Tabelle gehen. Ich bin für das Jahr 2003 nicht sicher, aber Excel 2007 können Sie dann sortieren, so dass die höchsten Werte auf der linken Seite angezeigt. Dann ist Ihre erste Summe kann einfach nehmen die ersten drei Punkte für jeden das Team. Doch die letzten Personen Summe zu bekommen, müssen Sie bestimmen, ob Sie die vierte Kerbe verwenden können, oder wenn Sie den max der Junior oder Lady Typen verwenden. Das könnte eine komplexe und Brute-Force-Formel etwas wie dies geschehen werden:

if (Art der Position 1 ist eine jüngere oder eine Dame oder ... 2 oder 3 ...) dann Position verwendet 4 else if Position 5 eine Junior oder Dame ist dann 5 verwenden, sonst, wenn p 6 ist ... und so weiter.

Ich glaube nicht, dass dies, wenn die Tabelle in irgendeiner Weise sortiert ist getan werden kann. Die meisten Excel-Lookup-Funktionen erfordern Listen geordnet. Dies könnte sicherlich mit einer VBA-Funktion durchgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top