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
'Controlamos que seleccionamos un rango de celdas con datos
If fin <= 1 Then Exit Sub
'Componemos una string con los valores seleccionados
For Each celda In rng
sCadena = Trim(sCadena) & " " & celda.Value
Next celda
'Pasamos los datos a una matriz (Lista)
Set listMatriz = CreateObject("System.Collections.ArrayList")
For Each nDato In Split(sCadena, " ")
listMatriz.Add nDato
Next nDato
'Ordenamos los datos
listMatriz.Sort
'Pasamos los datos a una cadena de texto
For Each nDato In listMatriz
nCadena = Trim(nCadena) & " " & nDato
Next nDato
'Convertimos el string en una matriz y con un loop extraemos valor mínimo y máximo
oMatriz = Split([nCadena], " ")
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

Lo verdaderamente importante de la macro es el método utilizado para obtener el valor máximo y mínimo. Es decir, componemos un array:

'Pasamos los datos a una matriz (Lista)
Set listMatriz = CreateObject("System.Collections.ArrayList")
For Each nDato In Split(sCadena, " ")
listMatriz.Add nDato

Next nDato

y ordenamos los datos:

listMatriz.Sort

A continuación volvemos a pasar la información a una cadena de texto con los datos ordenados:

'Pasamos los datos a una cadena de texto
For Each nDato In listMatriz
nCadena = Trim(nCadena) & " " & nDato
Next nDato

En este punto, la información que tenemos es una cadena de texto totalmente ordenada, aquí lo podéis ver mostrando el contenido de la variable nCadena:

OBTENER EL VALOR MAXIMO Y MINIMO EN UNA MATRIZ1

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([nCadena], " ")
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.

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!!

Anuncios

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s