Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据excel中的位置对多个文本列表进行排序_Excel - Fatal编程技术网

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

  • 按照我截图(单元格A12:24)中的顺序,将列表放在彼此下方
  • 在C列中输入这样的公式来计算每个不同列表的顺序:
    =IF(A13A12,1,C12+1)
  • 创建一个RankValue参考表(我的屏幕截图中的G1:H6),然后在新表的D列中输入以下公式以获得值:
    =VLOOKUP(C13,$G$1:$H$6,2,0)
  • 使用数据透视表对总RankValue求和
  • 这种方法的好处是,您不必确定要为其计算值的名称列表,数据透视表会为您完成这项工作


    我会稍微重新构造数据,然后使用
    VLOOKUP
    和数据透视表就很容易了

  • 按照我截图(单元格A12:24)中的顺序,将列表放在彼此下方
  • 在C列中输入这样的公式来计算每个不同列表的顺序:
    =IF(A13A12,1,C12+1)
  • 创建一个RankValue参考表(我的屏幕截图中的G1:H6),然后在新表的D列中输入以下公式以获得值:
    =VLOOKUP(C13,$G$1:$H$6,2,0)
  • 使用数据透视表对总RankValue求和
  • 这种方法的好处是,您不必确定要为其计算值的名称列表,数据透视表会为您完成这项工作

    您可以使用
    索引()
    匹配

    上述公式为:

    =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列中手动输入它们。我想这就是上面的工作原理,对吗?继续