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

6 comentarios:

  1. excelente articulo de continuación FUNCIONA EXCELENTE , este mismo sirve para update y delete??

    ResponderBorrar
  2. Hola, gracias por leerlo. Mañana domingo coloco un nuevo artículo con "Delete" y "Update". Saludos.

    ResponderBorrar
  3. pregunta:
    en tu cadena sql: Format(Range("C" & x).Value, "yyyy-mm-dd") & "')"
    colocas cada columna el valor formato que corresponde, es necesario, o solo puedo pasar de excel con los titulos de mis campos sin colocar los formatos ejemplo: Let sql = "Insert Into tablapruebas (Nombre, País, Fecha,cargo,antiguedad,ingreso,egreso,departamento)

    digo esto ya que cuando en la columna retiro la persona esta activa y esta vacia no tiene dato alguno.

    ResponderBorrar
    Respuestas
    1. Hola. El formato solo es necesario darlo para las fechas, ya que MySQL las usa de la forma "yyyy-mm-dd", en los demás casos no uso formato si ves bien pero sí es necesario indicar el valor (celda para este caso) y el campo, así el valor esté en blanco (asumiendo que en la BD se aceptan valores nulos).

      Borrar
  4. Buenas, una consulta, como harias para validar que ese usuario no se encuentre en la BD, si se encuentra no te lo deje guardar y sino se encuentra que te deje guardar

    ResponderBorrar
  5. Buena noche Sr Abraham me a encantado su material , solo que he buscado lo que refiere a update, y no lo he encontrado me puede apoyar?

    ResponderBorrar