Beruflich Dokumente
Kultur Dokumente
SQL
BY SERGIO ALEJANDRO CAMPOS FEBRUARY 8, 2011
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
'
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
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 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.
En
las
notas
anteriores
vimos
cmo
transferir
datos
de
Excel
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
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: