Vba 从Excel中有多个优胜者的一行中选择一个得分优胜者

Vba 从Excel中有多个优胜者的一行中选择一个得分优胜者,vba,excel,Vba,Excel,我有一组如下所示的数据,想自动找到获胜者 A B C D E 1 2 3 4 5 我使用了索引功能: INDEX($A$1:$E$1,1,MATCH(LARGE($A$2:$E$2,1),$A$2:$E$2,0)) 这确实告诉我获胜者是E 但是,假设下一个数据集表明A和E的得分相同: A B C D E 5 2 3 4 5 使用上述公式,我无法同时获得A和E作为优胜者 是否可以嵌套一个IF函数和conact,这样在我的winners专栏中它可以说: A、 我想到的最简单的想法是: 选择

我有一组如下所示的数据,想自动找到获胜者

A B C D E 
1 2 3 4 5
我使用了
索引
功能:

INDEX($A$1:$E$1,1,MATCH(LARGE($A$2:$E$2,1),$A$2:$E$2,0))
这确实告诉我获胜者是E

但是,假设下一个数据集表明A和E的得分相同:

A B C D E 
5 2 3 4 5
使用上述公式,我无法同时获得A和E作为优胜者

是否可以嵌套一个IF函数和conact,这样在我的winners专栏中它可以说:
A、 我想到的最简单的想法是:

选择一些空单元格,例如
G1
,然后将以下公式粘贴到其中:

=MAX(A1:E1)
然后应用于range:color单元格,如果它等于
G1
(您可以输入公式本身
=MAX(A1:E1)
,而不是
G1
,但对我来说,它给出了意外的结果)

这样,所有获奖者将在价值变化后立即突出显示

更新

您可以使用稍微不同的条件格式:

