Anda di halaman 1dari 9

Excel y bases de datos (Oracle)

1 OCTUBRE, 2011 DEJA UN COMENTARIO

Como continuacin de posts anteriores, en esta ocasin vamos a analizar como establecer una conexin entre Excel y una base de
datos Oracle, que nos permita hacer una consulta devolviendo los datos a Excel. Ya coment que son diversas las tareas que se
pueden efectuar entre una base de datos y Excel. As que para tener un primer contacto y repasar las diferencias que existen entre
unos SGBD y otros, he preferido no adentrarme demasiado en otro tipo de operaciones.
Como hacamos en otras macros, es necesario como paso previo tener activadas las referencias oportunas: Microsoft ActiveX Data
Objects 2.x. Este ejemplo ha sido desarrollado con la versin Oracle Database Express Edition. Para ello he creado una pequea
tabla EMPLEADOS con tres campos ID, NOMBRE y EDAD.

Veamos el cdigo:
Sub excel_oracle()
Definiendo las variables para la conexin, reordset, columnaumnas y filas
Dim conexion As ADODB.Connection
Dim rs As ADODB.Recordset
Dim columna As Integer
Dim fila As Integer
creando la conexin a la base de datos y al recordset
Set conexion = New ADODB.Connection
Set rs = New ADODB.Recordset
parmetros de la conexin
conexion.Open ( _
User ID=system & _
;Password=root & _
;Data Source=XE & _
;Provider=MSDAORA.1)
sentencia SQL sacando todos los datos de la tabla EMPLEADOS
rs.Open select * from EMPLEADOS, conexion
vamos a presentar los resultados poniendo el contador a cero

Colocamos los datos empezando por os ttulos de las columnas

columna = 0
En la primera fila:los nombres de las columnas
Do While columna < rs.Fields.Count
Cells(1, columna + 1) = rs.Fields(columna).Name

columna = columna + 1
Loop
Ahora los datos obtenidos de la seleccin
fila = 1
Do While Not rs.EOF
fila = fila + 1
columna = 0
Do While columna < rs.Fields.Count
Cells(fila, columna + 1) = rs.Fields(columna).Value
columna = columna + 1
Loop
rs.MoveNext
Loop
End Sub
El fragmento de cdigo referente a la conexin, nos marca los parmetros que se precisan para realizar la misma: el usuario (en
este caso system) , la contrasea (root) el origen de los datos (la base de datos XE) y el proveedor OLEDB de Microsoft para
Oracle que es MSDAORA.1.
Despus lanzamos la orden SQL y presentamos los datos con dos bucles, uno para la cabecera, y otro para los datos. Y aqu el
resultado:

FILED UNDER EXCEL Y BASES DE DATOS TAGGED WITH ORACLE

Excel y bases de datos (MySQL)


29 SEPTIEMBRE, 2011 1 COMENTARIO

Como continuacin del post anterior, en este vamos a tratar la conexin de Excel con el gestor de bases de datosMySQL. Las
operaciones que se pueden realizar entre una hoja Excel y una base de datos pueden ser variadas,tanto como para trabajar un
tutorial aparte. No obstante se pueden abordar las principales:

Crear/eliminar una base de datos.

Crear/eliminar tablas y campos.

Hacer consultas generales o especficas.


Insertar datos o borrarlos.

En el post anterior trat de como crear una base de datos en Access, con sus tablas y campos; y el volcado posterior de datos de
Excel hacia Access. Ms adelante ir tratando el resto de operaciones que podemos efectuar entre los dos programas de Microsoft,
mediante VBA.
Por ahora vamos a analizar como hacer operaciones con MySQL.
Si lo analizan bien, casi siempre efectumos los mismos pasos:
1.

Debemos crear el espacio de trabajo, donde debemos especificar a Excel el motor que se precisa para hacer la conexin
al gestor de bases de datos.

2.

Tenemos que marcar las referencias especficas para que Excel la carge y la tenga disponible en su biblioteca.

3.

Preparamos las variables para:

la conexin

servidor

usuario

contrasea

nombre de la base con la que trabajar

las tablas y campos en su caso.

