我有多个不同长度的列表,其中包含可能会或可能不会出现在所有列表中的项目。项目在列表中显示的越高,其排名越高。我一直试图找到一种方法来对所有列表的组合结果中的项目进行排名。这是一个例子
List 1 list 2 list 3
bob jane fred
fred peter jane
alan fred bob
steve brian
julie
我认为排名列可能有助于提供值,所以它会是这样的:
Rankvalue List 1 list 2 list 3
100 bob jane fred
80 fred peter jane
70 alan fred bob
60 steve brian
50 julie
然后鲍勃会有100 + 70 = 170, 弗雷德将有100 + 80 + 70 = 250,(击败鲍勃并超过榜单)
excel中是否有一些功能允许我这样做?我正在看Vlookups和Ranks,但似乎没有什么能达到目标。我想这很常见,但我一直在四处寻找并找不到答案。 注意:我很乐意用任何语言编写这个函数,但excel似乎是组织列表最直接的方法。如果有人有Ruby,Python等解决方案,我很乐意看一下。 谢谢!
答案 0 :(得分:2)
我重新调整了一些数据,然后很容易使用VLOOKUP
和数据透视表。
答案 1 :(得分:2)
您可以使用Index()
Match
:
上面的公式是:
=IFERROR(INDEX(A:A,MATCH(F2,B:B,0)),0)+IFERROR(INDEX(A:A,MATCH(F2,C:C,0)),0)+IFERROR(INDEX(A:A,MATCH(F2,D:D,0)),0)
更短的公式:
=SUMIF(B:B,F2,A:A)+SUMIF(C:C,F2,A:A)+SUMIF(D:D,F2,A:A)
要自动执行所有操作,您需要使用vba。
Sub boogie()
Dim lstrow&
With ActiveSheet
' add a title
.Range("F1") = "List"
.Range("G1") = "Rank"
'Loop through columns of data and paste into one column
For i = 2 To 4
.Range(.Cells(2, i), .Cells(2, i).End(xlDown)).Copy .Cells(.Rows.Count, "F").End(xlUp).Offset(1)
Next i
'Remove Duplicates
lstrow = .Range("F1").End(xlDown).Row
With .Range("F1:F" & lstrow)
.Value = .Value
.RemoveDuplicates Columns:=1, Header:=xlYes
End With
'Add formula and copy down
lstrow = .Range("F1").End(xlDown).Row
.Range("G2").Formula = _
"=SUMIF(B:B,F2,A:A)+SUMIF(C:C,F2,A:A)+SUMIF(D:D,F2,A:A)"
.Range("G2:G" & lstrow).FillDown
.Calculate
'sort
Columns("F:G").Sort key1:=Range("G2"), _
order1:=xlDescending, Header:=xlYes
End With
End Sub
答案 2 :(得分:0)
同样为了在这里应用SUMIF,可以通过Record Macro实现的替代方案是“解开”'详细here并使用,在D2中扩展结果表:
=SUMIF(C:C,C2,A:A)
将ColumnD放大到最小,复制,粘贴特殊...,顶部的值,转换为范围,然后根据值列删除重复项。