5

中有一个中等大小的数据集,我希望从中提取 B 列中值的最大值,但那些仅对应于 A 列中满足某些条件的单元格的值。

所需的功能类似于SUMIFor COUNTIF,但它们都不返回必要的数据。没有MAXIF功能;我如何模仿一个?

4

3 回答 3

5

您可以使用数组公式。在要计算最大值的单元格中输入: =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))"
于 2010-03-23T03:50:54.220 回答
3

当您想使用动态或命名范围时,数组公式不能很好地工作(例如,“当前行上方与当前行具有相同交易对手的行的最大应付金额)。如果您不想使用一个数组公式,你总是可以求助于 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
于 2014-01-24T23:06:50.420 回答
1

到目前为止提供的代码的一个限制是您受限于 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 发布的多个代码开发的。

快乐编码

迪德里希

于 2016-12-12T02:55:39.157 回答