العشرة الأوائل ترتيب في Excel بناءً على قواعد الفريق المعقدة
-
09-06-2019 - |
سؤال
لدي جدول بيانات اكسل بتنسيق مشابه لما يلي ...
| 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.