根据excel中的位置排列多个文本列表
我有不同长度的多个列表,其中包含可能会或可能不会出现在所有列表中的项目。 一个项目出现在列表中的越高,排名越好。 我一直在试图find从所有列表的组合结果中排列项目的方法。 这是一个例子
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等的解决scheme,我会很乐意看看它。 谢谢!
你可以使用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
我会重新构造一些数据,然后使用VLOOKUP
和数据透视表很容易。
- 把你的列表放在彼此之下,就像我的屏幕截图一样(单元格A12:24)。
- 在列C中input一个像这样的公式来计算每个不同列表的顺序:
=IF(A13<>A12,1,C12+1)
- 创build一个RankValue参考表(在我的屏幕截图中为G1:H6),然后在新表的D列中input该公式以获得值:
=VLOOKUP(C13,$G$1:$H$6,2,0)
- 使用数据透视表来总计RankValue。
这种方法的好处是你不必确定你想要计算的值的名字列表 – 数据透视表是为你做的。
尽可能多的为了在这里应用SUMIF,另一个可能与Record Macro一起工作的替代方法是在这里详细描述“unpivot”,并在D2中扩展结果表:
=SUMIF(C:C,C2,A:A)
将ColumnD最大值设置为最小值,复制,粘贴特殊值,顶部值,转换为范围,然后根据值列删除重复项。