3

我有一个类似于以下格式的 Excel 电子表格...

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

我需要将此表转换为“前十名”团队的列表。规则是

  • 每支球队的分数取自该俱乐部四名成员的总和。
  • 这些总分应该是最好的四个分数,除了......
    • 每个团队必须由至少一名青少年或女士组成

例如,在上表中,俱乐部 A 的球队得分将是 625而不是640,因为您会计算 Harry(190)、Bert(150)、Jim(150) 和 Simon(130) 的得分。你不能拿 Fred (145) 的分数,因为那只会给你 Gents。

我的问题是,这可以作为一系列 Excel 公式轻松完成,还是我需要使用更程序化的东西?

理想情况下,解决方案需要在团队选择中自动进行,我不想为每个团队创建单独的手工公式。我也不一定有每个俱乐部成员的有序列表。虽然我可能可以通过额外的计算表生成列表。

4

6 回答 6

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

用作包含俱乐部字母的=TopTen(H2,$B$2:$E$30)地方。H2

于 2008-09-13T00:11:22.047 回答
2

这可以作为一系列 Excel 公式轻松完成吗

简短的回答,是的。(取决于您对“轻松”的定义)。

长答案...

(我认为这行得通)

这是我的(简要)测试数据:


    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

现在,如果我对规则的理解正确,我们想要最好的四分,但如果女士或青少年的最高分不在最好的四分之内,我们使用它而不是第四高。我已经重申了一些,原因可能会变得很明显......

好的。数组公式来拯救!(我希望)

a队的最高分应该是

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

其中 {} 表示使用 Control-Shift-Enter 输入公式创建的数组公式。前四名的创建方式类似。对于女士/少年位,我们需要更多的复杂性。以女士为例,我们需要这个:

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

我希望,Junior 可以安全地留给学生作为练习。

我现在正在查看具有以下布局的俱乐部“a”的表格


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

俱乐部得分应该是前三名的“任何人”得分加上最好的女士或青少年(如果她们尚未进入前四名)。

所以在第二季度我把这个:

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

MAX(O2,P2) 告诉我最好的女士或青少年分数,必须包括在内。如果它高于第四高的球队得分,那么它已经在列表中,我们只取前四名。否则,我们用最好的女士/小学生代替第四高的分数。

现在我们可以在一个公式中完成所有操作,将部分代入最终公式:

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

但我不推荐它...

所以对于上述数据,我最终得到了这个:


            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       

大鼠。在我(我认为)让困难的部分工作时感到兴奋时,我忘了提到

  • 分数列表可以按任何顺序排列
  • 您可以使用 RANK() 获得俱乐部排名
  • 然后,您可以使用 MATCH() 和 INDEX() 将前 10 名拉到另一个表中

    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   

A 列和 B 列是我们计算的分数,E 列是俱乐部在决赛桌中的输出顺序。其他公式如下:

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
于 2008-09-15T11:16:55.957 回答
1

我做的是蹩脚的,但它的工作原理。

只需创建一个新列,然后将这个公式插入=If(a1=N,b1,0)其中A1是标准列,N是标准并且B1在您试图从中获取大数据的列中。然后我只是在另一列中做大公式。

有时我会变得很花哨,而不是推出 a N,而是让它说$C$1,然后在该单元格中拼出标准。

完美的答案是让微软添加一个largeifs(请阅读这个微软)

于 2011-09-14T01:04:37.203 回答
0

使用数据透视表作为对您拥有的数据的数据库查询。透视,以便团队沿着列向下移动,团队成员连同他们的状态类型一起穿过透视表。我不确定 2003 年的情况,但 Excel 2007 允许您进行排序,以便最高分出现在左侧。然后你的第一个总和可以简单地为每支球队取前三个分数。但是,要获得最后一人的总和,您必须确定是否可以使用第 4 分,或者是否必须使用初级或女士类型的最大值。这可以使用一个复杂的蛮力公式来完成,有点像这样:

如果(位置 1 的类型是初级或女士或... 2 或 3...)则使用位置 4,否则如果位置 5 是初级或女士,则使用 5,否则如果 p 6 是...,依此类推.

于 2008-09-11T23:52:44.020 回答
0

用 VBA 编写解决方案将是我的首选,尤其是在规则有可能变得更复杂的情况下。

于 2008-09-11T23:54:31.377 回答
0

我认为除非表格以某种方式排序,否则无法做到这一点。Excel 的大多数查找函数都需要有序列表。这当然可以通过 VBA 函数来完成。

于 2008-09-12T00:07:33.110 回答