problemas con Programacion de tablas dinamicas

21/07/2006 - 01:10 por Cristian | Informe spam
Hola a todos:

Mi pregunta es sobre tablas dinamicas, especificamente la programacion
de ellas con vba. El tema es que el orden de los elementos de la coleccion
columnitems y rowitems miembros de pivotcell (que a su vez es miembro de
range), no es el mismo que el orden de las colecciones columnfields y
rowfields del objeto pivottable.

Bueno el problema especifico es el siguiente: "crear un codigo que sea
capaz de identificar los criterios (los elementos de columna, fila y pagina)
de la celda activa y filtre el rango base de la tabla dinamica de acuerdo a
esos criterios... similar a lo que ocurre cuando esta seleccionada una celda
en una tabla dinamica y se le da doble clic (mostrar detalles) ahi se crea
una nueva hoja que nuestra los registros que constituyen el detalle de celda
actual, pero destaco mi idea ES FILTRAR la lista original, no obtener una
"copia" como lo hace el comando que detalle a anteriormente.

Para realizar lo anterior cree el siguiente codigo, pero como dije en un
principio el orden de las colecciones no es el mismo. es decir, cuando el
usuario reordena los campos de filas o columnas, la coleccion columnitems y
rowitems se "ordena", pero las colecciones columnfields y rowfields se
mantienen tal cual (en el orden en que fueron agregados los campos)... en
definitiva aqui esta parte del codigo usado:

Dim rng As Range
origen = ActiveCell.PivotTable.SourceData
p = InStr(1, origen, "!")
hoja = Left(origen, p - 1)
Rango = Mid(origen, p + 1)
Rango = Replace(Rango, "F", "R")
w = Application.ConvertFormula(Rango, xlR1C1, xlA1, True)

Set rng = Range(hoja & "!" & w)

If rng.Worksheet.FilterMode Then rng.Worksheet.ShowAllData
For C = 1 To ActiveCell.PivotCell.ColumnItems.Count
cmpo = ActiveCell.PivotTable.ColumnFields(C)
cmpov = ActiveCell.PivotCell.ColumnItems(C)
rng.AutoFilter Application.Match(cmpo, rng.Rows(1), 0), cmpov
Next C

For R = 1 To ActiveCell.PivotCell.RowItems.Count
cmpo = ActiveCell.PivotTable.RowFields(R)
cmpov = ActiveCell.PivotCell.RowItems(R)
rng.AutoFilter Application.Match(cmpo, rng.Rows(1), 0), cmpov
Next R
rng.Worksheet.Activate

bueno como veran si lo pares de datos no corresponden la lista filtrada
arroja cero registros, pues estoy filtrando un campo con el valor de otro...

Si alguien tiene alguna idea de como hacer esto se lo agrazco desde ya

Saludos, CRISTIAN
 

Leer las respuestas

#1 Luis Garcia
21/07/2006 - 08:44 | Informe spam
Hola:

Primero, yo tengo Excel 2000 y no 'recuerdo' que tuviera la propiedad
PivotCell ni las colecciones RowFields y RowItems, pero si todo sigue igual,
a las colecciones siempre puedes (mejor dicho, deberias) acceder por su
nombre no por su indice.

Es decir, con el indice (C) buscas el nombre del Campo

cmpo = ActiveCell.PivotTable.ColumnFields(C).Name



Y luego, con el nombre del campo obtenido buscas el elemento

cmpov = ActiveCell.PivotCell.ColumnItems(cmpo).Name



Nota: todo esto no lo he podido probar, pero por ahi deben ir los tiros.

Saludos


"Cristian" escribió en el mensaje
news:
Hola a todos:

Mi pregunta es sobre tablas dinamicas, especificamente la programacion
de ellas con vba. El tema es que el orden de los elementos de la


coleccion
columnitems y rowitems miembros de pivotcell (que a su vez es miembro de
range), no es el mismo que el orden de las colecciones columnfields y
rowfields del objeto pivottable.

Bueno el problema especifico es el siguiente: "crear un codigo que sea
capaz de identificar los criterios (los elementos de columna, fila y


pagina)
de la celda activa y filtre el rango base de la tabla dinamica de acuerdo


a
esos criterios... similar a lo que ocurre cuando esta seleccionada una


celda
en una tabla dinamica y se le da doble clic (mostrar detalles) ahi se crea
una nueva hoja que nuestra los registros que constituyen el detalle de


celda
actual, pero destaco mi idea ES FILTRAR la lista original, no obtener una
"copia" como lo hace el comando que detalle a anteriormente.

Para realizar lo anterior cree el siguiente codigo, pero como dije en


un
principio el orden de las colecciones no es el mismo. es decir, cuando el
usuario reordena los campos de filas o columnas, la coleccion columnitems


y
rowitems se "ordena", pero las colecciones columnfields y rowfields se
mantienen tal cual (en el orden en que fueron agregados los campos)... en
definitiva aqui esta parte del codigo usado:

Dim rng As Range
origen = ActiveCell.PivotTable.SourceData
p = InStr(1, origen, "!")
hoja = Left(origen, p - 1)
Rango = Mid(origen, p + 1)
Rango = Replace(Rango, "F", "R")
w = Application.ConvertFormula(Rango, xlR1C1, xlA1, True)

Set rng = Range(hoja & "!" & w)

If rng.Worksheet.FilterMode Then rng.Worksheet.ShowAllData
For C = 1 To ActiveCell.PivotCell.ColumnItems.Count
cmpo = ActiveCell.PivotTable.ColumnFields(C)
cmpov = ActiveCell.PivotCell.ColumnItems(C)
rng.AutoFilter Application.Match(cmpo, rng.Rows(1), 0), cmpov
Next C

For R = 1 To ActiveCell.PivotCell.RowItems.Count
cmpo = ActiveCell.PivotTable.RowFields(R)
cmpov = ActiveCell.PivotCell.RowItems(R)
rng.AutoFilter Application.Match(cmpo, rng.Rows(1), 0), cmpov
Next R
rng.Worksheet.Activate

bueno como veran si lo pares de datos no corresponden la lista filtrada
arroja cero registros, pues estoy filtrando un campo con el valor de


otro...

Si alguien tiene alguna idea de como hacer esto se lo agrazco desde ya

Saludos, CRISTIAN


Preguntas similares