문제

다음과 유사한 형식의 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   |

이 테이블을 "상위 10개" 팀 목록으로 변환해야 합니다.규칙은 다음과 같습니다

  • 각 팀 점수는 해당 클럽 회원 4명의 합계에서 가져옵니다.
  • 이 총점은 다음을 제외하고 최고 4개의 점수로 이루어져야 합니다.
    • 각 팀은 최소 한 명의 주니어 또는 레이디로 구성되어야 합니다.

예를 들어 위 표에서 클럽 A의 팀 점수는 625입니다. ~ 아니다 Harry(190), Bert(150), Jim(150) 및 Simon(130)의 점수를 계산하면 640입니다.Fred의(145) 점수는 Gents만 제공하므로 취할 수 없습니다.

제 질문은 이 작업을 일련의 Excel 수식으로 쉽게 수행할 수 있습니까, 아니면 좀 더 절차적인 방법을 사용해야 합니까?입니다.

이상적으로 솔루션은 팀 선택에서 자동으로 수행되어야 하며 각 팀에 대해 별도의 수작업 공식을 생성할 필요가 없습니다.또한 각 클럽 회원의 깔끔하게 정리된 목록이 반드시 필요하지는 않습니다.아마도 추가 계산 시트를 통해 목록을 생성할 수도 있을 것입니다.

도움이 되었습니까?

해결책

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 클럽 편지가 들어있습니다.

다른 팁

일련의 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

이제 제가 규칙을 올바르게 이해했다면 우리는 최고 4개의 점수를 원합니다. 단, 여자나 주니어의 최고 점수가 최고 4위 안에 들지 않으면 네 번째로 높은 점수 대신 그것을 사용합니다.분명해질 수 있는 이유로 다소 다시 설명했습니다.

좋아요.배열 수식을 사용하여 구출하세요!(나는 희망)

A팀의 최고 점수는 다음과 같아야 한다.

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

여기서 {}는 Ctrl-Shift-Enter를 사용하여 수식을 입력하여 생성된 배열 수식을 나타냅니다.상위 4개도 비슷하게 생성됩니다.Lady/Junior 비트의 경우 좀 더 복잡해져야 합니다.여인을 데려가려면 다음이 필요합니다.

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

주니어는 학생을 위한 운동으로 안전하게 남겨둘 수 있기를 바랍니다.

나는 지금 클럽 "a"에 대한 다음 레이아웃의 테이블을 보고 있습니다.


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

클럽 점수는 "누구나" 점수 상위 3개에 최고의 여성 또는 주니어 점수를 더한 것이어야 합니다. 아직 상위 4위 안에 들지 않았다면.

그래서 2분기에는 다음과 같이 넣을 예정입니다.

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

MAX(O2,P2)는 포함되어야 할 최고의 여성 또는 주니어 점수를 알려줍니다.네 번째로 높은 팀 점수보다 높으면 이미 목록에 있는 것이므로 상위 4개만 선택합니다.그렇지 않으면 네 번째로 높은 점수를 최고의 여성/주니어 점수로 대체합니다.

이제 부분을 최종 공식으로 대체하여 하나의 공식으로 모든 것을 수행할 수 있습니다.

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

내가 하는 일은 형편없지만 효과가 있다.

새 열을 만든 다음 이 수식을 삽입하세요. =If(a1=N,b1,0) 어디 A1 기준 열입니다. N 기준이고 B1 는 큰 값을 얻으려는 열에 있습니다.그런 다음 다른 열에서 큰 수식을 수행합니다.

가끔은 기분이 좋아져서 제품을 출시하는 대신 N, 내가 말하게 해줄게 $C$1, 을 클릭한 다음 해당 셀에 기준을 입력하세요.

완벽한 대답은 Microsoft가 largeifs (이 Microsoft를 읽어보십시오)

특히 규칙이 더 복잡해질 가능성이 있는 경우에는 VBA로 솔루션을 작성하는 것이 첫 번째 선택입니다.

보유한 데이터에 대한 데이터베이스 쿼리 역할을 하는 피벗 테이블을 사용하세요.팀이 열 아래로 내려가고 팀 구성원의 상태 유형이 피벗 테이블을 가로질러 이동하도록 피벗합니다.2003년인지는 잘 모르겠지만 Excel 2007에서는 가장 높은 점수가 왼쪽에 표시되도록 정렬할 수 있습니다.그런 다음 첫 번째 합계는 각 팀의 처음 세 점수를 간단히 취할 수 있습니다.그러나 마지막 사람의 합계를 얻으려면 4번째 점수를 사용할 수 있는지, 아니면 주니어 또는 레이디 유형의 최대값을 사용해야 하는지 결정해야 합니다.이는 다음과 같이 복잡하고 무차별 대입 공식을 사용하여 수행할 수 있습니다.

if (포지션 1의 유형은 후배 또는 여성 또는 ...2~3...) 그런 다음 위치 4를 사용하고 위치 5가 주니어 또는 여성인 경우 그렇지 않으면 p 6이 ...인 경우 5를 사용합니다.등등.

테이블이 어떤 식으로든 정렬되어 있지 않으면 이 작업을 수행할 수 없다고 생각합니다.대부분의 Excel 조회 기능에는 순서가 지정된 목록이 필요합니다.이는 확실히 VBA 기능을 사용하여 수행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top