Saltar al contenido

¿Cómo fusiono dos tablas en Excel que tienen columnas idénticas?

Ten en cuenta que en las ciencias un error puede tener diferentes resoluciones, de igual modo te mostraremos lo más óptimo y eficiente.

Solución:

Encontré una forma de hacerlo. Esta solución es un poco complicada y requiere que ambas tablas tengan sus propias hojas separadas (sin nada más en ellas), pero aparte de eso, hace casi exactamente lo que quiero. (También parece haber mucho potencial aquí para realizar operaciones más complejas, como combinaciones).

Vaya a la pestaña de datos en la cinta, haga clic en “De otras fuentes” y “De Microsoft Query”. Luego haga clic en Archivos de Excel, seleccione el archivo en el que está trabajando actualmente y haga clic en Aceptar. Luego, presione cancelar y cuando se le promocione si desea continuar editando en Microsoft Query, presione “Sí”. Desde aquí puede hacer clic en el botón SQL y escribir una consulta SQL personalizada en cualquier hoja de la hoja de cálculo. En mi caso:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

Nota: Para mí, este método deja de funcionar después de cerrar el archivo y volver a abrirlo. Lo estoy publicando aquí de todos modos, en caso de que sea solo un problema con mi computadora o alguien más pueda hacer que funcione.

Si está interesado en una solución VBA, pude hacer funcionar lo siguiente:

  • Establezca un rango de nombre dinámico para los datos que extrae de SQL Server. Abra el Administrador de nombres, ingrese un nuevo nombre (por ejemplo, “SQLDB”) y copie la siguiente fórmula en el cuadro de entrada Se refiere a. Supuse que sus datos extraídos están en Sheet1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Establezca otro rango con nombre para el rango en el que se ingresan los datos manuales. Usé el nombre EXCELRNG y asumí que estaba en Sheet2. El rango con nombre comienza en la fila 2 para excluir una fila de encabezado. La fórmula aquí es idéntica a la primera excepto por la hoja a la que se refiere:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Aquí está el primer conjunto de configuraciones que utilicé para la conexión a la tabla SQL. Se accede al cuadro de diálogo seleccionando Conexiones en la pestaña Datos de la cinta. La desactivación de la actualización en segundo plano asegura que el VBA macro hace una pausa hasta que se completa una actualización de los datos en la hoja de Excel. Es posible que no sea necesario actualizar la conexión cuando se abre la hoja de trabajo, pero quería asegurarme de que cualquier autenticación se realice antes de la macro fue corrido.

configuración de conexión

  • Aquí está el segundo conjunto de configuraciones. Estos se encuentran en la sección Propiedades de la pestaña Datos (mientras se selecciona una celda en la tabla SQL importada). Aunque elegí la opción “Insertar filas completas para datos nuevos, eliminar celdas no utilizadas”, en realidad no tuve ningún problema con la opción “Insertar celdas …”.

propiedades de conexión

  • Finalmente, este es el código VBA. Para insertarlo, elija Visual Basic en la pestaña Desarrollador. Resalte el nombre de la hoja de trabajo en la lista de la izquierda. Se hará referencia a él como “Proyecto VBA (nombre de la hoja). Luego, elija Insertar módulo en la barra de menú en la parte superior de la pantalla y pegue el código en el nuevo módulo. Tenga en cuenta que puse la tabla consolidada en Sheet3. Como está escrito, el macro no ordena la nueva tabla, aunque eso no sería difícil de agregar.

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

Aquí hay una versión de la solución “Pure Excel” de @ chuff que está diseñada específicamente para trabajar con tablas. (Es decir, las dos fuentes de datos que desea fusionar son tablas).

La principal diferencia entre este método y el que Chuff publicó en su respuesta es que no necesita definir rangos con nombre para los dos conjuntos de datos que está fusionando, ya que son tablas y ya tienen su propio rango con nombre. Así que adelante y nombra tu primera mesa Table1y tu segunda mesa Table2.

Ahora, cree una nueva tabla en la esquina superior izquierda de una nueva hoja y asígnele los mismos nombres de columna que las otras dos tablas. Luego ingrese la siguiente fórmula en la celda A2 de la hoja que acaba de crear:

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

A continuación, copie esta fórmula en todas las columnas de la tabla y luego en las filas hasta que los resultados de las fórmulas sean todos guiones (“-“). Nota: ordenar esta nueva tabla no hará nada, ya que el contenido de cada celda es realmente idéntico (todas contienen la misma fórmula).

Si las columnas de la tabla combinada muestran ceros cuando deberían mostrar una celda en blanco, puede ajustar la fórmula en esa columna con la función sustituta, así:

=SUBSTITUTE(, 0, "")

Si desea crear una tabla dinámica que use datos de esta nueva tabla, tendrá que crear un rango con nombre. Primero, nombra la mesa Table3. Ahora, vaya a la pestaña de fórmulas y haga clic en “Definir nombre”. Asigne un nombre a la referencia, ingrese la siguiente ecuación para su valor (“Se refiere a”):

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

A continuación, puede utilizar esta referencia con nombre como rango para su tabla dinámica.

Te mostramos las reseñas y valoraciones de los lectores

Finalizando este artículo puedes encontrar las explicaciones de otros programadores, tú todavía tienes el poder dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *