24 septiembre, 2023

REALIZAR BUCLES ANIDADOS Y BUSCAR VALORES APROXIMADOS

Hola a todos 🙂

Siguiendo con una consulta recibida el fin de semana pasado, un lector solicitaba una macro que recorriese varias columnas y otro bucle anidado que recorriese las celdas de cada columna. A su vez preguntaba la forma de detectar un importe determinado y las aproximaciones según un rango establecido.

Aunque ya existen en la web algunas macros que realizar este trabajo en parte (realizando algunas modificaciones), creo que puede ser interesante compartir con vosotros un nuevo desarrollo.

Para ejemplificar el ejercicio, imaginad que tenéis una tabla varias columnas identificadas con los meses del año, y en cada columna una serie de importes (podéis poner la moneda que queráis, yo lo he dejado con euros):

REALIZAR BUCLES ANIDADOS Y BUSCAR VALORES APROXIMADOS

Pues bien, necesitamos una macro que nos busque un importe determinado que vamos a colocar en la celda «N2» en el campo denominado IMPORTE y además que detecte aquellos valores que se aproximen a ese número según un rango que establezcamos en la celda «O2» en el campo denominado «APROX».

Para este ejemplo vamos a buscar aquellas celdas que sean igual a 50.000 euros y con aproximaciones de 5.000 euros.

Es decir, debemos marcar además de los 50.000 euros (Rojo), cualquier cifra hasta los 55.000 euros (Verde) y cualquier cifra hasta los 45.000 euros (Azul).

Para ello vamos a usar esta macro que he programado con la que realizaremos el trabajo que nos han pedido:

Sub BUSCAR_VALORES_APROXIMADOS()
'Definimos variables
Dim i As Integer
Dim nNUM As Double
Dim sVAR As Double
'Desactivamos actualizacion de pantalla
Application.ScreenUpdating = False
'Hacemos referencia a la Hoja1 para los cálculos
With Sheets("Hoja1")
'Eliminamos colores de relleno anteriores
.Range("A2", Range("A2").End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Interior.Pattern = xlNone
'Incluimos en las variables cifra a buscar y aproximaciones
nNUM = .Range("N2")
sVAR = .Cells(2, 15)
'Determinamos cuantas columnas tenemos (datos consecutivos)
Fin = Application.CountA(.Range("A1", Range("A1").End(xlToRight)))
'Iniciamos primer bucle por columnas
For i = 1 To Fin
'Determinamos el rango de cada columnas, desde la celda 1 hasta el final con datos
Final = Application.CountA(.Range(Cells(1, i), Cells(1, i).End(xlDown)))
'Iniciamos segundo bucle por celda en cada columna
For j = 2 To Final
'Si el valor de la celda es igual a nNUM marcamos en rojo
If .Cells(j, i) = nNUM Then
.Cells(j, i).Interior.Color = vbRed
'Si el valor de la celda esta entre nNUM y la aproximación en "positivo" marcamos en verde
ElseIf .Cells(j, i) nNUM Then
.Cells(j, i).Interior.Color = RGB(51, 204, 51)
'Si el valor de la celda esta entre nNUM y la aproximación en "negativo" marcamos en azul
ElseIf .Cells(j, i) >= nNUM - sVAR And .Cells(j, i) < nNUM Then
.Cells(j, i).Interior.Color = RGB(60, 144, 246)
End If
Next
Next
.Range("N2").Select
End With
Application.ScreenUpdating = True
End Sub

Como podéis ver, según vais leyendo los comentarios de la macro, mediante dos bucles, uno de ellos anidado, vamos buscando por cada celda según la columna seleccionada los valores que hemos indicado en el condicional.

Esto nos permitirá modificar las condiciones y los parámetros para adaptar el código a nuestras necesidades.

El resultado que se muestra es este:

REALIZAR BUCLES ANIDADOS Y BUSCAR VALORES APROXIMADOS1

Para este ejercicio he utilizado un loop for – next, pero se podría realizar con otros tipos de bucle y otros métodos de búsqueda, por ejemplo con el método Range.Find, etc.Pero creo que esta forma es más adecuada según los parámetros de la consulta.

Es interesante su uso en aplicaciones o informes con grandes cantidades de información y en el que necesitemos resaltar, extraer o modificar valores determinados.

Descarga el archivo de ejemplo pulsando en: REALIZAR BUCLES ANIDADOS Y BUSCAR VALORES APROXIMADOS

 
¿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