miércoles, 12 de abril de 2017

Ejecutar la instrucción INSERT INTO de SQL desde Excel usando VBA

Continuando con los posts en los que estamos trabajando como ejecutar instrucciones de SQL desde nuestro excel, hoy vamos a trabajar con la instrucción INSERT INTO. Ya previamente vimos la instrucción UPDATE y la instrucción DELETE donde en ambos casos utilizamos la librería ADO.

Para ejecutar INSERT INTO, necesitamos lo mismo, es decir, una conexión y un comando. Así de simple.

Nuevamente nos vamos al editor de visual basic, y vamos a ingresar el código para la conexión. Recuerden que como lo vimos previamente, hay que activar la librería ADO:


En este caso, la ruta del archivo de access, la tenemos en una hoja llamada Configuración, en la celda B3.

Procedemos a crear un comando DELETE, para limpiar la tabla en la que vamos a cargar nuestros datos:


El aspecto del archivo de excel que queremos cargar en access es el siguiente:



Y vamos a utilizar una instrucción for, para iterar por cada una de las filas de nuestro excel, extraer los datos y poder pasarlos a la instrucción INSERT INTO:


Finalmente, el cargue lo realizamos mediante el uso de nuestro comando. 

La instrucción INSERT INTO en este ejemplo, requiere que le digamos la tabla, los campos y el valor que va a ir en cada campo: 

"INSERT INTO tblReales (geografia, pais, desc_ceco, desc_item, ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic) VALUES('Mexico', 'Mexico','" & ceco & "', '" & item & "', " & ene & ", " & feb & ", " & mar & ", " & abr & ", " & may & ", " & jun & ", " & jul & ", " & ago & ", " & sep & ", " & oct & ", " & nov & ", " & dic & ")"

Y este es el código completo:

Código:
Sub cargue_data_real()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim filas As Long
Dim ceco As String
Dim item As String
Dim ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic As String
cnn.Provider = "Microsoft.ACE.OLEDB.12.0"
cnn.Properties("Data Source") = "" & Sheets("Configuracion").Range("B3").Text
cnn.Properties("Jet OLEDB:Database Password") = ""
cnn.Open
With cmd
.ActiveConnection = cnn
.CommandText = "DELETE * FROM tblReales"
.CommandType = adCmdText
.Execute
End With
filas = Sheets("Configuracion").Range("B2").Value
For i = 11 To filas
ceco = Sheets("Real").Range("A" & i).Text
item = Sheets("Real").Range("B" & i).Text
ene = Replace(Sheets("Real").Range("C" & i).Text, ",", ".")
feb = Replace(Sheets("Real").Range("D" & i).Text, ",", ".")
mar = Replace(Sheets("Real").Range("E" & i).Text, ",", ".")
abr = Replace(Sheets("Real").Range("F" & i).Text, ",", ".")
may = Replace(Sheets("Real").Range("G" & i).Text, ",", ".")
jun = Replace(Sheets("Real").Range("H" & i).Text, ",", ".")
jul = Replace(Sheets("Real").Range("I" & i).Text, ",", ".")
ago = Replace(Sheets("Real").Range("J" & i).Text, ",", ".")
sep = Replace(Sheets("Real").Range("K" & i).Text, ",", ".")
oct = Replace(Sheets("Real").Range("L" & i).Text, ",", ".")
nov = Replace(Sheets("Real").Range("M" & i).Text, ",", ".")
dic = Replace(Sheets("Real").Range("N" & i).Text, ",", ".")
With cmd
.ActiveConnection = cnn
.CommandText = "INSERT INTO tblReales (geografia, pais, desc_ceco, desc_item, ene, feb, mar, abr, may, jun, jul, ago, sep, oct, nov, dic) VALUES('Mexico', 'Mexico','" & ceco & "', '" & item & "', " & ene & ", " & feb & ", " & mar & ", " & abr & ", " & may & ", " & jun & ", " & jul & ", " & ago & ", " & sep & ", " & oct & ", " & nov & ", " & dic & ")"
.CommandType = adCmdText
.Execute
End With
Next i
MsgBox "Proceso Finalizado", vbInformation, "Fin de Proceso"
End Sub
view raw insert_into.vb hosted with ❤ by GitHub




1 comentario: