Hola a todos 😉
¿Qué tal os va?, espero que muy bien!
Hoy os voy a realizar un sencillo ejemplo de cómo podemos utilizar una matriz en un loop for-next. Esto viene por una consulta de un lector que me preguntaba acerca de cómo podía utilizar una matriz en un bucle.
En Excel Signum hay varios post dedicados a tipos de bucles o loops, algo fundamental en la programación y en el análisis de datos en particular. Os invito a que les echéis un vistazo.
Vamos a ver un ejemplo con el que podamos utilizar un for y también una matriz para determinar el inicio y fin de ese proceso. Imaginad que tenéis un listado con los siguientes campos, ID, NOMBRE COMPLETO Y FECHA DE NACIMIENTO:
Y debemos indicar la edad de cada persona en la columna EDAD. Para hacerlo vamos a utilizar un código que he programado y que nos incorporará la edad con un formato muy particular. Esta es la macro que vamos a utilizar:
Sub MATRIZ_EN_LOOP()
'Definimos variables
Dim i As Integer, fin As Long, hoy As String, f_nac As String
Dim año As Integer, mes As Integer, dia As Integer
Dim Matriz As Variant
'Seleccionamos la hoja1
With Sheets("Hoja1")
fin = .Range("A" & Rows.Count).End(xlUp).Row
'Componemos la matriz a partir del rango definido
Matriz = .Range("A1:A" & fin)
'Iniciamos el loop for-next utilizando la variable matriz para definir el inicio y el final
For i = LBound(Matriz) + 1 To UBound(Matriz)
'Indicamos la fecha de hoy con formato mm/dd/aaaa y lo componemos en un string
hoy = (Month(Date) & "/" & Day(Date) & "/" & Year(Date))
'Indicamos la fecha de nacimiento con formato mm/dd/aaaa y lo componemos en un string
f_nac = (Month(.Cells(i, 3).Value) & "/" & Day(.Cells(i, 3).Value) & "/" & Year(.Cells(i, 3).Value))
'Evaluamos la función Datedif para año, mes y día
año = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""Y"")")
mes = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""YM"")")
dia = Evaluate("DATEDIF(""" & f_nac & """,""" & hoy & """,""MD"")")
'Pasamos el string con los años, meses y días de nuestra edad actual a la columna 4
.Cells(i, 4) = año & IIf(año = 1, " año", " años") & ", " & mes & IIf(mes = 1, " mes", " meses") & " y " & dia & IIf(dia = 1, " dia", " días")
Next i
End With
Antes de ver el resultado conviene comentar la forma en la que pasamos un rango a una matriz:
Matriz = .Range("A1:A" & fin)
Declarando la variable Matriz como variant e igualandola a un rango (dinámico), ya podemos introducirla en el bucle for:
For i = LBound(Matriz) + 1 To UBound(Matriz)
La función LBound nos devuelve el menor subíndice disponible para la dimensión indicada de la matriz, el valor que siempre va a retornar será el 0, pero en este caso, debemos sumarle un 1, dado que tenemos encabezados en cada columna. Si empezásemos con una fecha directamente (sin encabezados), eliminamos el +1.
La función UBound nos devuelve el mayor subíndice disponible para la dimensión indicada de la matriz.
Entonces ya tenemos todos los componentes necesarios para hacer funcionar nuestro loop. En el resto de la macro he re-adaptado el código de otra entrada anterior: CALCULAR LA EDAD CON DATEDIF EN UN FORMULARIO DE EXCEL, pero para que funcione en una hoja en lugar de un formulario.
El resultado de aplicar la macro es el siguiente:
Es un ejemplo sencillo pero es fundamental para comprender la funcionalidad que nos pueden otorgar las matrices y algunas de las funciones con las que las tratamos (LBoung, UBound).
Espero que os haya resultado de interés!.
Descarga el archivo de ejemplo pulsando en: UTILIZAR UNA MATRIZ EN UN LOOP FOR – NEXT
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!