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   |

この表を「トップ10」チームのリストに変換する必要があります。ルールは

  • 各チームのスコアは、そのクラブの4人のメンバーの合計から取得されます。
  • これらの合計は、以下を除いて最高の4つのスコアである必要があります...
    • 各チームは、少なくとも1人のジュニアまたはレディで構成されている必要があります

たとえば、上の表では、ハリー(190)、バート(150)、ジム(150)、サイモン(130)のスコアを取得するため、クラブAのチームスコアは640ではなく625になります。フレッド(145)のスコアを取ることはできませんでした。それは、紳士だけを与えるからです。

私の質問は、これを一連のExcel数式として簡単に実行できるか、それとももっと手続き的なものを使用する必要があるかということです。

理想的には、ソリューションはチームの選択で自動的に行われる必要があります。チームごとに個別の手作りの数式を作成する必要はありません。また、必ずしも各クラブ会員のリストがきちんと整理されているとは限りません。私はおそらく追加の計算シートを介してリストを生成することができましたが。

4

6 に答える 6

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

さて、ルールを正しく理解していれば、最高の4つのスコアが必要です。ただし、女性またはジュニアの最高スコアが最高の4に含まれていない場合は、4番目に高いスコアの代わりにそれを使用します。明らかになるかもしれない理由のために、私はそれをいくらか言い直しました...

わかった。救助のための配列数式!(私は願います)

チームaからの最高スコアは

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

ここで、{}は、Control-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番目に高い場合は、すでにリストに含まれているため、上位4つを取得します。それ以外の場合は、4番目に高いスコアを最高の女性/ジュニアスコアに置き換えます。

これで、パーツを最終的な数式に代入することで、すべてを1つの数式で実行できます。

{=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 に答える
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 に答える
1

私がしていることは不自由ですが、うまくいきます。

新しい列を作成してから、基準列、基準、および大きい値を取得しようとしている列にある=If(a1=N,b1,0)この数式を挿入するだけです。次に、別の列で大きな数式を実行します。A1NB1

ときどき気まぐれになり、 を展開する代わりにN、 を言わ$C$1せ、そのセルに基準を綴ります。

完璧な答えは、Microsoft に追加してもらうことですlargeifs(この Microsoft を読んでください)。

于 2011-09-14T01:04:37.203 に答える
0

テーブルが何らかの方法でソートされていない限り、これは実行できないと思います。Excel のルックアップ関数のほとんどは、順序付きリストを必要とします。これは確かに VBA 関数で実行できます。

于 2008-09-12T00:07:33.110 に答える
0

持っているデータに対するデータベース クエリとして機能するピボット テーブルを使用します。チームが列を下に移動し、チーム メンバーがステータス タイプとともにピボット テーブルを横切るようにピボットします。2003 についてはわかりませんが、Excel 2007 では並べ替えが可能で、最高スコアが左側に表示されます。次に、最初の合計は、各チームの最初の 3 つのスコアを取ることができます。ただし、最後の人の合計を取得するには、4 番目のスコアを使用できるかどうか、またはジュニアまたはレディ タイプの最大値を使用する必要があるかどうかを判断する必要があります。これは、次のような複雑で強引な式を使用して行うことができます。

if (ポジション 1 のタイプがジュニアまたはレディまたは ... 2 または 3... ) の場合はポジション 4 を使用し、ポジション 5 がジュニアまたはレディの場合は 5 を使用し、p 6 が ... の場合は 5 を使用します。 .

于 2008-09-11T23:52:44.020 に答える
0

特にルールがより複雑になる可能性がある場合は、VBA でソリューションを作成することを第一に考えます。

于 2008-09-11T23:54:31.377 に答える