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
excelente articulo de continuación FUNCIONA EXCELENTE , este mismo sirve para update y delete??
ResponderBorrarHola, gracias por leerlo. Mañana domingo coloco un nuevo artículo con "Delete" y "Update". Saludos.
ResponderBorrarpregunta:
ResponderBorraren 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.
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).
BorrarBuenas, 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
ResponderBorrarBuena 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