Return 一组中的最大值
Return largest value in a group
我正在尝试索引并 return 与给定产品的最大销售部分对应的收益值。
下面的传播sheet是我正在处理的sheet的一个非常简化的版本。
以产品 2 为例。产品 2 已售出 2 个销售部分(一个 40% 的产品,另一个 60% 的产品)。我需要在 D 列中输入每种产品的最大销售部分的收益值。因此,对于产品 2,60% 的销售部分是最大的销售部分,相应的收益值为 40。
我已经尝试使用多个公式,包括 RANK
、COUNTIF
、INDEX(MATCH())
,但似乎无法弄清楚如何去做。
我的第一个想法是有一个辅助列,其中的公式类似于
COUNTIFS($A:$A,A2,RANK(B2,$B:$B),)
然后我可以很容易地 return 我需要的值,在下一列中使用一个简单的 IF
函数。
但是显然这个函数是废话,少了一个词,不起作用
有没有人有什么想法?
这是一种方法。这是一个数组公式,因此必须按 ctrl+shift+enter
输入
在D2中输入公式,然后复制下来。
=INDEX($C:$C,MATCH(LARGE(IF($A:$A=A2,$B:$B,0),1),IF($A:$A=A2,$B:$B,0),0))
辅助列的另一个选项
helper(在 D2 中)returns 0 如果它是最大行
=COUNTIFS($A:$A,A2,$B:$B,">"&B2)
解决方案(E2)
=AVERAGEIFS($C:$C,$A:$A,A2,$D:$D,0)
如果有 2 个同样高的值,则使用平均值 return 平均值,否则它只是 1 个单元格的平均值。
复制下面的公式到D2单元格
=MAX(OFFSET($C,MATCH(A1,A:A,0)-1,0,COUNTIF(A:A,A1),1))
然后复制D2再粘贴
以上公式仅在 A 列数字已排序时有效
如果您觉得 table 使用 VBA 很舒服,您可以编写一个函数来为您完成这项工作。如果将以下代码放入模块中,您可以指定要分组的值范围(在您的情况下为产品编号列表),要过滤的条件(要评估的产品编号),以及您要比较的值。通过将每个范围保存到一个数组中,您可以遍历值列表并找到具有您指定的产品编号的最大值。
Function Maxif(GroupRange As Range, Criteria As Variant, ValuesRange As Range)
Dim i As Integer
Dim Groupings As Variant
Dim Value As Variant
Groupings = Array()
Values = Array()
Groupings = GroupRange
Values = ValuesRange
Maxif = "#N/A"
For i = 1 To UBound(Groupings, 1)
If Maxif = "#N/A" Then
If Groupings(i, 1) = Criteria Then
Maxif = Values(i, 1)
Else:
End If
Else:
If (Groupings(i, 1) = Criteria And Values(i, 1) > Maxif) Then
Maxif = Values(i, 1)
Else:
End If
End If
Next i
End Function
它遵循与 countif、sumif 等相同的逻辑。因此 Maxif(A2:A11, A3, C2:C11) 将 return 60%,乘积 2 的最大值。
从那里,如果您需要查找收益,您可以在 A 列之前插入一列,连接该列中的产品和售出百分比,然后对与最大售出百分比连接的产品进行 vlookup 以查找相应收益。
例如:
然后您的摘要 table 将如下所示:
无论您如何对 sheet 进行排序,这都有效。
我正在尝试索引并 return 与给定产品的最大销售部分对应的收益值。
下面的传播sheet是我正在处理的sheet的一个非常简化的版本。
以产品 2 为例。产品 2 已售出 2 个销售部分(一个 40% 的产品,另一个 60% 的产品)。我需要在 D 列中输入每种产品的最大销售部分的收益值。因此,对于产品 2,60% 的销售部分是最大的销售部分,相应的收益值为 40。
我已经尝试使用多个公式,包括 RANK
、COUNTIF
、INDEX(MATCH())
,但似乎无法弄清楚如何去做。
我的第一个想法是有一个辅助列,其中的公式类似于
COUNTIFS($A:$A,A2,RANK(B2,$B:$B),)
然后我可以很容易地 return 我需要的值,在下一列中使用一个简单的 IF
函数。
但是显然这个函数是废话,少了一个词,不起作用
有没有人有什么想法?
这是一种方法。这是一个数组公式,因此必须按 ctrl+shift+enter
输入在D2中输入公式,然后复制下来。
=INDEX($C:$C,MATCH(LARGE(IF($A:$A=A2,$B:$B,0),1),IF($A:$A=A2,$B:$B,0),0))
辅助列的另一个选项
helper(在 D2 中)returns 0 如果它是最大行
=COUNTIFS($A:$A,A2,$B:$B,">"&B2)
解决方案(E2)
=AVERAGEIFS($C:$C,$A:$A,A2,$D:$D,0)
如果有 2 个同样高的值,则使用平均值 return 平均值,否则它只是 1 个单元格的平均值。
复制下面的公式到D2单元格
=MAX(OFFSET($C,MATCH(A1,A:A,0)-1,0,COUNTIF(A:A,A1),1))
然后复制D2再粘贴
以上公式仅在 A 列数字已排序时有效
如果您觉得 table 使用 VBA 很舒服,您可以编写一个函数来为您完成这项工作。如果将以下代码放入模块中,您可以指定要分组的值范围(在您的情况下为产品编号列表),要过滤的条件(要评估的产品编号),以及您要比较的值。通过将每个范围保存到一个数组中,您可以遍历值列表并找到具有您指定的产品编号的最大值。
Function Maxif(GroupRange As Range, Criteria As Variant, ValuesRange As Range)
Dim i As Integer
Dim Groupings As Variant
Dim Value As Variant
Groupings = Array()
Values = Array()
Groupings = GroupRange
Values = ValuesRange
Maxif = "#N/A"
For i = 1 To UBound(Groupings, 1)
If Maxif = "#N/A" Then
If Groupings(i, 1) = Criteria Then
Maxif = Values(i, 1)
Else:
End If
Else:
If (Groupings(i, 1) = Criteria And Values(i, 1) > Maxif) Then
Maxif = Values(i, 1)
Else:
End If
End If
Next i
End Function
它遵循与 countif、sumif 等相同的逻辑。因此 Maxif(A2:A11, A3, C2:C11) 将 return 60%,乘积 2 的最大值。
从那里,如果您需要查找收益,您可以在 A 列之前插入一列,连接该列中的产品和售出百分比,然后对与最大售出百分比连接的产品进行 vlookup 以查找相应收益。
例如:
然后您的摘要 table 将如下所示:
无论您如何对 sheet 进行排序,这都有效。