العشرة الأوائل ترتيب في Excel بناءً على قواعد الفريق المعقدة

StackOverflow https://stackoverflow.com/questions/57927

سؤال

لدي جدول بيانات اكسل بتنسيق مشابه لما يلي ...

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

أحتاج إلى تحويل هذا الجدول إلى قائمة فرق "العشرة الأوائل".القواعد هي

  • يتم أخذ نتيجة كل فريق من مجموع أربعة أعضاء في ذلك النادي.
  • يجب أن تكون هذه المجاميع من أفضل أربع درجات باستثناء ...
    • يجب أن يتكون كل فريق من مبتدئ أو سيدة واحدة على الأقل

على سبيل المثال، في الجدول أعلاه، ستكون نتيجة الفريق للنادي "أ" 625 لا 640 كما لو كنت ستأخذ درجات هاري (190) وبيرت (150) وجيم (150) وسيمون (130).لا يمكنك الحصول على درجة فريد (145) لأن ذلك سيمنحك للرجال فقط.

سؤالي هو، هل يمكن القيام بذلك بسهولة كسلسلة من صيغ 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

الآن، إذا فهمت القواعد بشكل صحيح، نريد أفضل أربع درجات، باستثناء أنه إذا كانت أعلى درجة لسيدة أو شابة ليست ضمن أفضل أربع نقاط، فإننا نستخدم ذلك بدلاً من رابع أعلى درجة.لقد كررت ذلك إلى حد ما، لأسباب قد تصبح واضحة.

نعم.صفيف الصيغ للإنقاذ!(آمل)

يجب أن تكون أعلى الدرجات من الفريق أ

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

آمل أن يتم ترك جونيور بأمان كتمرين للطالب.

أنا الآن أنظر إلى جدول بالتخطيط التالي للنادي "أ"


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

يجب أن تكون نتيجة النادي هي أعلى ثلاث نقاط من "أي شخص" بالإضافة إلى أفضل سيدة أو ناشئة إذا لم يكونوا بالفعل في المراكز الأربعة الأولى.

لذلك في Q2 أضع هذا:

=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()

    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 (يرجى قراءة هذا مايكروسوفت)

إن كتابة الحل باستخدام VBA سيكون خياري الأول، خاصة إذا كانت القواعد لديها إمكانية أن تصبح أكثر تعقيدًا.

استخدم جدولاً محوريًا والذي سيكون بمثابة استعلام قاعدة بيانات للبيانات المتوفرة لديك.قم بالتدوير بحيث تنتقل الفرق إلى أسفل الأعمدة وينتقل أعضاء الفريق مع نوع حالتهم عبر الجدول المحوري.لست متأكدًا من عام 2003، لكن Excel 2007 يتيح لك الفرز بحيث تظهر أعلى الدرجات على اليسار.بعد ذلك، يمكن لمجموعك الأول أن يحصل ببساطة على الدرجات الثلاث الأولى لكل فريق.ومع ذلك، للحصول على مجموع الأشخاص الأخيرين، عليك تحديد ما إذا كان بإمكانك استخدام النتيجة الرابعة، أو إذا كان عليك استخدام الحد الأقصى من أنواع الصغار أو السيدات.يمكن القيام بذلك باستخدام صيغة القوة المعقدة والغاشمة إلى حد ما مثل هذا:

إذا (نوع المنصب 1 هو مبتدئ أو سيدة أو ...2 أو 3...) ثم استخدم الموضع 4 وإلا إذا كان الموضع 5 صغيرًا أو سيدة، فاستخدم 5 إذا كان p 6 هو ...وما إلى ذلك وهلم جرا.

لا أعتقد أن هذا يمكن القيام به ما لم يتم فرز الجدول بطريقة ما.تتطلب معظم وظائف البحث في Excel قوائم مرتبة.يمكن بالتأكيد القيام بذلك باستخدام وظيفة VBA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top