jueves, 19 de junio de 2008

Conexión desde una Macro de Excel con Oracle

Bueno, pues después de ya algunos días, que digo!!!! mas de un mes sin colocar una entrada, comienzo nuevamente.
Ahora el problema y la solución que les comparto es algo sencillo pero muy "útil" cuando queremos trabajar con datos de una base de datos (en Oracle) en algún archivo de Excel. Quizá queremos consultar información únicamente, quizá queremos realizar inserciones a nuestra base de datos.

Lo primero que tenemos que hacer es instalar el cliente de Oracle (en caso de que no lo tengamos). Este paso del "cliente" lo vamos a obviar ya que el tema solo trata sobre la conexión desde una macro con Oracle.
Bueno, cuando tengamos abierto nuestro archivo de Excel, presionemos las teclas Alt-F11 para abrir el Visual Basic. Para realizar la conexión, así como las consultas se utilizan los objetos ADODB.Connection y ADODB.Recordset, respectivamente. Entonces necesitamos agregar un módulo que contenga estos objetos. para ello, vamos el menú Herramientas->Referencias y buscamos el objeto Microsoft ActiveX Data Object x.x Library (x.x versión del módulo), lo seleccionamos y lo agregamos.




Ahora creamos nuestro módulo para la macro que se conectará a Oracle y realizamos lo siguiente:

Sub conexion_a_oracle()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

'realizamos la conexion con Oracle, "usuario" es el nombre de usario para conectarse
' "password" la contraseña para conectarse y "esquemaBd" y nombre de la base de datos

cn.Open ( _
"User ID=usuario" & _
";Password=password" & _
";Data Source=esquemaBd" & _
";Provider=MSDAORA.1")

'con esto ya hemos conectado a Oracle, ahora para realizar una consulta y recorrer los
'resultados en una celda seria como sigue

rs.Open "select trim('hola a todos ') from dual", cn

row = 0
Do While Not rs.EOF
row = row + 1
col = 0

Do While col < rs.Fields.Count
fila = "A" & (row)
Range(fila) = rs.Fields(col).Value
col = col + 1
Loop
rs.MoveNext

Loop

'Cerramos el recorset y la conexion
rs.Close
cn.Close

End Sub

Con esto hemos finalizado la conexión con Oracle desde una Macro de Excel. Cualquier duda, sugerencia o comentario no dejen de escribir...
Espero que les ayude!!!




7 comentarios:

Unknown dijo...

s

Anónimo dijo...

Que tal Isaí, me parecen buenos los temas que pones, de manera personal me gustaria que pusieras algo sobre optimizacion de consultas en oracle, o planes de ejecucion del dbms.

Saludos y a ver cuando invitas una cerveza. :D

Xavysaurio dijo...

me cae que cuando tengá examen de informatica te voy a venir a preguntar XD

Anónimo dijo...

Excelente tema, me ayudo mucho, saludos!

Luis ordoñez dijo...

Gracias, me has sacado de un enorme lio

Unknown dijo...

Hola buenos dias, te escribo para poder solicitar una ayuda.

Yo necesito conectarme a una BD de oracle desde una macro de excel, eso ya me sale, pero no encuentro la forma de ejecutar un procedimiento del oracle desde esta macro. Yo uso.

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open ("User ID=prueba;Password=inicio;Data Source=DBPRODUC;Provider=OraOLEDB.Oracle")
rs.Open "SELECT sysdate FROM dual", cn
Row = 0
Do While Not rs.EOF
Row = Row + 1
col = 0

Do While col < rs.Fields.Count
fila = "A" & (Row)
Range(fila) = rs.Fields(col).Value
col = col + 1
Loop
rs.MoveNext
Loop

rs.Close
cn.Close

Pero el problema es que tengo una sentencia SQL que lleva un monton de parametros (20 lineas de instruccion aprox), para ello, en el oracle cree el procedure, pero nose como llamarlo desde aca.

Agradeceria si tienes alguna forma de poder ayudarme, me gustaria si tuvieses un ejemplo o, mas aun, si puedes explicarme.

Muchas gracias de antemano

Juanes dijo...

En la parte CON.Open se detiene y genera este error: Provider cannot found. It may not be properly installed.