Mostrando las entradas con la etiqueta Excel MySQL. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Excel MySQL. Mostrar todas las entradas

miércoles, 10 de abril de 2019

Excel y MySQL (II)

Hace poco hablamos de cómo conectar MySQL con Excel (Enlace) aunque básicamente se hizo referencia a conectarse a un servidor y extraer sus datos. En esta ocasión lo que vamos a hacer es enviar datos de Excel hacia una base de datos MySQL.

Vamos a hacer algo corto y práctico porque la idea es que se entienda más que hacer algo complicado. Entonces, comenzaremos creando una tabla con cuatro campos en alguna base de datos MySQl que tengamos. Mi base de datos se llama “Pruebas” y llamaré a mi tabla “TablaPruebas”. Los campos serán los siguientes:

Nombre del campo

Tipo

Extras

Id

Int

Primary – Auto_Increment

Nombre

Text

 

País

Text

 

Fecha

Date

 

En nuestra hoja de Excel usaremos tres columnas A, B y C (La de “Id” no, ya que es de numeración automática) y pondremos encabezados en la fila 1. Llenaremos datos que queramos enviar a MySQL:

Como son varios datos usaremos un bucle para enviar los datos, aunque la clave de todo será usar SQL y en específico “Insert Into”. Dado que usaremos el bucle mencionado, debemos asegurar que al construir nuestra cadena SQL, se tomen los datos adecuados por lo que dicha cadena debe quedar de la siguiente manera:

sql = "Insert Into tablapruebas (Nombre, País, Fecha) Values ('" & Range("A" & x).Value & "','" _         
  & Range("B" & x).Value & "','" & Format(Range("C" & x).Value, "yyyy-mm-dd") & "')" 

Al ser los campos del tipo Text y Date, deben necesariamente ir entre comillas simples en la cadena. Para terminar, y basándonos en todo lo mencionado en el artículo anterior, nuestra macro debería quedar así, tomando en cuenta que usaré MySQL en el “LocalHost”:.

Sub DatosaMySQL()

Dim cnn As ADODB.Connection 
Dim rst As ADODB.Recordset 
Dim sql$, BD$, Servidor$, User$, Clave$ 
Dim UltimaFila As Long, x As Long 

Set cnn = New ADODB.Connection 
Let Servidor = "localhost": Let BD = "pruebas" 
Let User = "root": Let Clave = "" 
Let UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row 

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

For x = 2 To UltimaFila

  Set rst = New ADODB.Recordset
         Let sql = "Insert Into tablapruebas (Nombre, País, Fecha) Values ('" & Range("A" & x).Value & "','" _
           & Range("B" & x).Value & "','" & Format(Range("C" & x).Value, "yyyy-mm-dd") & "')"     

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

  Set rst = Nothing 

Next x 

cnn.Close 
Set cnn = Nothing 
MsgBox "Todo listo" 

End Sub

Si todo salió bien, tendremos algo así en nuestra tabla:

Espero les sea útil. Hasta la próxima.

Abraham Valencia

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