根据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和数据透视表很容易。

  1. 把你的列表放在彼此之下,就像我的屏幕截图一样(单元格A12:24)。
  2. 在列C中input一个像这样的公式来计算每个不同列表的顺序: =IF(A13<>A12,1,C12+1)
  3. 创build一个RankValue参考表(在我的屏幕截图中为G1:H6),然后在新表的D列中input该公式以获得值: =VLOOKUP(C13,$G$1:$H$6,2,0)
  4. 使用数据透视表来总计RankValue。

这种方法的好处是你不必确定你想要计算的值的名字列表 – 数据透视表是为你做的。

在这里输入图像说明

尽可能多的为了在这里应用SUMIF,另一个可能与Record Macro一起工作的替代方法是在这里详细描述“unpivot”,并在D2中扩展结果表:

  =SUMIF(C:C,C2,A:A) 

将ColumnD最大值设置为最小值,复制,粘贴特殊值,顶部值,转换为范围,然后根据值列删除重复项。