Problema al importar datos de MySql a Excel

Tengo un libro donde mediante una macro importo los datos de una base de datos MySql a una hoja de Excel, el problema que tengo es que una instrucción, toma la base de MySql, y va registro por registro copiando la información en la hoja de Excel, y la base completa tiene más de 140.000 registros, por lo que el proceso es bastante demorado; quisiera saber si puedo cambiar la instruccion para que tome en bloque los datos que hay en MySql y los pegue en Excel, es decir no registro por registro, sino en bloque; la instrucción es la siguiente:

Sub ConectarConBaseDatos()
'en referencias acitvar
'microsoft activex data objects 2.5 library - en office 2010
'microsoft activex data objects 6.1 library - en office 2019
'instalar mysql-connector-odbc-8.0.16-win32
Sheets("HOJADATOS").Select
Range("A1").Select

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim nCampos&, x As Integer
Dim nRegistros&, y As Long
Dim sql$, BD$, Servidor$, User$, Clave$

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
Let sql = "Select * From ventas"
Let Servidor = "localhost": Let BD = "Mi_Base_db"
Let User = "root": Let Clave = "admin"

cnn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" _
& "SERVER=" & Servidor & ";DATABASE=" & BD & ";" _
& "UID=" & User & ";PWD=" & Clave & ";PORT=3306;OPTION="
cnn.Open

With rst
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open sql, cnn, , , adCmdText
End With

Let nCampos = rst.Fields.Count
Let nRegistros = rst.RecordCount

For x = 1 To nCampos
Cells(1, x) = rst.Fields(x - 1).Name
Next x

For y = 1 To nRegistros '=====esta instrucción es la demorada, va fila por fila, copiando registro por registro en la hoja de Excel
For x = 1 To nCampos
Cells(y + 1, x).Value = rst.Fields(x - 1).Value
Next x
rst.MoveNext
Next y

cnn.Close
Set rst = Nothing: Set cnn = Nothing

End Sub

¿Alguien puede ayudarme con la instrucción?

1 Respuesta

Respuesta
1

Yo probaría a sustituir

For y = 1 To nRegistros '=====esta instrucción es la demorada, va fila por fila, copiando registro por registro en la hoja de Excel
For x = 1 To nCampos
Cells(y + 1, x).Value = rst.Fields(x - 1).Value
Next x
rst.MoveNext
Next y

por

Cells(y+1).copyfromrecordset rst

Saludos_

Buenos días, muchas gracias por la solución, funciona perfecto, pero quiero pedirle un último favor, y es que el detalle de los registros se me copia y pega desde la celda A1, es decir me borra los encabezados de la hoja, cómo podría indicarle a la instrucción que los datos que se traen se peguen en la hoja a partir de la celda A2?.

Agradezco su atención.

La parte a la izquierda del punto puede ser cualquier rango explícito o variable que represente uno: https://docs.microsoft.com/es-es/office/vba/api/excel.range.copyfromrecordset

Por ejemplo

Worksheets("Hoja1"). Range("A2"). Copyfromrecordset rst

creo que debería funcionar respetando lo que haya en la fila 1 de Hoja1, pero ahora mismo no puedo probarlo porque no estoy delante de mi PC.

Saludos_

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas