24 septiembre, 2023

EXPORTAR COLUMNAS DE UNA HOJA A OTRA EN EXCEL

Es muy habitual cuando trabajamos en Excel que los archivos con los que elaboramos nuestra información vengan de otros programas o formatos, por ejemplo Access, Sql, o TXT etc. y que además estructuremos nuestros programas y aplicaciones en base a la distribución inicial estas tablas.

El problema llega cuando cambia la distribución inicial con la que importábamos las tablas y tenemos que modificar o bien nuestros programas, adaptándolos a las nuevas estructuras o bien modificar en un paso intermedio esas primeras tablas que exportaremos de una hoja en Excel a otra realizando los cambios y formatos que sean necesarios.

La solución depende del tiempo que tengamos y el tamaño de nuestras aplicaciones, desde luego las dos soluciones son igual de buenas, sin embargo la primera nos ahorrará pasos intermedios, pero también requiere más tiempo dependiendo de lo grande que sea nuestro programa o base de datos.

Creo que todo esto con un ejemplo se entenderá mejor. Imaginad que tenéis una tabla habitualmente os entregan en un archivo txt u que importáis a una hoja de Excel para luego realizar automáticamente una serie de informes. La tabla podría ser esta:

EXPORTAR_COLUMNAS_1

y resulta que por un cambio en el programa que genera la información, ahora los datos que nos entregan son los siguiente:

EXPORTAR_COLUMNAS_2

Obviamente ahora el origen de nuestros datos ha cambiado, y para resolver el problema o bien transformamos estos datos para convertirlos en los datos iniciales o adaptamos la aplicación cualquiera que sea a este nuevo origen de datos.

Para este ejemplo, voy a optar por la solución de transformar esta tabla de datos a la tabla inicial. Y lo haremos automáticamente con vba, exportando las columnas a otra hoja y realizando las operaciones necesarias para obtener la misma información. Para ello voy a utilizar el siguiente proceso, donde los nuevos datos están la hoja «ORIGEN» y los datos a transformar están en la hoja «DESTINO».

Dim i As Double
Dim final As Double
Application.ScreenUpdating = False
final = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
For i = 1 To final
If Worksheets(1).Cells(i, 1) = "" Then
final = i
Exit For
End If
Next
Worksheets("DESTINO").Select
Worksheets("DESTINO").Cells.Select
Selection.ClearContents
Worksheets("DESTINO").Range("a1").Select
For i = 2 To final
'GENERO
Worksheets("DESTINO").Cells(1, 1).Value = "GENERO"
If Worksheets("ORIGEN").Cells(i, 1).Value = "Femenino" Then
Worksheets("DESTINO").Cells(i, 1).Value = "M"
Else
Worksheets("DESTINO").Cells(i, 1).Value = "V"
End If
'FECHA NACIMIENTO
Worksheets("DESTINO").Cells(1, 2).Value = "NACIMIENTO"
Worksheets("DESTINO").Cells(i, 2).Value = CDate(Format((Worksheets("ORIGEN").Cells(i, 2).Value), "00") & "/" & Format((Worksheets("ORIGEN").Cells(i, 3).Value), "00") & "/" & (Worksheets("ORIGEN").Cells(i, 4).Value))
'PESO
Worksheets("DESTINO").Cells(1, 3).Value = "PESO"
Worksheets("DESTINO").Cells(i, 3).Value = CDbl(Worksheets("ORIGEN").Cells(i, 5).Value)
'ALTURA
Worksheets("DESTINO").Cells(1, 4).Value = "ALTURA"
Worksheets("DESTINO").Cells(i, 4).Value = CDbl(Worksheets("ORIGEN").Cells(i, 6).Value)
Next
End Sub

 Con este código conseguimos transformar la distribución y los datos se la hoja ORIGEN a los datos finales de la hoja DESTINO.

EXPORTAR_COLUMNAS_3