很抱歉,我的Excel是波兰语的,但您应该能够:

  • 单击条件格式

  • 扩展最大/最小规则(或类似规则)

  • 单击“10个第一要素”或类似的内容

  • 在弹出窗口(屏幕上的第二个)中,从10更改为1

  • 现在您有了所需的格式。现在,您需要分别为每一行复制和粘贴此特殊格式

    第二次更新

    要轻松地将其应用于所有行,可以执行以下操作:

    录制一个宏,开始录制后,选择A1:E1行,应用前面描述的条件格式,停止录制并打开宏的代码,应如下所示:

    Sub Makro1()
    '
    ' Macro1 Macro
    '
    
    '
        Range("A1:E1").Select
        Range("E1").Activate
        Selection.FormatConditions.AddTop10
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .TopBottom = xlTop10Top
            .Rank = 1
            .Percent = False
        End With
        With Selection.FormatConditions(1).Font
            .Color = -16383844
            .TintAndShade = 0
        End With
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .Color = 13551615
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
    End Sub
    
    现在,我们将以这种方式对其进行修改,以便将所需的条件格式自动应用于所有行:

    Option Explicit
    Sub ApplyConditionalFormatting()
        Dim r As Range, lastRow As Long, i As Long
        lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
        For i = 1 To lastRow
    
            Set r = Range(Cells(i, 1), Cells(i, 5))
    
            r.FormatConditions.AddTop10
            r.FormatConditions(r.FormatConditions.Count).SetFirstPriority
            With r.FormatConditions(1)
                .TopBottom = xlTop10Top
                .Rank = 1
                .Percent = False
            End With
            With r.FormatConditions(1).Font
                .Color = -16383844
                .TintAndShade = 0
            End With
            With r.FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 13551615
                .TintAndShade = 0
            End With
            r.FormatConditions(1).StopIfTrue = False
    
        Next
    End Sub
    

    我只是为循环了
    ,并将所有记录的代码放入该循环,因此它将宏应用于所有行:)

    临时数组公式

    复制下来的数组公式如何(例如从单元格F2开始):

    =SUM(大)(如果(A2:E2=MAX(A2:E2),列(A2:E2),0),列(A2:E2))*10^(列(A2:E2)-1)

    (注意表示数组公式输入正确的花括号{}!)

    结果返回例如
    15
    ,即数字1根据您的示例数据
    5 2 3 4 5
    (在A:e列中)显示第5列的第一位和下一位数字为获胜

    如果在A:e列中出现例如
    1 5 4 5
    ,则结果为► <代码>235
    显示第二、第三和第五列为获胜

    *注意:限制为10个单位数(10列),因为在本例中它使用十进制数字系统(可以修改)

    编辑1-显示带有列字母的逗号分隔字符串

    使用重复的
    SUBSTITUTE
    函数并不是最优雅的做法,但它可以满足这一数量有限的列:

    =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUM(LARGE(IF(A2:E2=MAX(A2:E2),COLUMN(A2:E2),0),COLUMN(A2:E2))*10^(COLUMN(A2:E2)-1)),1,"A,"),2,"B,"),3,"C,"),4,"D,"),5,"E,")&"#",",#","")
    
    A:e
    列中出现例如
    1 5 4 5
    将导致►
    B、C、E
    将获胜列字母显示为逗号分隔的字符串

    编辑2-使用十六进制数字系统(不带逗号)的超薄备选方案

    这种方法使用十六进制系统用字母数字A到F编码大于9的数字,并简单地将9添加到找到的列值中:

    =DEC2HEX(SUM(LARGE(IF(A2:E2=MAX(A2:E2),COLUMN(A2:E2)+9,0),COLUMN(A2:E2))*16^(COLUMN(A2:E2)-1)))
    
    A:e
    列中出现例如
    1 5 4 5
    将导致► <代码>BCE通过巧妙使用十六进制数字转换


    享受它:-)

    这个
    索引
    公式只能返回一个结果,我认为如果不使用VBA,您无法解决这个问题。因此,请自己开始编写代码,如果遇到问题,请带着代码和相关问题返回。尽量避免在vba上花费时间:(最好是开始吧…@pablo144-编辑一行数组公式来解决您的问题。
    “=A2=MAX($a$2:$E$2)”
    适用于范围$a$1:$E$2:-)+1仅适用于一行的格律,但我的数据集在100行以上被破坏,因此不适合:(@pablo144您希望赢家按行排列,还是整个表都有一个赢家?@T.M.您的公式的问题是,行也是由
    $
    固定的。因此,您可以固定列以将其限制在列A到列E,但您至少需要保持行的动态,如
    =A2=MAX($A2:$E2)
    使其适用于多于第2行。@MichałTurczyn我对公式
    =A2=MAX(2:2)
    =A2=MAX($A2:$E2)没有任何问题
    直接作为条件格式规则。例如,如果数据在A2:E100范围内,则只需选择该范围并添加一个条件,其中一个公式对我非常有效。这看起来很有希望……但需要一种方法来显示AE vs 15,并且找到一种方法在其中连接逗号将是理想的:)没有办法在输出中添加逗号或其他东西吗?如果行数较大,235很容易被误解为多个数字,因为这不是选美比赛。您可以使用重复的
    SUBSTITUTE
    函数将
    SUM
    结果转换为逗号分隔的字符串:
    =SUBSTITUTE(SUBSTITUTE)(SUBSTITUTE(替换(替换)(替换(SUM)(大的)(如果(A2:E2=MAX(A2:E2),列(A2:E2),0),列(A2:E2))*10^(列(A2:E2)-1),1,“A”,2,“B”,3,“C”,4,“D”,5,“E”),和“#”,”,#“,”)
    @T.M.非常感谢。我正试着想解决这个问题——比如说,我在开头加了一列名字(列A),所以现在我想做同样的事情,但是从B2:F2开始。它似乎不喜欢这样,我也不明白why@pablo144-不客气。-至于你的附加问题:如果你有一个插入的列A,你可以使用
    =SUM(大)(如果(B2:F2=MAX(B2:F2),列($A2:$E2),0),列($A2:$E2))*10^(列($A2:$E2)-1))