PROGRAMAR EN VBA MACROS PARA EXCEL: Conectar Excel con Excel Consulta SQL Copia Datos de Una Hoja a Otra del Mismo Libro

Conectar Excel con Excel Consulta SQL Copia Datos de Una Hoja a Otra del Mismo Libro





Anteriormente se mostró como lograr una conexion ADODB con un libro Excel, para poder utilizar luego sentencias SQL para consulta de datos, en este ejemplo se muestra como Conectar Excel con Excel y obtener todos los datos de una hoja y pegarlos en otra hoja del mismo libro de Excel.


En este ejemplo se copiaran todos los datos no teniendo en cuenta ningún criterio es decir copiará todos los datos de la hoja 2 por ejemplo y los pegará en la hoja 1, replicando absolutamente todos los datos sin criterio alguno en post siguientes se agregarán criterio como un rango de fechas, de números, etc., los invito a que comenten y sugieran que criterios requieres se tengan en cuenta para copiar datos, en base a ello se podrán realizar ejemplos, la base de esto es realizar bien la cadena de consulta SQL.

Desde el final del post se puede descargar el ejemplo en forma gratuita sin ninguna restricción, el código se puede adaptar a cada necesidad, Aporta por favor para sostener el sitio si está dentro de tus posibilidades, desde ya muchas gracias.

Si te estás iniciando en la operación de Excel o requieres afirmar conocimientos, recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.

  

El vídeo verás la macro en acción con una explicación más detallada de su codificación y funcionamiento, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como  por ejemplo Recorre fila buscando y comparando datos de dos columnas en hojas distintasbuscar en listbox mientras escribes en textbox, como crear una factura o sale invoice y grabar guardar PDF XLS y enviar por mail, trabajando con filas, celdas, columnas, rangos y muchos ejemplos más.









 


La macro denominada Conectar Excel con Excel Consulta SQL Copia Datos de Una Hoja a Otra Hoja del Mismo Libro en primer lugar lo que hace es crear una conexión ADODB al mismo libro lo hace con el siguiente código:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""

Posteriormente y lo más importante es crear el String de Consulta o SQL que se denomina en este ejemplo, la SQL creada en este ejemplo es muy simple ya que no tiene filtro de datos por criterios sino que solicita que se consulten todos los datos de la base de datos a la tabla que se refiere.

Tengan en cuenta que cuando se crea este tipo de conexiones, se toma cada hoja de Excel como una tabla de base de datos interpretando que la primer fila es la que contiene el nombre de las columnas si el argumento HDR es igual a Yes, sugiero que así lo hagan cuando adapten a sus ejemplos, se puede comenzar los datos directamente en la fila 1, en este caso la macro refiere a cada columna como F1, F2 y así sucesivamente le va a llamar a cada columna.

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizá sea de utilidad también

Como recorrer filas y buscar datos en base a criterios

Como recorrer filas comparar y colorear filas en base a criterios

Como recorrer filas y comparar datos de dos columnas en hojas diferentes

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛



⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛

Hay que presar gran cuidado como se escribe el nombre de la hoja de Excel, que en este tipo de consultas es tomado como si fuera una tabla de base de datos, fíjense el código:

sql = "SELECT * FROM [" & "Hoja1$" & "]"

La estructura anterior dice: Seleccione todas, * representa todas las columnas, de la tabla (From) Hoja1 (tengan presente que cada hoja es tomada como una tabla), si quisiéramos referenciar a la hoja dos deberíamos cambiar por Hoja2 por el nombre de la hoja de Libro que cada lector tenga y de la cual quisiéramos copiar datos para pegar en otra hoja.

Lista la SQL o cadena, string de consulta se debe ejecutar dicha consulta de datos, eso se hace con el siguiente código, los datos se guardarán en memoria:

Set rs = cn.Execute(sql)

Con los datos en memoria se procede a copiarlos en la Hoja2 de este ejemplo, para lo cual se usa el siguiente código:

b.Cells(2, 1).CopyFromRecordset Data:=rs

Luego se deben liberar las variables para liberar memoria, es decir recursos de la PC, recuerden que en este caso se copiaron casi 65.000 filas de una hoja a la otra en cuestión de segundos, eso habla de lo eficiente que es trabajar con consultas SQL cuando se tiene grandes cantidades de datos, los recursos de memoria se liberan vaciando los objetos creados, con el siguiente código:

Set rs = Nothing
cn.Close
Set cn = Nothing

Como consejo sugiero realizar la conexión y ejecutar la SQL en la macro, inmediatamente cuando necesitemos los datos y luego liberemos variables para no consumir recursos, es decir supongan que la macro es muy larga , no conviene consultar los datos tenerlos en memoria si recién se usan al final de la macro, la consulta se realizará cuando se vayan a usar los datos y luego de ello liberar la memoria de la PC borrando los datos de los objetos creados.

Recomiendo descargar el ejemplo Conectar Excel con Excel Consulta SQL Copia Datos de Una Hoja a Otra Hoja del Mismo Libro, ejecutarlo paso a paso con F8 para comprender como funciona a continuación dejo el código completo, mira el vídeo para ver macro en acción será más fácil entenderlo.


Código que se inserta en un módulo

Sub ConsutaSQLExcel()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim ctl As Object
Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
On Error Resume Next
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Set a = Sheets("Hoja1")
Set b = Sheets("Hoja2")

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=Yes;"""
sql = "SELECT * FROM [" & "Hoja1$" & "]"
b.Cells.Clear
a.Range("A1:G1").Copy Destination:=b.Range("A1")
Set rs = cn.Execute(sql)
b.Cells(2, 1).CopyFromRecordset Data:=rs
b.Range("B:B").NumberFormat = "dd/mm/yyyy"
Set rs = Nothing
cn.Close
Set cn = Nothing
If b.Range("A2") <> Empty Then
MsgBox ("Los registros se copiaron con éxito"), vbInformation, "AVISO"
Else
MsgBox ("No se encontraron registros en la base de datos"), vbInformation, "AVISO"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Sub BORRAR()
Sheets("Hoja2").Cells.Clear
End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends