2010-03-23 24 views
5

Tengo un conjunto de datos de tamaño moderado en del cual deseo extraer el valor máximo de los valores en la Columna B, pero aquellos que corresponden solo a las celdas en la Columna A que satisfacen ciertos criterios.¿Función o emulación MAXIF de Excel?

La funcionalidad deseada es similar a la de SUMIF o COUNTIF, pero ninguno de esos devuelve datos que sean necesarios. No hay una función MAXIF; ¿cómo emulo uno?

Respuesta

5

Puede usar una fórmula de matriz. En la celda en la que desea calcular el máximo ingrese: = Máx. (If ([prueba], [si es verdadero], [si es falso]) donde reemplaza los valores entre corchetes con la prueba, lo que volver si verdadero y lo que para volver si es falso por ejemplo:.

=MAX(IF(MOD(A2:A25,2)=0,A2:A25,0) 

en esta fórmula I devolver el valor en la columna a si el valor dividido por 2 no tiene resto Nótese que yo uso. un rango de celdas en mi comparación y en el valor si es falso en lugar de una sola celda.

Ahora, mientras edita la celda, presione Ctrl + Shift + Enter (mantenga presionada la tecla Ctrl y la tecla Shift para juntar y luego presionar enter).

Esto crea una fórmula de matriz que actúa sobre cada valor en el rango.

EDIT BTW, ¿desea hacer esto programáticamente o manualmente? Si programáticamente, ¿qué entorno estás usando? VBA? DO#?

EDITAR Si a través de VBA, es necesario utilizar la propiedad FormulaArray y referencias R1C1 así:

Range("A1").Select 
Selection.FormulaArray = "=MAX(IF(MOD(R[1]C:R[24]C,2)=0,R[1]C:R[24]C,0))" 
3

Fórmulas de matriz no funcionan muy bien cuando se desea utilizar rangos dinámicos o con nombre (por ejemplo, , "la cantidad máxima adeudada para filas encima de la fila actual que tiene la misma contraparte que la fila actual). Si no desea utilizar una fórmula de matriz, siempre puede recurrir a VBA para hacer algo como esto:

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 
1

A limi tación con el código provisto hasta el momento es que está restringido a 2 condiciones. Decidí seguir este código para no restringir el número de condiciones para la función MaxIfs. Por favor, consulte el código aquí:

 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 

Este código permite 1 a múltiples condiciones.

Este código fue desarrollado con referencia al código múltiple publicado por Hans V en Eileen's Lounge.

feliz de codificación

Diedrich

Cuestiones relacionadas