Funcíon de min y max si (personalizada)

Lo que deseo es crear una fórmula para buscar el valor minimi (min) o máximo (max) evaluando unos criterios y si se cumplen con ellos
Para ello construí la siguiente fórmula que me funciona perfectamente con el max, pero con el min no. Espero me pueda indicar cual es la falla que tengo.
'=====================
Function MaxSI(Criterios As Range, Condicion As String, _
                        Datos As Range) As Double
On Error GoTo Controlar
Dim NumeroFil As Integer
NumeroFil = Application.WorksheetFunction.CountIf(Criterios, Condicion)  
Dim Criterio As Range
ReDim MatrizDatos(NumeroFil) As Double
Dim OtroRango As Range
Dim Siguiente As Integer
Dim Coincide As Boolean
Dim Valor As Double
For Each Criterio In Criterios
    Siguiente = Siguiente + 1
    Coincide = LCase(Criterios(Siguiente)) = LCase(Condicion)
    If Coincide Then
        otro = otro + 1
        MatrizDatos(otro) = Datos(Siguiente)  'Not IsEmpty(Datos.Cells(Siguiente))
        Debug.Print MatrizDatos(otro)
    End If
Next
Valor = (Application.WorksheetFunction.Min(MatrizDatos))
MaxSI = Valor
Salida:
    Exit Function
Controlar:
    MsgBox Err.Description, vbCritical, TituloPer
End Function 
'====================

1 Respuesta

Respuesta
1
Podrías darme datos para probar el código que me enviaste. [email protected]
El ejemplo es el siguiente:
Columna A Columna B
Texto Cantidad
A 10
B 3
A 5
C 7
A 8
...
Lo que deseo es colocar un cirterio en la fórmula para que evalúe la columna criterios (Columna A) y me devuelva el valor min o max de los datos (Columna B)
Como le dije, me esta funcionando con el max, pero con el min NO.
Tal cual como me distes la función solo ubica el valor mínimo y siempre era cero, el valor máximo no lo ubica; esto es porque la linea siguiente tiene solo la función de ubicar el valor mínimo de un conjunto dado:
Valor = (Application.WorksheetFunction.Min(MatrizDatos))
y siempre me daba cero, esto por que estaba definiendo la matriz de la siguiente forma:
ReDim MatrizDatos(NumeroFil) As Double
Si evaluamos el ejemplo que me enviaste y utilizamos como criterio A, entonces esta ocurre tres veces por lo que numerofill vale tres, al definir la matriz con tres, estas creando un vector con CUATRO casillas pues las matrices siempre comienzan en cero si no le les especifica lo contrario, por esto el vector debes definirlo así:
ReDim MatrizDatos(NumeroFil-1) As Double
Luego dentro del ciclo if debes colocar "otro = otro + 1" al final de la sentencia, Le hice otras modificaciones a la función para que ubique el max o min con otra condición lógica en los parámetros, aquí te la dejo:
Function MaxSI(Criterios As Range, Condicion As String, _
                        Datos As Range, Maximo As Boolean) As Double
On Error GoTo Controlar
Dim NumeroFil As Integer
NumeroFil = Application.WorksheetFunction.CountIf(Criterios, Condicion)
Dim Criterio As Range
ReDim MatrizDatos(NumeroFil - 1) As Double
Dim OtroRango As Range
Dim Siguiente As Integer
Dim Coincide As Boolean
Dim Valor As Double
For Each Criterio In Criterios
    Siguiente = Siguiente + 1
    Coincide = LCase(Criterios(Siguiente)) = LCase(Condicion)
    If Coincide Then
        MatrizDatos(otro) = Datos(Siguiente)  'Not IsEmpty(Datos.Cells(Siguiente))
        Debug.Print MatrizDatos(otro)
        otro = otro + 1
    End If
Next
If Maximo Then
    Valor = (Application.WorksheetFunction.Max(MatrizDatos))
Else
    Valor = (Application.WorksheetFunction.Min(MatrizDatos))
End If
MaxSI = Valor
Salida:
    Exit Function
Controlar:
    MsgBox Err.Description, vbCritical, TituloPer
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas