Problema al establecer la propiedad SourceData del objeto PivotTable

28/07/2006 - 16:45 por Cristian | Informe spam
Hola a todos:

Alguien sabe porque no funciona la propiedad sourcedata para una tabla
dinaminca cuyo tipo de origen es consolidacion (sourcetype=
xlconsolidation), explico esto con el codigo que uso para actualizar el
origen de la tabla (hago notar que si funciona con pivottablewizard del
objeto worksheet, pero no de pivottable)


Dim rng(1) As Range
Dim tdin As PivotTable
Set tdin = Worksheets("rdif").PivotTables(1)
Set rng(0) = Worksheets("rcte").PivotTables(1).DataBodyRange.Offset(-1, -1)
Set rng(1) = Worksheets("rcont").PivotTables(1).DataBodyRange.Offset(-1, -1)

'*************** alternativa 1: no funciona... excel se cuelga
**********************
tdin.SourceData(1, 1) = rng(0).Address(True, True, xlR1C1, True)
tdin.SourceData(2, 1) = rng(1).Address(True, True, xlR1C1, True)

'*************** alternativa 2: no funciona... excel se cuelga
**********************
tdin.SourceData=Array(Array(rng(0).Address(True, True, xlR1C1, True),
"CtaCte"), Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))

'*************** alternativa 3: no funciona... excel se cuelga
**********************
tdin.PivotTableWizard SourceType:=xlConsolidation,
SourceData:=Array(Array(rng(0).Address(True, True, xlR1C1, True), "CtaCte"),
Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))

'*************** alternativa 4: si funciona ******************
Worksheets("rdif").PivotTableWizard SourceType:=xlConsolidation,
SourceData:=Array(Array(rng(0).Address(True, True, xlR1C1, True), "CtaCte"),
Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))


Saludos, CRISTIAN

obs: windows xp pro sp2, office 2003 sp2
 

Leer las respuestas

#1 Héctor Miguel
29/07/2006 - 04:06 | Informe spam
hola, Cristian !

... porque no funciona la propiedad sourcedata para una tabla dinaminca cuyo tipo de origen es consolidacion
(sourcetype=xlconsolidation), explico esto con el codigo que uso para actualizar el origen de la tabla
(hago notar que si funciona con pivottablewizard del objeto worksheet, pero no de pivottable)



-> aunqe resulta dificil imaginar tanto el arreglo de tus datos 'de origen' como el arreglo [y los campos] de tus TD's -?-
te paso algo de informacion [hasta donde se] en relacion con 'SourceData', 'PivotTableWizard' y rangos de consolidacion multiple

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

1) el metodo 'PivotTableWizard' [aunque no presenta al asistente]... -> 'crea' el origen [o 're-defne' el arreglo] de una TD
es lo mismo que usar el asistente para 'casi-casi' empezar desde CERO la definicion y el arreglo de los campos de la TD -nueva o existente-
REQUIERE: que la hoja donde se ha de 'activar' el asistente...
a) NO contenga ninguna TD [dicha hoja se 'auto-activa' despues del asistente] o...
b) SEA la hoja 'activa' y la primer celda de la TD 'este' como activa -tambien-
de lo contrario, el metodo 'PovotTableWizard' FALLARA !!! :-(

2) 'SourceData'... [como argumento del metodo 'PivotTablewizard'] REQUIERE:
a) especificar el argumento 'SourceType' como 'xlConsolidation'
b) que el 'SourceData' SEA: un objeto Range, una matriz de rangos o una constante de texto que represente el nombre de otra TD

3) 'SourceData'... [como propiedad de una TD] 'devuelve' -> el origen de datos de la tabla dinamica
a) si se trata de una TD de varios rangos de consolidacion: devuelve una matriz de dos dimensiones
donde... -> cada fila consta de una referencia y sus elementos de campo de pagina asociados
[supongo que 'por aqui anda'... la 'falla' de las alternativas 1 y 2] -?-
b) cuando se trata de una TD de varios rangos de consolidacion... [no he encontrado la forma de 'manipularlo'] :-((

4) para establecer cual es el rango de cada 'origen consolidado' usas
-> Set rng(0) = Worksheets("rcte").PivotTables(1).DataBodyRange.Offset(-1, -1)
donde el 'Offset' define el mismo numero de filas/columnas que el 'DataBodyRange'
[pero] desplazandolo una columna y fila anteriores al rango 'real' de datos
por lo cual [se supone/espera/... que] conoces +/- exactamente...
cuantos campos contiene la TD-'origen' en filas y columnas y... los 'sub-totales' -???-
[ademas de que]... estas dejando 'fuera' del -nuevo- rango de origen la ultima fila del 'DataBodyRange' [por el Ottset -1]

5) toma en cuenta los incisos a y b del punto 1 anterior [ACTIVAS 'la hoja y la celda']... y prueba con las siguientes modificaciones...

Dim rng(1) As Range, tdin As PivotTable
Set tdin = Worksheets("rdif").PivotTables(1)
With Worksheets("rcte").PivotTables(1).DataBodyRange
Set rng(0) = .Offset(-1, -1).Resize(, 2)
End With
With Worksheets("rcont").PivotTables(1).DataBodyRange
Set rng(1) = .Offset(-1, -1).Resize(, 2)
End With
tdin.Parent.PivotTableWizard _
SourceType:=xlConsolidation, _
SourceData:=Array( _
Array(rng(0).Address(1, 1, xlR1C1, 1), "CtaCte"), _
Array(rng(1).Address(1, 1, xlR1C1, 1), "Cont"))

=__ el codigo expuesto __
Dim rng(1) As Range
Dim tdin As PivotTable
Set tdin = Worksheets("rdif").PivotTables(1)
Set rng(0) = Worksheets("rcte").PivotTables(1).DataBodyRange.Offset(-1, -1)
Set rng(1) = Worksheets("rcont").PivotTables(1).DataBodyRange.Offset(-1, -1)
'*************** alternativa 1: no funciona... excel se cuelga **********************
tdin.SourceData(1, 1) = rng(0).Address(True, True, xlR1C1, True)
tdin.SourceData(2, 1) = rng(1).Address(True, True, xlR1C1, True)
'*************** alternativa 2: no funciona... excel se cuelga **********************
tdin.SourceData=Array(Array(rng(0).Address(True, True, xlR1C1, True), "CtaCte"), Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))
'*************** alternativa 3: no funciona... excel se cuelga **********************
tdin.PivotTableWizard SourceType:=xlConsolidation,
SourceData:=Array(Array(rng(0).Address(True, True, xlR1C1, True), "CtaCte"), Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))
'*************** alternativa 4: si funciona ******************
Worksheets("rdif").PivotTableWizard SourceType:=xlConsolidation, SourceData:=Array(Array(rng(0).Address(True, True, xlR1C1, True), "CtaCte"), Array(rng(1).Address(True, True, xlR1C1, True), "Cont"))

Saludos, CRISTIAN
obs: windows xp pro sp2, office 2003 sp2

Preguntas similares