20 octubre, 2021

OBTENER EL VALOR MÁXIMO Y MÍNIMO EN UNA MATRIZ

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:

OBTENER EL VALOR MAXIMO Y MINIMO EN UNA MATRIZ

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:

OBTENER EL VALOR MAXIMO Y MINIMO EN UNA MATRIZ2

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.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies