Sie sind auf Seite 1von 14

Conectar Excel a Access, MySql y

SQL
BY SERGIO ALEJANDRO CAMPOS FEBRUARY 8, 2011

En esta ocasin comparto 3 archivos que actualmente utilizo


para dar de alta datos a bases de datos de Access, SQL y MySql
desde Excel. Lo importante es saber exactamente el nombre de
la base de datos, la tabla, y en el caso de SQL y MySql, el
servidor, usuario y contrasea.
Comparto las macros que nos permiten hacer la tarea antes
mencionada, aunque los archivos adjuntos son completamente
funcionales.
Excel a Access
Sub exportaraccess()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, n As Long
Dim nfila As String
'
On Error GoTo Errores
If Range("a2") = "" Or Range("b2") = "" Or Range("c2") = "" Or Range("d2") = "" Or
Range("e2") = "" Then
MsgBox prompt:="No hay datos para exportar", Buttons:=vbOKOnly + vbCritical,
Title:="Campos vacios"
Exit Sub
End If
'
Set cn = New ADODB.Connection
cn.Open "provider=microsoft.jet.oledb.4.0; " & "data source=" & ThisWorkbook.Path & "" &
shtListas.Range("rngBase") & ".MDB;"
'cn.Open "provider=microsoft.jet.oledb.4.0; " & "data source=" & ThisWorkbook.Path &
"GUION.MDB;"
Set rs = New ADODB.Recordset
rs.Open shtListas.Range("rngTabla"), cn, adOpenKeyset, adLockOptimistic, adCmdTable
n = 2
Do While Range("a" & n) <> Empty

With rs
.AddNew
.Fields("Nombre") = Range("a" & n).Value
.Fields("Cuenta") = Range("b" & n).Value
.Fields("Password") = Range("c" & n).Value
.Fields("Permisos") = Range("d" & n).Value
.Fields("Campana") = Range("e" & n).Value
.Fields("Supervisor") = Range("f" & n).Value
.Fields("Monitoreos") = Range("g" & n).Value
.Fields("Estatus") = Range("h" & n).Value
.Fields("Nivel") = Range("i" & n).Value
.Fields("Tipo") = Range("j" & n).Value
.Fields("Grupo") = Range("k" & n).Value
.Fields("No Empleado") = Range("l" & n).Value
.Fields("Fecha Ingreso") = Date
End With
n = n + 1
Loop
With rs
.AddNew
.Fields("Nombre") = Range("a" & n).Value
.Fields("Cuenta") = Range("b" & n).Value
.Fields("Password") = Range("c" & n).Value
.Fields("Permisos") = Range("d" & n).Value
.Fields("Campana") = Range("e" & n).Value
.Fields("Supervisor") = Range("f" & n).Value
.Fields("Monitoreos") = Range("g" & n).Value
.Fields("Estatus") = Range("h" & n).Value
.Fields("Nivel") = Range("i" & n).Value
.Fields("Tipo") = Range("j" & n).Value
.Fields("Grupo") = Range("k" & n).Value
.Fields("No Empleado") = Range("l" & n).Value
.Fields("Fecha Ingreso") = Date
End With
'
Set rs = Nothing
cn.Close
Set cn = Nothing
'
MsgBox prompt:="Los datos fueron enviados correctamente", Buttons:=vbOKOnly,
Title:="DATOS EXPORTADOS"
Range("a2").Activate
'

If [a3] = Empty Then


Range("a2", Selection.End(xlToRight)).ClearContents
Exit Sub
End If
nfila = Range("A65535").End(xlUp).Row
'

Range("a2:F" + nfila).ClearContents

Exit Sub
Errores:
MsgBox Err.Description & vbNewLine & vbNewLine & "Recuerda que el archivo debe estar en
la misma ruta de la base de datos.", vbCritical, empresa
End Sub
Sub exportaraccess()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, n As Long
Dim nfila As String
'
On Error GoTo Errores
If Range("a2") = "" Or Range("b2") = "" Or Range("c2") = "" Or Range("d2") = "" Or
Range("e2") = "" Then
MsgBox prompt:="No hay datos para exportar", Buttons:=vbOKOnly + vbCritical,
Title:="Campos vacios"
Exit Sub
End If
'
Set cn = New ADODB.Connection
cn.Open "provider=microsoft.jet.oledb.4.0; " & "data source=" & ThisWorkbook.Path & "" &
shtListas.Range("rngBase") & ".MDB;"
'cn.Open "provider=microsoft.jet.oledb.4.0; " & "data source=" & ThisWorkbook.Path &
"GUION.MDB;"
Set rs = New ADODB.Recordset
rs.Open shtListas.Range("rngTabla"), cn, adOpenKeyset, adLockOptimistic, adCmdTable
n = 2
Do While Range("a" & n) <> Empty
With rs
.AddNew
.Fields("Nombre") = Range("a" & n).Value
.Fields("Cuenta") = Range("b" & n).Value
.Fields("Password") = Range("c" & n).Value
.Fields("Permisos") = Range("d" & n).Value
.Fields("Campana") = Range("e" & n).Value
.Fields("Supervisor") = Range("f" & n).Value
.Fields("Monitoreos") = Range("g" & n).Value
.Fields("Estatus") = Range("h" & n).Value
.Fields("Nivel") = Range("i" & n).Value

.Fields("Tipo") = Range("j" & n).Value


.Fields("Grupo") = Range("k" & n).Value
.Fields("No Empleado") = Range("l" & n).Value
.Fields("Fecha Ingreso") = Date
End With
n = n + 1
Loop
With rs
.AddNew
.Fields("Nombre") = Range("a" & n).Value
.Fields("Cuenta") = Range("b" & n).Value
.Fields("Password") = Range("c" & n).Value
.Fields("Permisos") = Range("d" & n).Value
.Fields("Campana") = Range("e" & n).Value
.Fields("Supervisor") = Range("f" & n).Value
.Fields("Monitoreos") = Range("g" & n).Value
.Fields("Estatus") = Range("h" & n).Value
.Fields("Nivel") = Range("i" & n).Value
.Fields("Tipo") = Range("j" & n).Value
.Fields("Grupo") = Range("k" & n).Value
.Fields("No Empleado") = Range("l" & n).Value
.Fields("Fecha Ingreso") = Date
End With
'
Set rs = Nothing
cn.Close
Set cn = Nothing
'
MsgBox prompt:="Los datos fueron enviados correctamente", Buttons:=vbOKOnly,
Title:="DATOS EXPORTADOS"
Range("a2").Activate
'
If [a3] = Empty Then
Range("a2", Selection.End(xlToRight)).ClearContents
Exit Sub
End If
nfila = Range("A65535").End(xlUp).Row
'

Range("a2:F" + nfila).ClearContents

Exit Sub
Errores:
MsgBox Err.Description & vbNewLine & vbNewLine & "Recuerda que el archivo debe estar en
la misma ruta de la base de datos.", vbCritical, empresa
End Sub

Excel a MySql (ser necesario descargar el driver 5.1 de


MySql)
Dim oConn As ADODB.Connection
Dim rs As ADODB.Recordset
'
Function ExcelMySql()
On Error GoTo err
Set oConn = New ADODB.Connection
oConn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _
"SERVER=100.1.11.11;" & _
"DATABASE=bd_database;" & _
"USER=user;" & _
"PASSWORD=pass;" & _
"Option=3"
Exit Function
err:
MsgBox "Se ha producido el siguiente error: " & err.Description, vbInformation,
ActiveWorkbook.Name
End Function
'
Function esc(txt As String)
esc = Trim(Replace(txt, "'", "'"))
End Function
'
'
Function InsertData()
On Error GoTo Er
'Se elimina la llamada a la funcin de conexin a la base de datos para hacerlo cuando inicie el
archivo
' Call ConnectDB
Set rs = New ADODB.Recordset
sFunction = Application.WorksheetFunction.CountA(Range("A:A"))
'
With shInsertData
For rowCursor = 2 To sFunction
strSQL = "INSERT INTO tbl_cat_usuarios (ID_txtusuariotelsys, txt_clavetelsys,
txt_nombre, txt_apepat, txt_apemat, bin_statusactivo, bin_nivel) " & _
"VALUES ('" & esc(.Cells(rowCursor, 1)) & "', " & _
"'" & esc(.Cells(rowCursor, 2)) & "', " & _
"'" & esc(.Cells(rowCursor, 3)) & "', " & _
"'" & esc(.Cells(rowCursor, 4)) & "', " & _
"'" & esc(.Cells(rowCursor, 5)) & "', " & _

esc(.Cells(rowCursor, 6)) & ", " & _


esc(.Cells(rowCursor, 7)) & ")"
'
'strSQL = "INSERT INTO tutorial (title, author, price) " & _
"VALUES ('" & esc(.Cells(rowCursor, 1)) & "', " & _
"'" & esc(.Cells(rowCursor, 2)) & "', " & _
esc (.Cells(rowCursor, 3)) & ")"
rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic
Next
End With
MsgBox "Exito", vbInformation
Exit Function
Er:
MsgBox "Error: " & err.Description, vbInformation, ActiveWorkbook.Name
End Function

Excel a SQL
Dim oConn As ADODB.Connection
Dim rs As ADODB.Recordset
'
Function ConnectDB()
On Error GoTo err
Set oConn = New ADODB.Connection
oConn.Open "Provider=SQLOLEDB.1;" & _
"Password=pass;" & _
"Persist Security Info=True;" & _
"User ID=user;" & _
"Initial Catalog=BASE;" & _
"Data Source=100.1.111.11"
MsgBox "xito al conectarse a la base de datos", vbInformation, "1"
Exit Function
err:
MsgBox "Se ha producido el siguiente error: " & err.Description, vbInformation,
ActiveWorkbook.Name
End Function
'
Function esc(txt As String)
esc = Trim(Replace(txt, "'", "'"))
End Function
'
'
Function InsertData()

On Error GoTo Er
'Se elimina la llamada a la funcin de conexin a la base de datos para hacerlo cuando inicie el
archivo
' Call ConnectDB
Set rs = New ADODB.Recordset
sFunction = Application.WorksheetFunction.CountA(Range("A:A"))
'
With shInsertData
For rowCursor = 2 To sFunction
strSQL = "INSERT INTO tbl_operador (ID, txt_nombre, txt_apepat, txt_apemat,
txt_tipocuenta, bit_activo, txt_rol, pws_contra) " & _
"VALUES ('" & esc(.Cells(rowCursor, 1)) & "', " & _
"'" & esc(.Cells(rowCursor, 2)) & "', " & _
"'" & esc(.Cells(rowCursor, 3)) & "', " & _
"'" & esc(.Cells(rowCursor, 4)) & "', " & _
"'" & esc(.Cells(rowCursor, 5)) & "', " & _
"'" & esc(.Cells(rowCursor, 6)) & "', " & _
esc(.Cells(rowCursor, 7)) & ", " & _
"'" & esc(.Cells(rowCursor, 8)) & "' )"
'
rs.Open strSQL, oConn, adOpenDynamic, adLockOptimistic
Next
End With
MsgBox "Las claves fueron dadas de alta correctamente.", vbInformation, "EXCELeINFO"
Exit Function
Er:
MsgBox "Error: " & err.Description, vbCritical, "EXCELeINFO"
End Function

2.

Transferir datos de Excel a Access - tercera nota


VIERNES, JULIO 17, 2009

En

las

notas

anteriores

vimos

cmo

transferir

datos

de

Excel

Access manualmente yprogramticamente.


La necesidad de usar Access surge como una de las soluciones posibles cuando queremos, por
ejemplo, consolidar datos de varias hojas en una nica base de datos para generar a partir de
ella

una

tabla

dinmica.

Si el total de filas a consolidar supera el lmite de una hoja de Excel (hasta la versin 2003
incluida, 65536 filas) no podemos almacenar los datos consolidados en una nica hoja.
Si trabajamos con Excel 2007 podemos almacenar ms de un milln de filas en una hoja, lo cual
nos exime de tener que usar herramientas externas a Excel. Pero como ms del 50% de los

usuarios usa versiones anteriores a Excel 2007, almacenar datos en Access es una buena
solucin.
En las soluciones que muestro en las notas mencionadas suponemos que Access estINSTALADO
en la mquina del usuario. Por supuesto, ste no es siempre el caso y en esta nota
mostraremos como usar Access como recipiente para nuestros datos an cuando no est
instalado

en

nuestra

mquina.

Empecemos por aclarar que los archivos con formato .mdb no requieren la presencia de Access
para poder ser utilizados. Estos archivos estn asociados con el Microsoft Jet Database Engine,
que est incluido en el paquete de Office. Si bien este componente ha sido abandonado por
Microsoft,

sigue

siendo

vigente

por

motivos

de

compatibilidad.

Nuestra meta es crear dos rutinas, una para crear el archivo .mdb y otra para almacenar los
datos

de

Nuestro

primer

Microsoft

Microsoft

en

la

el

Ext.

hoja
paso
ADO

ActiveX
editor

u
es
2.5

Data
de

hojas
crear
for
Object

VB,

Excel

en

en

una

DDL
2.5
el

la
referencia

tabla.
a

Security

(o

posteriores).

Library

(o

posteriores).

men

ToolsReferences

Un detalle a tomar en cuenta es que las macros que mostrar ms adelante estn construidas
para el ejemplo especfico de esta nota y hay que editarlas para adaptarlas a otros usos.

En nuestro ejemplo tenemos un cuaderno Excel con tres hojas. Cada hoja contiene datos de tres
distintos aos (2005, 2006 y 2007) que queremos consolidar en una nica hoja para construir a
partir

de

ella

una

tabla

dinmica.

La rutina para crear el archivo .mdb con una tabla para almacenar los datos es la siguiente:
OptionExplicit
ConstdataSourceAsString=
&

"provider=microsoft.jet.oledb.4.0;"

"data

source=d:\BaseDeDatos.mdb"

ConsttableNameAsString=

"datos_export"

SubcrearDB()
DimcatalogAsADOX.catalog
Dimnew_tableAsADOX.Table

'crear

la

Setcatalog

base

catalog.Create
'

crear

la

Setnew_table

tabla

new_table.Name
new_table.Columns.Append

dataSource

para

catalog.Tables.Append

contener

datos

tableName

"mes",

los

CreateObject("adox.table")

datos

CreateObject("adox.catalog")

new_table.Columns.Append
new_table.Columns.Append

de

"suma",

adDate
"pais"

adDouble
new_table

EndSub
En la parte superior del mdulo, antes de la rutina crearDB hemos definido dos constantes. Lo
hacemos de esta manera ya que tambin en la segunda rutina haremos uso de estas constantes.
Esta macro crea una base de datos Access (BaseDeDatos.mdb) con una tabla (datos_export)

Ahora tenemos que exportar los datos de la hoja activa al la tabla datos_export, lo que
hacemos

con

esta

macro:

SubAgregarDatos()
' exporta los datos de la hoja activa a una tabla de Access
'

'

este

procedimiento

Para

otros

es

DimcnAsADODB.Connection,

Setcn

especifico

hay

para

el

que

rsAsADODB.Recordset,

adaptarlo
filaAsLong

Setrs

dataSource

rs.Open

tableName,
all

cn,

ejemplo.

=NewADODB.Connection

cn.Open

'

usos

=NewADODB.Recordset

adOpenKeyset,

records

adLockOptimistic,

in

adCmdTable

table

fila = 2' la primer fila en la hoja despues de los encabezamientos


DoWhileLen(Cells(fila,

1))

>

Withrs
.AddNew
.Fields("mes")

&

fila).Value

.Fields("pais")

=
=

Range("A"
Range("B"

&

fila).Value

.Fields("suma")

Range("C"

&

fila).Value

1'

next

.Update
EndWith
fila

fila

row

Loop
rs.Close
Setrs

=Nothing

=Nothing

cn.Close
Setcn

EndSub

Esta rutina es la misma que hemos usado en la segunda nota de la serie, adaptada a nuestro
ejemplo.

Ahora activamos la hoja cuyos datos queremos exportar y corremos la macro para cada una de
las hojas que queremos consolidar.

A esta altura de los acontecimientos tenemos un archivo Access con un tabla que contiene los
datos de las hojas (podemos ver que el tamao del archivo se ha incrementado)

Ahora

podemos

crear

la

tabla

dinmica

usando

la

opcin

Fuente

de

datos

Externa

En el segundo paso creamos una nueva fuente de datos, que en nuestro ejemplo llamaremos
consolidarMdb

usando

el

driver

de

Access

Despus de apretar Connect, apretamos OK con lo cual hemos creado la nueva conexin. De
aqu en adelante seguimos los pasos del asistente tal como hemos mostrado en esta nota.

El

resultado:

Das könnte Ihnen auch gefallen