Hola a todos,
Como sabéis, es muy habitual que cuando trabajamos con datos recibamos archivos con bases de datos que de alguna forma necesitamos modificar o formatear, ya sea por nuestra comodidad, necesidad o política de empresa.
Hoy en día esto se puede resolver por varías vías, una de ellas puede ser mediante Power Query, importando esa base de datos y exportando la información que necesitamos después de haber indicado las columnas que necesitamos y de haber aplicado las funciones requeridas para obtener el nuevo resultado.
Y otra forma es mediante VBA programando código que realice lo requerido.
Nos ocuparemos hoy de VBA y vamos a tener presente que esta tarea se puede realizar con métodos distintos. Para el caso de hoy lo haré con un loop que recorra cada columna registro por registro y copie los datos de una hoja a la otra.
Partiendo de esta base:
Pasaremos a otra hoja los campos ID, EDAD Y SEXO. Para la EDAD codificaremos por tramos y para SEXO, cambiaremos el título por GENERO y HOMBRE Y MUJER por MASCULINO Y FEMENINO.
Las modificaciones son lo de menos, lo importante cómo utilizaremos el método find para capturar el número de la columnas y facilitar así modificaciones posteriores en la base de datos cuando se incluyan nuevas columnas.
El código a utilizar es el siguiente:
Sub FORMATEO()
'Declaramos variables
Dim nTitulo As Object, i As Long, nCampo As Object
Dim Fin As Long, col As Long
With Sheets("ORIGINAL")
Set nTitulo = .Range("1:1")
Fin = Application.CountA(Sheets("ORIGINAL").Range("A:A"))
For i = 2 To Fin
' Traemos campo ID
Set nCampo = nTitulo.Find("ID", LookAt:=xlWhole)
col = nCampo.Column
Sheets("FORMATEADA").Cells(1, 1) = nCampo
Sheets("FORMATEADA").Cells(i, 1) = .Cells(i, col)
'Agrupamos edad
Set nCampo = nTitulo.Find("EDAD", LookAt:=xlWhole)
col = nCampo.Column
Sheets("FORMATEADA").Cells(1, 2) = nCampo
Select Case .Cells(i, col)
Case 18 To 25
Sheets("FORMATEADA").Cells(i, 2) = "18 a 25"
Case 26 To 35
Sheets("FORMATEADA").Cells(i, 2) = "26 a 35"
Case 36 To 45
Sheets("FORMATEADA").Cells(i, 2) = "36 a 45"
Case 46 To 55
Sheets("FORMATEADA").Cells(i, 2) = "46 a 55"
Case 56 To 65
Sheets("FORMATEADA").Cells(i, 2) = "56 a 65"
End Select
'Renombramos sexo por género
Set nCampo = nTitulo.Find("SEXO", LookAt:=xlWhole)
col = nCampo.Column
Sheets("FORMATEADA").Cells(1, 3) = "GENERO"
If .Cells(i, col) = "HOMBRE" Then
Sheets("FORMATEADA").Cells(i, 3) = "MASCULINO"
Else
Sheets("FORMATEADA").Cells(i, 3) = "FEMENINO"
End If
Next i
End With
Sheets("FORMATEADA").Select
End Sub
Con esta sencilla sentencia obtenemos la columna en la que se encuentra el campo que hemos indicado. Importante, para búsquedas exactas utilizar «LookAt:=xlWhole»
Set nCampo = nTitulo.Find("ID", LookAt:=xlWhole)
col = nCampo.Column
El resultado de este código es el siguiente:
A pesar de que podemos encontrar fórmulas más rápidas, en mi opinión debemos tener muy en cuenta las posibilidades que ofrece este método. Os dejo la base de datos:
🙂
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies