Accesar Excel con ADO

10/05/2010 - 17:30 por JC. | Informe spam
Estoy utilizando Excel como un banco de datos para lo cual realizo la
coneccion que les muestro adelante, pero cuando llego a la "asignacion" del
recordset al cache de la tabla dinamica (ya existente) me da el siguiente
error "Method Recordset of object Pivotcache failed". Me pueden decir como
corregirlo y si estoy haciendo bien la asignacion a la tabla dinamica ya
existente. Esto ultimo lo hice con una ayuda que Hector me dio hace unos años
pero no se si funciona en la actualidad. Uso Excel 2007. Nota: el
CopyFromRecordset lo utilice transitoriamente para saber si la consulta se
estaba ejecutando momentaneamente, aqui es un comentario.

Sub Prueba()
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim PC As PivotCache
Dim PT As PivotTable

Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data
Source=C:\Users\Owner\Documents\Rendimientos\Cartago.xls;" & _
"Extended Properties=Excel 8.0"
.Open
End With

Set rst = New ADODB.Recordset

With rst
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With

rst.Open "SELECT FECHA, HH, Media, SUM(SUM), Dia FROM
[VentasHora$A1:F15000]" & _
"GROUP BY FECHA, HH, Media, Dia", cn, , , adCmdText

' ThisWorkbook.Worksheets("Sheet4").Range("A2").CopyFromRecordset rst

Set PC = ActiveWorkbook.PivotCaches(4)
Set PC.Recordset = rst
Set PT = ActiveSheet.PivotTables("PivotTable2")
PT.PivotCache.Refresh

rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing
End Sub

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
13/05/2010 - 04:09 | Informe spam
hola, JC !

cuando se usa ADO para tomar como "base de datos" un archivo de excel
lo recomendable es: que el archivo que se consulta este cerrado
de lo contrario (si consultas un libro abierto o el mismo) dejaras "proyectos fantasma" en el editor de vba

otra (posible) "herencia" es que no se estan "destruyendo" los objetos creados (por cada instruccion Set <variable> = ...)
y cada vez que ejecutas esas macros vas dejando "recursos disminuidos" (como memoria)

y (por si las dudas) comprueba que las "nuevas" cadenas de conexion (link sugerido) no corrijan este comportamiento (?)

saludos,
hector.

__ OP __
Mostrar la cita
#7 JC.
13/05/2010 - 06:28 | Informe spam
Hola Hector

Si, eso es lo que estoy haciendo, manipulando una de las hojas del libro
donde estoy trabajado. Si esto es un problema, crees que una alternativa sera
utilizar el "copyfromrecordset" para trasladar la informacion ya agrupada a
otra hoja del mismo libro y despues actualizar la tabla dinamica? Aunque
hubiera querido que se pasara directamente al recordset de la tabla :-(

Con respecto a las variables tanto la coneccion como el recordset se cierran
y se limpian con el Nothing. Lo que No se es si tengo que hacerlo con el
cache que al final igualo a Nothing tambien paro no se si de la forma
correcta.

Por ultimo: Como compruebo que las "nuevas" cadenas de conexion (link
sugerido) no corrijan este comportamiento?

Aclaro, no se si estas confundiendo[me] con otro colistero que se "llama" JC
y que he visto tiene un conocimiento avanzado de Excel y yo no seria el caso.

Te adjunto de nuevo el codijo, Cualquier ayuda...

Sub Prueba()
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim PC As PivotCache
Dim PT As PivotTable

Set cn = New ADODB.Connection
With cn
' Codijo para OLE DB
'.Provider = "MSDASQL"
'.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _

'"DBQ=C:\Users\Owner\Documents\Pollazo\Rendimientos\ControlMermaCartago.xls;
ReadOnly=False;"
'.Open

.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data
Source=C:\Users\Owner\Documents\Rendimientos\ControlCartago.xls;" & _
"Extended Properties=Excel 8.0"
.Open
End With

Set rst = New ADODB.Recordset

With rst
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With

rst.Open "SELECT SUM(Cantidad) AS Cantidad, HH, FECHA, Media, Dia FROM
[VentasPolloHora$A1:F15000]" & _
"GROUP BY HH, FECHA, Media, Dia Order by Fecha", cn, , , adCmdText

'' ThisWorkbook.Worksheets("Sheet4").Range("A2").CopyFromRecordset rst

Set PC = ActiveWorkbook.PivotCaches(1)
Set PC.Recordset = rst
Set PT = ActiveSheet.PivotTables("Tabla dinámica1")
PT.PivotCache.Refresh

rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing
Set PC.Recordset = Nothing
Set PT.PivotCache = Nothing


End Sub

JC.

"Héctor Miguel" wrote:

Mostrar la cita
#8 Héctor Miguel
13/05/2010 - 07:23 | Informe spam
hola, JC ! (entre las lineas de tu mensaje)...
___
Mostrar la cita
me refiero a que al consultar sobre el mismo libro (de la macro con ADO) se crean los proyectos "fantasma" en vba
a menos que hagas un "thisworkbook.savecopyas ..." y trabajes el ADO con la copia del archivo
___
Mostrar la cita
solo comentar que en la consulta original NO contenia la destruccion ( ... = nothing) de los objetos de la TD (?)
___
Mostrar la cita
es probable que debas cambiar las cadenas de conexion las "extended properties" de "excel 8" a "excel 12" (por las TD en 2007 ?)

__
Mostrar la cita
solo me he estado dirigiendo a "quien" propuse los procedimientos Sub CrearTablaADO_RS(), y Sub ModificarADO_RS_de_Tabla()
___
Mostrar la cita
(creo que) vendria bien (ahora si) si subes tu archivo en algun sitio publico y proporcionas el enlace para su descarga (?)
(o enviamelo si quieres a: hemiordi<con dominio de>gmail.com

saludos,
hector.

__ el codigo expuesto __
Mostrar la cita
#9 JC.
13/05/2010 - 17:12 | Informe spam
Hola Hector

Con respecto a las "extended properties" ya habia probado con 12.0 pero me
da error.

Con a limpieza de las variables estamos OK.

Ya ten envie el archivo para que le des un vistaso a los proyectos fantasmas
para ver si es eso.

Saludos!!!
JC

"Héctor Miguel" wrote:

Mostrar la cita
#10 Héctor Miguel
14/05/2010 - 06:25 | Informe spam
hola, JC !

Mostrar la cita
creo recordar que a partir de la version 2007 se da un tratamiento distinto a la colecion "caches" de las tablas de datos
estas son las correcciones/adaptaciones/... que hice a tus codigos expuestos y la macro resultante (al final)
corri varias ejecuciones en la version 2007 y no obtuve mas errores ;)

saludos,
hector.

usas windows vista o superior ?...
FALTA: Microsoft ActiveX Data Objects 6.0 Library

la cambio por la version 2.8 (windows-xp)

cambio la linea de apertura de la conexion de esto:
.ConnectionString = "Data Source=C:\Users\Owner\Documents\Pollazo\Rendimientos\ControlMermaCartago.xls;" & _
"Extended Properties=Excel 8.0"

a esto (para no tener que reproducir la misma ubicacion de tu cadena de texto "constante":
.ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0"

invierto el orden de creacion de los objetos de la TD de esto:
Set PC = ActiveWorkbook.PivotCaches(1)
Set PC.Recordset = rst
Set PT = ActiveSheet.PivotTables("Tabla dinámica1")
PT.PivotCache.Refresh

a esto:
Set PT = ActiveSheet.PivotTables("Tabla dinámica1")
Set PC = PT.PivotCache
Set PC.Recordset = rst
PT.PivotCache.Refresh

y le agrego la destuccion de los objetos de la TD
Set PT = Nothing
Set PC = Nothing

Sub Prueba()
Dim cn As ADODB.Connection, rst As ADODB.Recordset, PC As PivotCache, PT As PivotTable
Set cn = New ADODB.Connection
With cn
.Provider = "microsoft.jet.oledb.4.0"
.ConnectionString = "data source=" & ThisWorkbook.FullName & ";extended properties=excel 8.0"
.Open
End With
Set rst = New ADODB.Recordset
With rst
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With
rst.Open "select sum(cantidad) as cantidad, HH, Fecha, Media, Dia from [ventaspollohora$a1:f15000]" & _
"group by HH, Fecha, Media, Dia Order by Fecha", cn, , , adCmdText
Set PT = ActiveSheet.PivotTables("Tabla dinámica1")
Set PC = PT.PivotCache
Set PC.Recordset = rst
PT.PivotCache.Refresh
rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing
Set PT = Nothing
Set PC = Nothing
End Sub
Ads by Google
Search Busqueda sugerida