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是波兰语的,但您应该能够:
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))