En Excel, tengo una hoja de cálculo que extrae datos de una base de datos SQL en una tabla y luego genera un informe basado en esos datos. Desafortunadamente, los datos en esta base de datos SQL están incompletos y quiero incluir filas adicionales en el conjunto de resultados que se ingresan manualmente en la hoja de cálculo.
Por mucho que quisiera, no puedo insertar manualmente estas filas adicionales en la tabla porque se eliminarían cada vez que Excel extraiga nuevos datos de la Base de datos SQL. Entonces, en cambio, estoy considerando crear una tabla separada con los mismos encabezados de columna en una nueva hoja e ingresar los datos allí, y luego crear una tercera tabla en otra hoja que de alguna manera combine las filas de la tabla que extrae datos de SQL y tabla donde ingreso datos manualmente. ¿Cómo puedo lograr esto? (O, alternativamente, ¿hay una mejor manera de hacer esto que de alguna manera me estoy perdiendo?)
Ejemplo:
Table 1 (From Database):
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Foo | 12 |
| Mary | 1/6/13 | Foo | 7 |
| Mary | 1/6/13 | Bar | 5 |
| John | 1/6/13 | Foo | 5 |
| John | 1/13/13 | Foo | 13 |
-
Table 2 (Entered Manually):
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Baz | 3 |
| Mary | 1/6/13 | Baz | 2 |
| John | 1/13/13 | Baz | 5 |
-
Result:
| Person | Week Of | Task | Hours |
| Bob | 1/6/13 | Foo | 12 |
| Mary | 1/6/13 | Foo | 7 |
| Mary | 1/6/13 | Bar | 5 |
| John | 1/6/13 | Foo | 5 |
| John | 1/13/13 | Foo | 13 |
| Bob | 1/6/13 | Baz | 3 |
| Mary | 1/6/13 | Baz | 2 |
| John | 1/13/13 | Baz | 5 |
Respuestas:
Aquí hay una solución pura de Excel sin VBA. Funciona mediante el uso de una función ÍNDICE para reducir las filas y las columnas de los datos SQL hasta que se agoten los valores y se produzca una condición de error. Una función IFERROR detecta el error y utiliza una segunda función INDICE para reducir las filas y las columnas de los datos ingresados manualmente, nuevamente hasta que esos valores se agoten y se produzca una condición de error. Una segunda función IFERROR detecta el error y devuelve un guión ("-"). (Los datos SQL se deben actualizar a través de la cinta de opciones para que las fórmulas produzcan un resultado correcto).
Cree un rango dinámico con nombre SQLDB para los datos SQL en la Hoja1 utilizando la fórmula:
Cree un segundo rango dinámico con nombre EXCELRNG para los datos ingresados manualmente en Sheet2 usando la fórmula:
Ambos rangos con nombre suponen que los nombres de las variables se ingresan en la fila 1 de cada una de las dos hojas.
Ingrese los nombres de las variables en la fila 1 de la Hoja3 (comenzando en la celda A1).
Ingrese la siguiente fórmula en la celda A2 de Sheet3:
Copie la fórmula en las columnas de nombre de la variable y luego hacia abajo en las filas hasta que los resultados de las fórmulas sean todos guiones ("-").
Es posible, como siguiente paso, crear una tabla dinámica en otra hoja para su análisis y organización.
Nuevamente, el primer paso sería crear un rango con nombre dinámico, por ejemplo, RESULTRNG, insertando la siguiente fórmula en el cuadro de entrada del Administrador de nombres para el rango con nombre:
Luego cree una tabla dinámica en una nueva hoja, estableciendo RESULTRNG como la tabla que desea analizar. Esto filtrará los guiones finales de la tabla de fórmulas en Sheet3.
Esto funciona porque la fórmula RESULTRNG cuenta el número total de filas en Sheet1 y Sheet2 (excluyendo el encabezado en Sheet2) y el número total de columnas en Sheet1, y establece su extensión en función de esos recuentos, excluyendo cualquier guión en las filas finales ( o columnas) en la tabla de fórmulas de Sheet3.
fuente
Encontré una manera 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 las uniones).
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:
Nota: Para mí, este método deja de funcionar después de cerrar el archivo y volver a abrirlo. Lo publico aquí de todos modos, en caso de que sea solo un problema con mi computadora o alguien más pueda hacerlo funcionar.
fuente
Si está interesado en una solución VBA, pude hacer que funcione lo siguiente:
Establezca un rango dinámico con nombre para los datos que está extrayendo 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 la Hoja 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:
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 en la cinta de opciones. Deshabilitar la actualización en segundo plano garantiza que la macro VBA se pause hasta que se complete 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 realizaría antes de ejecutar la macro.
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 a la izquierda. Se hará referencia 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 la Hoja 3. Como está escrito, la macro no ordena la nueva tabla, aunque eso no sería difícil de agregar.
fuente
Aquí hay una versión de la solución "Pure Excel" de @ chuff diseñada específicamente para trabajar con tablas. (IE Las dos fuentes de datos que desea fusionar son tablas).
La principal diferencia entre este método y el único contenido publicado 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, nombra tu primera mesa
Table1
y tu segunda mesaTable2
.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:
Luego, copie esta fórmula en todas las columnas de la tabla y luego hacia abajo 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 (todos contienen la misma fórmula).
Si las columnas de la tabla combinada muestran 0 cuando deberían mostrar una celda en blanco, puede ajustar la fórmula en esa columna con la función de sustitución, como esta:
Si desea crear una tabla dinámica que utilice datos de esta nueva tabla, deberá 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". Dé un nombre a la referencia, ingrese la siguiente ecuación para su valor ("Se refiere a"):Luego puede usar esta referencia con nombre como el rango para su tabla dinámica.
fuente
Si solo desea obtener un resultado por única vez, hay un sitio web que combinará dos tablas para usted: https://office-tools.online/table/merge/
Pega las tablas en la página web y selecciona los parámetros relevantes. Aquí hay una captura de pantalla del ejemplo incorporado que indica cómo usarlo:
fuente