我在excel中有一个中等大小的数据集,我希望从中提取 B 列中值的最大值,但那些仅对应于 A 列中满足某些条件的单元格的值。
所需的功能类似于SUMIF
or COUNTIF
,但它们都不返回必要的数据。没有MAXIF
功能;我如何模仿一个?
我在excel中有一个中等大小的数据集,我希望从中提取 B 列中值的最大值,但那些仅对应于 A 列中满足某些条件的单元格的值。
所需的功能类似于SUMIF
or COUNTIF
,但它们都不返回必要的数据。没有MAXIF
功能;我如何模仿一个?
您可以使用数组公式。在要计算最大值的单元格中输入: =Max(If([test],[if true],[if false]) 将方括号中的值替换为测试,如果为真则返回什么,如果为假则返回什么。例如:
=MAX(IF(MOD(A2:A25,2)=0,A2:A25,0)
在这个公式中,如果值除以 2 没有余数,我将返回 A 列中的值。请注意,我在比较中使用了一系列单元格,并且在值为 false 时使用了单元格范围,而不是单个单元格。
现在,在编辑单元格的同时,按 Ctrl+Shift+Enter(同时按住 Ctrl 键和 Shift 键,然后按 Enter)。
这将创建一个作用于范围内每个值的数组公式。
顺便说一句,您想以编程方式还是手动执行此操作?如果以编程方式,那么您使用的是什么环境?VBA?C#?
编辑如果通过 VBA,您需要使用 FormulaArray 属性和 R1C1 引用,如下所示:
Range("A1").Select
Selection.FormulaArray = "=MAX(IF(MOD(R[1]C:R[24]C,2)=0,R[1]C:R[24]C,0))"
当您想使用动态或命名范围时,数组公式不能很好地工作(例如,“当前行上方与当前行具有相同交易对手的行的最大应付金额)。如果您不想使用一个数组公式,你总是可以求助于 VBA 来做这样的事情:
Function maxIfs(maxRange As Range, criteriaRange As Range, criterion As Variant) As Variant
maxIfs = Empty
For i = 1 To maxRange.Cells.Count
If criteriaRange.Cells(i).Value = criterion Then
If maxIfs = Empty Then
maxIfs = maxRange.Cells(i).Value
Else
maxIfs = Application.WorksheetFunction.Max(maxIfs, maxRange.Cells(i).Value)
End If
End If
Next
End Function
到目前为止提供的代码的一个限制是您受限于 2 个条件。我决定进一步使用此代码,以不限制 MaxIfs 函数的条件数量。请在此处查看代码:
Function MaxIfs(MaxRange As Range, ParamArray Criteria() As Variant) As Variant
Dim n As Long
Dim i As Long
Dim c As Long
Dim f As Boolean
Dim w() As Long
Dim k As Long
Dim z As Variant
'Error if less than 1 criteria
On Error GoTo ErrHandler
n = UBound(Criteria)
If n < 1 Then
'too few criteria
GoTo ErrHandler
End If
'Define k
k = 0
'Loop through cells of max range
For i = 1 To MaxRange.Count
'Start by assuming there is a match
f = True
'Loop through conditions
For c = 0 To n - 1 Step 2
'Does cell in criteria range match condition?
If Criteria(c).Cells(i).Value <> Criteria(c + 1) Then
f = False
End If
Next c
'Define z
z = MaxRange
'Were all criteria satisfied?
If f Then
k = k + 1
ReDim Preserve w(k)
w(k) = z(i, 1)
End If
Next i
MaxIfs = Application.Max(w)
Exit Function
ErrHandler:
MaxIfs = CVErr(xlErrValue)
End Function
此代码允许 1 到多个条件。
此代码是参考 Hans V 在 Eileen's Lounge 发布的多个代码开发的。
快乐编码
迪德里希