根据excel中的位置对多个文本列表进行排序
我有多个不同长度的列表,其中包含的项目可能会出现在所有列表中,也可能不会出现在所有列表中。一个项目在列表中出现的越高,它的排名就越好。我一直在试图找到一种方法,从所有列表的组合结果中对项目进行排序。这里有一个例子根据excel中的位置对多个文本列表进行排序,excel,Excel,我有多个不同长度的列表,其中包含的项目可能会出现在所有列表中,也可能不会出现在所有列表中。一个项目在列表中出现的越高,它的排名就越好。我一直在试图找到一种方法,从所有列表的组合结果中对项目进行排序。这里有一个例子 List 1 list 2 list 3 bob jane fred fred peter jane alan fred bob steve brian julie 我
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
那么Bob会有100+70=170,
弗雷德将有100+80+70=250(击败鲍勃并在榜首)
excel中是否有一些函数允许我进行此操作?我在看Vlookups和排名,但似乎没有什么符合要求。我想这很常见,但我一直在四处寻找,找不到答案。
注意:我很乐意用任何语言编写这个函数,但是excel似乎是组织列表的最直接的方法。如果有人有Ruby、Python等的解决方案,我很乐意看一下。
谢谢 我会稍微重新构造数据,然后使用
VLOOKUP
和数据透视表就很容易了
=IF(A13A12,1,C12+1)
=VLOOKUP(C13,$G$1:$H$6,2,0)
我会稍微重新构造数据,然后使用
VLOOKUP
和数据透视表就很容易了
=IF(A13A12,1,C12+1)
=VLOOKUP(C13,$G$1:$H$6,2,0)
索引()
匹配
:
上述公式为:
=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
您可以使用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
为了在此处应用SUMIF,可能使用Record宏的另一种方法是按详细说明“unpivot”,并扩展结果表,如D2所示:
=SUMIF(C:C,C2,A:A)
将列从大到小排序,复制,粘贴特殊…,将值置于顶部,转换为范围,然后根据值列删除重复项。为了应用SUMIF,在这里,可以使用Record宏执行的另一种方法是按详细说明“取消PIVOT”,并在D2中扩展结果表:
=SUMIF(C:C,C2,A:A)
将列从大到小排序,复制,粘贴特殊…,顶部的值,转换为范围,然后根据值列删除重复项。我没有时间给出真正的答案,但请查看Excel中的
匹配功能。在列表中查找项目位置的。然后你就可以总结每个名字的位置了。假设像名字这样的东西在每个列表中只出现一次,那么你的等级之和就是你想要的指标,等等。看看你能不能想出任何涉及或函数的东西。在这种情况下你能定义等级吗?如果在3个列表中,某个东西被放在1、1、7,而另一个东西被放在3、3、3,你是说它们相等吗?我没有时间给出真正的答案,但请查看Excel中的匹配
函数。在列表中查找项目位置的。然后你就可以总结每个名字的位置了。假设像名字这样的东西在每个列表中只出现一次,那么你的等级之和就是你想要的指标,等等。看看你能不能想出任何涉及或函数的东西。在这种情况下你能定义等级吗?如果在3个列表中,某个东西被放在1、1、7,而另一个东西被放在3、3、3,你是说他们是平等的吗???@pnuts高度赞扬确实,我感到荣幸。:)。非常感谢@ScottCraner!这是一个很好的解决方案,但我认为我不能让它起作用。也许我没有解释清楚。由于列表将包含“随机”项,在粘贴到电子表格之前基本上是未知的,因此我需要知道出现了哪些项,然后按照您的建议在F列中手动输入它们。我想这就是上面的工作原理,对吗?继续pnuts推荐,我想我可以将列表编译成一个,然后使用F列中的单个列表。这听起来可行吗?我曾经尝试过这样做,但我想做的只是将列表放到工作表中并自动执行it@boogiewonder给我一点时间,我会一步一步地听pnuts说的话。我现在正在开会,不在办公桌上。@boogiewonder请参见编辑,自动化的唯一方法是使用vba。@ScottCraner我在vba宏上得到了“所需对象”。我试着走过去看看这意味着什么,但没有什么可以继续下去。你知道可能是什么吗?@pnuts高度赞扬的确,我感到荣幸。非常感谢@ScottCraner!这是一个很好的解决方案,但我认为我不能让它起作用。也许我没有解释清楚。由于列表将包含“随机”项,在粘贴到电子表格之前基本上是未知的,因此我需要知道出现了哪些项,然后按照您的建议在F列中手动输入它们。我想这就是上面的工作原理,对吗?继续