Una vez tratado los datos, es decir ejecutada la peticin, cerrarmos la conexin y vaciamos las variables objeto.
Bien en el caso que nos ocupa y, atendiendo al primer punto, debemos cargar la referencia a la librera Microsoft Active X Data
Objects 2.x .
Lo ms probable es que no tenga descargado los drivers para la conexin con MySQL. Para ello vaya a esta direccin MySQL
ODBC 3.51 Driver. Le aconsejo que escoga Windows (x86, 32-bit), MSI Installer Connector-ODBC para 32-bit y en caso de
64 Windows (x86, 64-bit), MSI Installer Connector-ODBC. Una vez descargadodoble clic en el MSI y escoga instalacin
tpica.Una vez terminada la instalacin, puede verificar la misma en Panel de Control>Herramientas Administrativas>Orgenes de
datos ODBC. Clic en la pestaa Drivers y bsquelo en la lista:

A continuacin le expongo comentado el cdigo para volcar los datos de una base de datos de MySQL a Excel. En el ejemplo la
base que se ha empleado se llama directorio y la tabla example. Se ha utilizado un servidor local, con lo que la direccin del host
es la 127.0.0.1. Para poder practicar le aconsejo que inserte una nueva base de datos, sino tiene una ya creada, con una tabla y
unos pocos datos.
Para empezar y como paso previo cargamos la referencia a la librera Microsoft Active X Data Objects 2.x
Se presupone instalado el driver MySQL ODBC 3.51
Comenzando
Sub excelMySQL()
variable para la conexin
Dim conexion As New ADODB.Connection
idem para el nombre del servidor en este caso estoy empleando una versin en local
Dim miservidor As String
ahora la base de datos en este caso se llama directorio y la tabla example
Dim bd As String
variables para usuario y contrasea (no la creo porque no la tengo en el servidor, en otro caso hay que crearla
Dim user As String
variables para la tabla que tiene slo tres campos
Dim i As Long, tabla, nombre, edad, consulta As String
el recordset
Dim rs As ADODB.Recordset
Estableciendo la conexin
miservidor = 127.0.0.1
bd = directorio
user = root
Set conexion = New ADODB.Connection con esto utilizamos la conexin indicada ms arriba
conexion.Open DRIVER={MySQL ODBC 3.51 Driver} _
& ;SERVER= & miservidor _
& ;DATABASE= & bd _
& ;UID= & user _
& ;OPTION=16427

A partir de aqu si todo ha ido bien podemos realizar varias acciones


Crear o eliminar tablas
Aadir campos
En este caso vamos a extraer datos a Excel

Set rs = New ADODB.Recordset


consulta = SELECT * FROM example
rs.Open consulta, conexion, adOpenStatic
With Worksheets(1).Cells
.ClearContents
.CopyFromRecordset rs
End With
Cerramos la conexin
On Error Resume Next
rs.Close
Set rs = Nothing
conexion.Close

Set conexion = Nothing


On Error GoTo 0
End Sub
Habr podido observar una lnea : rs.Open consulta, conexion, adOpenStatic. Quisiera comentarla un poco. El objeto Recordset
es el interface entre los datos obtenidos de nuestras consultas sobre las tablas y nuestras pginas excel. Representa
una tabla organizada en filas (registros) y columnas (campos). La propiedades y mtodos de Recordsets pasan por
entender el funcionamiento de otros dos objetos claves:
El cursor o puntero que nos permite desplazarnos por los registros del recordset. Dependiendo del tipo elegido determinaremos
los desplazamientos y cambios realizables en los datos.
El tipo de cursor lo definiremos mediante la propiedad CursorType, los posibles valores son:

El otro objeto es el cierre o tipo de bloqueo que efectuaremos en la base de datos cuando modifiquemos un recordset, a fin de
evitar que dos o mas usuarios accedan a modificar un mismo registro a la vez.
El tipo de cierre lo definiremos mediante la propiedad LockType, los posibles valores son:

Por ltimo habr podido observar el parmetro : & ;OPTION=16427. Esto nos asegura que los valores numricos de tipo large son
interpretados correctamente por Excel.
FILED UNDER EXCEL Y BASES DE DATOS TAGGED WITH MYSQL

Excel y bases de datos (Access)


26 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

En este post voy a intentar explicar como utilizar objetos para crear bases de datos, introducir datos, modificar su contenido o crear
consultas, mediante VBA Excel.
Excel ya lleva incorporada una serie de funciones para trabajar con bases de datos, que gestionan mltiples tareas para el usuario.
Si queremos, no obstante, automatizar y potenciar estas tareas debemos hacer uso de VBA.
Antes que nada es necesario aclarar algunos conceptos claves.
Las aplicaciones utilizan unos mecanismos para conectarse a bases de datos (en adelante BD). Son los ActiveXData
Objects (ADO),.

Con ADO, un programa puede leer, insertar, editar, o borrar, la informacin contenida dentro de la base de datos. Adems, se puede
manipular la propia base para crear nuevas tablas, como tambin alterar o eliminar las ya existentes, entre otras cosas.
ADO sustituy a DAO y a RDO (para BD remotas) que eran los sistemas previos que se usaban.
La ltima versin de ADO, creada por Microsoft, se llama ADO.NET, y se usa en los entornos de programacin de la
plataforma .NET, de Microsoft, para manejar bases de datos tanto en Windows como en la Web mediante ASP.NET, que es la
nueva versin del ASP para la plataforma.NET.
Comenzaremos para aquellos que trabajan con versiones antiguas de BD, trabajando con DAO.
Para utilizar los objetos de acceso a datos, lo primero que debemos hacer es crear una referencia a estos objetos. Para ello
recuerde dentro del editor VBA vamos a Herramientas-Referencias-Microsoft DAO 3.6 Object Library.
Cuando cargamos esta referencia se crea un primer objeto del que se derivan los dems con los que vamos a trabajar: DBEngine, a
partir del mismo obtendremos los espacios de trabajo (Workspace) donde se encontrarn cada una de las BD (database).

Una vez creada la BD obtendremos las TableDef por cada tabla que creemos con sus respectivos campos (Fields) y el ndice de
referencia de cada tabla (Index).
Al objeto de poder realizar los ejemplos sera conveniente que cree una carpeta por ejemplo C:\VisualExcel.
Supongamos que tenemos un libro con unos datos del que vamos a crear una base de datos. Podramos insertar un botn Crear
BD e insertarle el cdigo siguiente:
Private Sub CommandButton1_Click()
Dim bd As Database
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
End Sub
Si no tiene activada la referencia comprobar que no en la seleccin del tipo de variable objeto, no le aparece la opcin Database y
por lo tanto tendr un error.
Con el mtodo CreateDatabase escribimos como argumentos la ruta y el nombre del fichero a crear. Si no escribimos nada en la
extensin tomar el tipo por defecto que es Acces mdb.
Si en vez de crear manualmente la carpeta desea automatizarlo debera crear los procedimientos para verificar la ruta / archivo y en
su caso crear la BD. Veamos:
Procedimiento para crear la carpeta
Sub NuevaCarpeta(ruta As String, nombrecpt As String)
Verificamos que el directorio existe
If Dir(ruta, vbDirectory + vbHidden) <> Then
comprobamos que en dicha ruta no existe ya una carpeta con el mismo nombre aunque est oculta
If Dir(ruta & \ & nombrecpt, vbDirectory + vbHidden) = Then
si todo es correcto la creamos en la ruta y con el nombre especificados
MkDir ruta & \ & nombrecpt
mensaje:

MsgBox (Archivo creado: & ruta & \ & nombrecpt)

Else: MsgBox La carpeta ya existe


End If
Else: MsgBox Directorio no existente
End If
End Sub

Y para crear la BD
Private Sub CommandButton1_Click()
Dim bd As Database
On Error Resume Next
NuevaCarpeta C:\, VisualExcel
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
End Sub

Revise las funciones Medir y Dir, que realmente son comandos de MS-DOS adaptados a VBA.
Bien hemos creado la BD pero como comprobar est vaca. Por lo tanto hemos de crear las tablas, los campos y los ndices.

Para las tablas emplearemos el TableDef y para los campos Field como tipos.
Para crear los campos, al igual que en Access debemos indicar el nombre y su tipo.
Para crear la tabla emplearemos :
Set td= bd.CreateTableDef(Nombre_para_la_tabla)
Y para los campos, algo similar:
Set fldnombre= td.CreateField(Nombre,dbTex,8) es decir el nombre del campo, el tipo segn Access y su longitud.
Por ltimo escribiramos las sentencias para aadir los campos a la tabla, y la tabla a la base de datos.
Veamos como queda todo junto:
Private Sub CommandButton1_Click()
Dim bd As Database
Dim td As TableDef
Dim fldalias, fldnombre, fldapellidos, flddireccion, fldpoblacion, fldtelefono, fldnacimiento As Field
On Error Resume Next
creando la carpeta de ejemplo
NuevaCarpeta C:\, VisualExcel
creando la base de datos
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
ahora la tabla
Set td = bd.CreateTableDef(MiTabla)
creando los campos
Set fldalias = td.CreateField(Alias, dbText, 8)
Set fldnombre = td.CreateField(Nombre, dbText, 30)
Set fldapellidos = td.CreateField(Apellidos, dbText, 50)
Set flddireccion = td.CreateField(Direccion, dbText, 50)
Set fldpoblacion = td.CreateField(Poblacion, dbText, 50)
Set fldtelefono = td.CreateField(Telefono, dbInteger, 9)
Set fldnacimiento = td.CreateField(Fecha_nacimiento, dbDate)
aadiendo los campos a la tabla

td.Fields.Append fldalias
td.Fields.Append fldnombre
td.Fields.Append fldapellidos
td.Fields.Append flddireccion
td.Fields.Append fldpoblacion
td.Fields.Append fldtelefono
td.Fields.Append fldnacimiento
aadiendo la tabla
bd.TableDefs.Append td
End Sub
Si abre ACCESS ver que se ha creado la base de datos, con la tabla y los campos correspondientes. Tambin comprobar que lo
ha hecho en modo Access 2000.
Una forma alternativa y ms cmoda podra ser crear los campos con un bucle Withwend. En el ejemplo siguiente podr ver
cmo adems creamos un campo autoincrementable:
Creando la base de datos
Sub base_datos()
creamos las variables objeto para el espacio de trabajo
Dim ws As Workspace
la base de datos a la que llamar bd
Dim bd As Database
y la nica tabla de la bd que se llamara td
Dim td As TableDef
para los campos uno por cada columna
Dim id, apellidos, nombre, direccion, pob, tel As Field
creando los objetos
Set ws = DBEngine.Workspaces(0)
Set bd = ws.CreateDatabase(C:\mi_bd, dbLangGeneral)
Set td = bd.CreateTableDef(MiTabla)
necesito crear un campo contador para ello lo creo aparte de los otros
Set id = td.CreateField(Id, dbLong)
id.Attributes = dbAutoIncrField
td.Fields.Append id
creando y aadiendo el resto de campos de una sla vez
With td.Fields
.Append td.CreateField(Alias, dbText, 30)
.Append td.CreateField(apellidos, dbText, 30)
.Append td.CreateField(nombre, dbText, 30)
.Append td.CreateField(direccin, dbText, 50)
.Append td.CreateField(poblacin, dbText, 30)
.Append td.CreateField(tel, dbLong)
End With
aadiendo la tabla a la base de datos
bd.TableDefs.Append td
If Error = Then
MsgBox Base de datos creada
End If
End Sub
Bien hasta ahora lo que hemos hecho es crear la base, las tablas etc Pero todava no hemos volcado los datos a Access. Veamos
como podriamos hacerlo:

Exportando los datos con DAO


Sub exportar_datos()
Dim bd As Database, rs As Recordset, r As Long, x As Long, td As TableDef
abriendo la base de datos
Set bd = OpenDatabase(C:\mi_bd.mdb)
abriendo recordset
Set rs = bd.OpenRecordset(MiTabla, dbOpenTable)
recogiendo todos los campos en una tabla
r = 2 empiezo en la fila 2 de la hoja 1
Do While Len(Range(A & r).Formula) > 0
repetir hasta la primera celda vaca de la columna A
With rs
.AddNew
.Fields(Alias) = Range(B & r).Value
.Fields(apellidos) = Range(C & r).Value
.Fields(nombre) = Range(D & r).Value
.Fields(direccin) = Range(E & r).Value
.Fields(poblacin) = Range(F & r).Value
.Fields(tel) = Range(G & r).Value
.Update
End With
r=r+1
Loop
x = rs.RecordCount
cerramos
rs.Close
Set rs = Nothing
bd.Close
Set bd = Nothing
If Error = Then
MsgBox Exportacin correcta se han creado & x & registros.
End If
End Sub
Si en algn momento dado quisiramos eliminar la base usaramos la funcin Kill:
Para elminarla
Sub eliminar_bd()
Kill (C:\mi_bd.mdb)
End Sub

Anda mungkin juga menyukai