복잡한 팀 규칙에 따른 Excel의 상위 10개 순서
-
09-06-2019 - |
문제
다음과 유사한 형식의 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 기능을 사용하여 수행할 수 있습니다.