martes, 26 de febrero de 2019

Excel y MySQL (I)

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

7 comentarios:

  1. Excelente trabajo, muy buena referencia. tendrás igual para guardar datos??

    ResponderBorrar
    Respuestas
    1. Hola, disculpa la demora en comentar. Entre hoy (10) y mañana (11) debo estar colocando un artículo sobre eso. Saludos.

      Borrar
    2. Muchas gracias, excelente articulo... muy bien explicado y funcional

      Borrar
  2. Excelente artículo Abraham, gracias por compartir conocimiento.

    ResponderBorrar
  3. Muy valiosa está información. Muchas gracias por compartir!!!

    ResponderBorrar
  4. Funcionó perfecto...Gracias por tu aporte... Logré conectar sin problemas.

    ResponderBorrar