在Excel中连续选择有多个获奖者的获奖者

时间:2018-08-17 08:55:43

标签: excel vba excel-vba

我有以下数据,希望自动找到赢家。

A B C D E 
1 2 3 4 5

我使用了INDEX函数:

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函数并使其简洁,以便在我的获奖者栏中可以说: A,E?

2 个答案:

答案 0 :(得分:3)

我想到的最简单的主意是:

选择一些空单元格,例如G1并粘贴以下公式:

=MAX(A1:E1)

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

这样,所有赢家将在价值改变后立即突出显示。

更新

您可能使用的条件格式略有不同:

enter image description here

对不起,我的Excel是波兰语,但是您应该可以按照以下步骤操作:

  1. 点击条件格式

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

  3. 点击“前10个元素”或类似的内容

  4. 在弹出窗口中(屏幕上的第二个数字)从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

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

答案 1 :(得分:3)

改进的数组公式

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

=SUM(LARGE(IF(A2:E2=MAX(A2:E2),COLUMN(A2:E2),0),COLUMN(A2:E2))*10^(COLUMN(A2:E2)-1)

(请注意用大括号{}表示正确输入数组公式!)

结果返回例如15,即根据您的示例数据5 2 3 4 5(在A:E列中),第一个数字的第一位显示第一位,第五位显示第二位。

如果发生,例如1 5 5 4 5在A:E列中,结果将是►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,")&"#",",#","")

例如1 5 5 4 5列中的A:E将在►B,C,E中显示胜出的列字母,以逗号分隔的字符串。

编辑2-使用十六进制数的苗条替代方式(不带逗号)

这种方法利用了这样的事实,即十六进制系统代码将数字> 9以及字母数字字符A到F并简单地将9添加到找到的列值中:

=DEC2HEX(SUM(LARGE(IF(A2:E2=MAX(A2:E2),COLUMN(A2:E2)+9,0),COLUMN(A2:E2))*16^(COLUMN(A2:E2)-1)))

例如在1 5 5 4 5列中的A:E将通过巧妙地使用十六进制数字转换在►BCE中产生。

享受它:-)