Lo importante es entender lo que estamos haciendo, y eso se puede ver si seguimos el código, veamos, lo primero que tenemos que hacer es declarar aquellas variables que vamos a necesitar para guardar los datos. En este caso las he denominado «i» y «final». En la i va a ser igual que la celda 1 de cualquier columnas hasta «final», que será la última celda con datos. El tipo de variable será «double» (mejor para trabajar con decimales)

Una vez que tenemos definidas las variables, ya todo es más sencillo, tan solo debemos igualar la hoja «Destino» a la hoja «Origen», de modo que para transformar el «Masculino» y el «Femenino» en «V» y «M» respectivamente vamos a escribir lo siguiente:

'GENERO
'Primero ponemos el nombre, que siempre va a estar en la celda A1 de la primera columna
Worksheets("DESTINO").Cells(1, 1).Value = "GENERO"
'Luego debemos realizar una condición, de forma que si cualquier celda de la primera columna de la hoja ORIGEN pone "Femenino" entonces esas mismas celdas en la hoja DESTINO se denominarán "M"
If Worksheets("ORIGEN").Cells(i, 1).Value = "Femenino" Then
Worksheets("DESTINO").Cells(i, 1).Value = "M"
'Dado que solo pueden ser V o M, decimos de si la celda no sigue la primera condición, entonces es "V" 
Else
Worksheets("DESTINO").Cells(i, 1).Value = "V"
End If

Y es de esta forma cómo podemos realizar la transformación de los datos. Y lo mismo sucede para la fecha de nacimiento, donde lo que vamos a hacer es concatenar las celdas de las columnas 2, 3 y 4 de la hoja «Origen» y luego trasladar los datos a las celdas de la columna 2 de la hoja «Destino»:

'FECHA NACIMIENTO
'Primero ponemos el nombre, que siempre va a estar en la celda B1 de la segunda columna
Worksheets("DESTINO").Cells(1, 2).Value = "NACIMIENTO"
'Ahora debemos igualar las celdas de la columna 2 de la hoja destino con el resulta de concatenar los datos de la hoja origen. Esto lo hacemos con uniendo con "&" y dando formato a los días y a los meses con "00". Luego unimos con "/" y damos formato fecha (CDate).
Worksheets("DESTINO").Cells(i, 2).Value = CDate(Format((Worksheets("ORIGEN").Cells(i, 2).Value), "00") & "/" & Format((Worksheets("ORIGEN").Cells(i, 3).Value), "00") & "/" & (Worksheets("ORIGEN").Cells(i, 4).Value))

Los dos últimos elementos, peso y altura, simplemente los exportamos tal y como está, excepto que en la hoja origen el formato es texto y en destino es número. Para ello debemos utilizar el formato de número Cdbl()

El resto del código es para limpiar los datos de la hoja DESTINO cada vez que se generen nuevos informes:

Worksheets("DESTINO").Select
Worksheets("DESTINO").Cells.Select
Selection.ClearContents
Worksheets("DESTINO").Range("a1").Select

Con este código y forma de proceder no solo podremos trasladas columnas de una hoja a otra sino que también podremos realizar cálculos y transformar la información, algo que es fundamental.

Espero que os sea de utilidad 🙂

Descarga el archivo de ejemplo pulsando en: EXPORTAR COLUMNAS

Comparte este post

2 comentarios en «EXPORTAR COLUMNAS DE UNA HOJA A OTRA EN EXCEL»

  1. super, gracias SEgu, pero… y en el caso que los datos de columnas sean variables, es decir, que en una ocasión no venga una de las columnas que espera el libro o archivo destino, como se manejaría ese error o como se podría llamar, pues a mi me sucede que exporta una columna que esté dentro del rango. Bueno yo extraigo por nombre definido de rango, y cuando el archivo base de información no gener´ese movimiento, no incluye una o dos columnas de las requeridas. gracias de antemano. saludos

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