Hola a todos!
En el post de hoy voy a tratar un aspecto importante a la hora de trabajar con matrices, esto es, obtener el valor máximo o mínimo en un array (matriz).
No siempre trabajaremos con rangos, donde la obtención del valor máximo o mínimo es sencilla (utilizando las funciones MAX o MIN), muchas veces tenemos que utilizar matrices en nuestros procesos y en ocasiones debemos extraer ciertos valores.
Existen varias formas de hacer este trabajo, aunque hoy os mostraré la que yo suelo utilizar. Dependiendo de si la matriz nos viene creada o la debemos crear nosotros, el proceso será más o menos extenso.
Voy a suponer que tenemos los datos en una hoja Excel y debemos pasarlos a una matriz para luego determinar el valor mínimo y máximo de ese rango:
Ejecutando el siguiente código vamos a poder obtener los datos que necesitamos:
Sub OBTENER_MAX_MIN()
Dim rng As Range, fin As Long, celda As Variant
Dim Scadena As String, listMatriz As Object, nDato As Variant, nCadena As String
Dim oMatriz As Variant, n As Long, Min As Double, Max As Double
'Seleccionamos rango de números
Set rng = Selection
fin = rng.Count
'Componemos un string con los valores seleccionados
For Each celda In rng
If celda <> vbNullString Then
micadena = micadena & " " & celda.Value
End If
Next celda
Scadena = Trim(micadena)
'Si la cadena está vacía salimos del proceso
If Scadena = vbNullString Then Exit Sub
'Pasamos la cadena a un array
Valor = Split(Scadena, " ")
ReDim miArray(0 To UBound(Valor))
For i = 0 To UBound(Valor)
miArray(i) = CDbl(Valor(i))
Next i
'Ordenamos los valores contenidos en el array
Do
Control = True
For i = 0 To UBound(miArray) - 1
If miArray(i) > miArray(i + 1) Then
Control = False
BetaString = miArray(i)
miArray(i) = miArray(i + 1)
miArray(i + 1) = BetaString
End If
'Extraemos los valores min y max
Next i
Loop While Not (Control)
oMatriz = Split(Join(miArray, " "), " ")
For n = LBound(oMatriz) To UBound(oMatriz)
If n = LBound(oMatriz) Then Min = oMatriz(n)
If n = UBound(oMatriz) Then Max = oMatriz(n)
Next
'Mostramos resultado en msgbox
MsgBox ("El valor mínimo es: " & Min & " y el valor máximo es: " & Max)
'Liberamos espacio en memoria
Set listMatriz = Nothing
End Sub
Con esta información, ahora ya podemos obtener los datos que estamos buscando. Dado que sabemos que el primer valor de la cadena es el mínimo y el último el máximo, solo tenemos extraer esa información.
Esto lo podemos hacer de varias formas, pero dado que estamos trabajando con matrices, esta es la solución que voy a utilizar. Pasamos los datos de nuevo a una matriz y mediante un bucle «for-next» y con las funciones LBound y UBound que determinan el inicio de la matriz (siempre es 0) y el final, (en este caso 60, dado que son 60 elementos seleccionados), podemos detectar con un condicional cuando «n» es igual a LBound o «0» y obtendremos el mínimo, y de la misma forma, cuando «n» es igual a UBound obtendremos el máximo valor:
oMatriz = Split(Join(miArray, " "), " ")
For n = LBound(oMatriz) To UBound(oMatriz)
If n = LBound(oMatriz) Then Min = oMatriz(n)
If n = UBound(oMatriz) Then Max = oMatriz(n)
Next
Como habéis podido observar, ya hemos conseguido la información que necesitábamos. Ahora podemos incluir esta información en nuestros procesos o cálculos dado que está contenida en ambas variables (Min y Max).
Para que veáis el resultado de la macro, he pasado los resultados a un msgbox para ver de manera informativa los datos:
Aunque debería haber utilizado directamente un matriz, sin hacer referencia a la hoja ni al rango seleccionado, creo que de esta forma se ilustra mejor el ejemplo.
Otra forma de plantear el ejercicio y reducir el código significativamente es pasando el rango a un array directamente, os dejo el ejemplo como función:
Function MaxMin(ByVal Target As Range)
'Seleccionamos rango de números
Dim MiMatriz As Variant
Dim Max As Double, Min As Double
MiMatriz = Target
Max = WorksheetFunction.Max(MiMatriz)
Min = WorksheetFunction.Min(MiMatriz)
'Mostramos resultado en msgbox
MsgBox ("El valor mínimo es: " & Min & " y el valor máximo es: " & Max)
MaxMin = "El valor mínimo es: " & Min & " y el valor máximo es: " & Max
Set MiRango = Nothing
End Function
Y esto es todo, espero que esta metodología os ayude en vuestros procesos.
Descarga el archivo de ejemplo pulsando en: OBTENER EL VALOR MÁXIMO Y MÍNIMO EN UNA MATRIZ
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!