Como hemos ya mencionado, hoy en día el uso de internet es tan masivo que no es extraño que se compartan no solo archivos sino también datos a través de su uso. No extraña, tampoco, el uso de sistemas que usan motores de base de datos ubicados en “hosting” que permiten el acceso remoto desde, literal, cualquier lugar del planeta. Por supuesto muchos priorizan el php o java (o similares) para crear sistemas y usarlos en páginas web que trabajen con los motores de base de datos de dichos “hosting”.
Probablemente MySQL debe ser uno de los mencionados motores que más se usa hoy en día y al ser Microsoft Excel una de las aplicaciones de escritorio más usada, y no solo como hoja de calculo que es su función principal, no es raro encontrar muchas personas que preguntan cómo conectar ambos programas. Aunque yo considero que no es lo idóneo usar Excel como “Front End”, entiendo que a muchos les resulta más fácil por uso y por eso la constante pregunta; por ello vamos a explicar cómo lograrlo.
Si bien se puede obtener datos de un servidor MYSQL con el complemento “MySQL for Excel” o a través de Power Query, el uso de VBA permite, desde mi punto de vista, una mejor manipulación de los datos.
Lo primero es comentar que usaremos ADO para ello. ActiveX Data Objects (ADO) es un mecanismo para comunicarse con bases de datos y así poder trabajar con sus datos, es compatible con VBA y, además, permite conexiones con MySQL. Otra cosa importante, hay que descargar un Driver ODBC para lograr la conexión. Si tu sistema operativo es de 32 bits y por ende tu Office igual, no tendrás mayor problema en usar el Driver que hayas instalado porque será para sistemas operativos de 32 bits, pero si tu sistema operativo es de 64 bits hay algo a tomar en cuenta y es que el Driver a usar deberá ser de los mismos bits que tu Office. Para que se entienda:
Sistema Operativo |
Office |
Driver MySQL |
32 bits |
32 bits |
32 bits |
64 bits |
32 bits |
32 bits |
64 bits |
64 bits |
64 bits |
Para el ejemplo yo usé “MySQL ODBC 8.0 Unicode Driver”.
Ahora sí comencemos con el ejemplo propiamente dicho. Lo primero es activar la referencia a “Microsoft ActiveX Data Object 6.1 Library” en donde el 6.1 puede variar dependiendo de tu versión de Office. Luego declararemos las variables, una para la conexión y otra para el recordset:
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Luego vamos a declarar variables en base a los parámetros que usaremos como el nombre del servidor, la base de datos, el usuario, entre otros. Para ver los parámetros ver este enlace.
Dim BD$, Servidor$, User$, Clave$
Ahora procederemos a dar valores a las variables, a crear la cadena de conexión y a establecer dicha conexión:
Let Servidor = "NombreoIPdelServidor": Let BD = "NombreBasedeDatos"
Let User = "UsuariodelServidor": Let Clave = "TuClave"
cnn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" _
& "SERVER=" & Servidor & ";DATABASE=" & BD & ";" _
& "UID=" & User & ";PWD=" & Clave & ";PORT=3306;OPTION=131072"
cnn.Open MsgBox "Conectado a mi BD MySQL"
Si todo salió bien el MsgBox se habrá activado lo que quiere decir que logramos conectarnos al servidor. Ah, por cierto, el puerto 3306 es el que se prioriza para usar servidores que no sean el “localhost” y en el “Option” el 131072 es para “habilitar opciones seguras” (revisar el enlace de párrafos arriba para más detalles). Si no se logró la conexión sería bueno revisar en el “phpmyadmin” que el acceso parra conexiones remotas del servidor esté activado (ojo que no todos los servidores lo tienen/permiten). Todo junto debe quedar así:
Sub TrabajarconMySQL()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim BD$, Servidor$, User$, Clave$
Set cnn = New ADODB.Connection
Let Servidor = "NombreoIPdelServidor": Let BD = "NombreBasedeDatos"
Let User = "UsuariodelServidor": Let Clave = "TuClave"
cnn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" _
& "SERVER=" & Servidor & ";DATABASE=" & BD & ";" _
& "UID=" & User & ";PWD=" & Clave & ";PORT=3306;OPTION=131072"
cnn.Open
MsgBox "Conectado a mi BD MySQL"
cnn.Close
Set cnn = Nothing
End Sub
Si queremos conectarnos a nuestro servidor de MySQL instalado en nuestra PC (como el que crea WampServer), basta cambiar así:
Let Servidor = "localhost": Let BD = "NombreBasedeDatos"
Let User = "root": Let Clave = ""
cnn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" _
& "SERVER=" & Servidor & ";DATABASE=" & BD & ";" _
& "UID=" & User & ";PWD=" & Clave & ";PORT=3306;OPTION=131072"
En donde lo único que deberán cambiar es el nombre de la base de datos.
Ahora vamos a obtener los datos de una de las tablas. Para este usaremos SQL, obtendremos todos los datos de “Tabla1”, incluido los nombres de los campos, y colocaremos todos los datos en una hoja de nuestro Excel usando bucles con variables para de ese modo no tener que ajustar al número de campos o registros:
Sub Conectar()
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 Tabla1"
Let Servidor = "NombreoIPdelServidor": Let BD = "NombreBasedeDatos"
Let User = "UsuariodelServidor": Let Clave = "TuClave"
cnn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" _
& "SERVER=" & Servidor & ";DATABASE=" & BD & ";" _
& "UID=" & User & ";PWD=" & Clave & ";PORT=3306;OPTION=131072"
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
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
Por supuesto también usando SQL podríamos enviar más datos y/o modificar los ya existentes, pero eso será para otra ocasión. Hasta la próxima.
Abraham Valencia