Jump to content
Sign in to follow this  
JaimeDavid27

Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Recommended Posts

Saludos a todos,

Nuevamente recurro a ustedes porque por mas que intento y pruebo no consigo dar solución.

El problema es el siguiente, en el fichero adjunto tengo una serie de tablas dinámicas, (en realidad son muchas mas) las cuales se van a actualizar en base a un ListBox (no ActiveX) que esta en la misma hoja, (estoy elaborando una especie de Dashboard), es por ello que de las TD puestas en el Adjunto (que son las de prueba), serán actualizadas en base al valor que indique en el Lb, pero el problema es que las tD no todos tiene el mismo "Filtro de Informe", con lo cual la macro debe de detectar y aplicar el filtro únicamente a las TD que tengan ese "Filtro" de lo contrario pasará a la siguiente TD, la lista de las TD, están indicadas en un array dentro de la misma macro que esta en el archivo adjunto.

A la espera de su generosa Ayuda.

Control TMP Mod.zip

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Gracias mjrofra, he revisando el link y realizado una copia del código, sin embargo, no consigo que funcione, a parte de ello, la verdad no comprendo mucho del codigo puesto ... me das una mano??

sobre todo en esta parte



[B]For[/B] [B]Each[/B] ws [B]In[/B] callerPT.Parent.Parent.Worksheets
[COLOR=#999988][I]' recorre cada una de las tablas dinámicas que se encuentran en la hoja de[/I][/COLOR]
[B]For[/B] [B]Each[/B] pt [B]In[/B] ws.PivotTables
[B]If[/B] pt [B]Is[/B] callerPT [B]Then[/B]
[COLOR=#999988][I]' no hay necesidad de hacer nada, es la tabla que disparó el evento[/I][/COLOR]
[B]Else[/B]
[COLOR=#999988][I]' se recorre cada uno de los campos de la tabla dinámica en cuestión y se[/I][/COLOR]
[COLOR=#999988][I]' actualiza el filtro, si lo tiene, para que sea igual al de la tabla que[/I][/COLOR]
[COLOR=#999988][I]' se cambio originalmente[/I][/COLOR]
[B]For[/B] [B]Each[/B] pf [B]In[/B] pt.PivotFields
pt.PivotFields(pf.Name).CurrentPage [B]=[/B] callerPT.PivotFields(pf.Name).CurrentPage.Name
[B]Next[/B] pf
[B]End[/B] [B]If[/B]
[B]Next[/B] pt
[B]Next[/B] ws

[/CODE]

en el primer for me pierdo, el "[color=#000000][font=Consolas]callerPT" entiendo que es el nombre de la TD que ha sido modificada, pero lo de parent... no comprendo en nada[/font][/color]

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Hola JaimeDavid,

la verdad, no había descargado tu archivo. No sé si te entiendo bien, pero quizás con esto baste o al menos te ponga en camino:

Sub PivotControl(Pivot, Filtro, Valor As String)    
    Dim pt As PivotTable

    On Error Resume Next

    Application.ScreenUpdating = False

    For Each pt In ActiveSheet.PivotTables


        pt.PivotFields(Filtro).CurrentPage = Valor


    Next pt


    Application.ScreenUpdating = True


End Sub


Sub HomeFiltro_Anio()


    PivotControl "HomePivot_Año", "AÑO", Range("Home_PivotAño")


End Sub


Sub HomeFiltro_Mes()


    PivotControl "HomePivot_Mes", "MES", Range("Home_PivotMes")


End Sub


Sub HomeFiltro_Dia()


    PivotControl "HomePivot_Dia", "DIA", Range("Home_PivotDia")


End Sub

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Hola JaimeDavid,

la verdad, no había descargado tu archivo. No sé si te entiendo bien, pero quizás con esto baste o al menos te ponga en camino:

Sub PivotControl(Pivot, Filtro, Valor As String)    
    Dim pt As PivotTable

    On Error Resume Next

    Application.ScreenUpdating = False

    For Each pt In ActiveSheet.PivotTables


        pt.PivotFields(Filtro).CurrentPage = Valor


    Next pt


    Application.ScreenUpdating = True


End Sub


Sub HomeFiltro_Anio()


    PivotControl "HomePivot_Año", "AÑO", Range("Home_PivotAño")


End Sub


Sub HomeFiltro_Mes()


    PivotControl "HomePivot_Mes", "MES", Range("Home_PivotMes")


End Sub


Sub HomeFiltro_Dia()


    PivotControl "HomePivot_Dia", "DIA", Range("Home_PivotDia")


End Sub

Gracias mjrofra, esta perfecto, pocas lineas, y funciona de mil maravillas, estaba haciendo algo así pero me daba un error de que no encuentra la propiedad del filtro o algo así, por ello es que opte en realizar, los arrays, que si era un lio, pero con esto esta resuelto, pero consulta sobre esta parte.

"On Error Resume Next"

Al poner esta línea de codigo, dice que cada vez que encuentra un error, no se planta, sino que sigue, es correcto??

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

...consulta sobre esta parte.

"On Error Resume Next"

Al poner esta línea de codigo, dice que cada vez que encuentra un error, no se planta, sino que sigue, es correcto??

Así es. Como decía ST (uno de los grandes maestros de este foro), es matar moscas a cañonazos. No es la solución más elegante, pero soluciona el problema :). Lo importante: tener cuidado, porque cualquier error al que de pronto le quieras prestar atención, será ignorado y ni te darás cuenta de que se presentó.

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Así es. Como decía ST (uno de los grandes maestros de este foro), es matar moscas a cañonazos. No es la solución más elegante, pero soluciona el problema :). Lo importante: tener cuidado, porque cualquier error al que de pronto le quieras prestar atención, será ignorado y ni te darás cuenta de que se presentó.

Muy interesante de verdad.... pero hay un problema más ..... bueno en esa hoja si bien es cierto el archivo original que subi... las TD mostradas que es el de prueba.... muestra registros y cosas similares, sin embargo en la misma hoja tambien hay 3 TD que usan los mismos criterios (Año, Mes, Dia) pero son de otro lado, es decir de otra fuente, al aplicar el for indicado actualiza todos ... de canto... una solución posible es cambiar ese "AÑO" por un nombre similar "AÑO ", al ser así sería diferente, aun no he hecho la prueba..... pero adjunto el mismo archivo con dos soluciones (agrege otro array), en donde "PivotControl" es el codigo que me has dado (Que funciona de mil maravillas" y el otro que es "Pivot_Control", en donde se indica que tablas es específico se va a actualizar....

Te agradecería que puedas darle una revisión y me puedas aconsejar en que se puede resumir....., igual Gracias de antemano por tu tiempo y ayuda

Control TMP Mod.zip

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Te respondo rápido para no dejar el tema.

No entiendo muy bien, pero quizás puedas revisar la propiedad pivotcache para determinar la fuente de cada tabla. Es lo que se me ocurre con lo que dices. Por ahora ya no cuento con mucho más tiempo para hacer pruebas, en unos tres o cuatro días vuelvo... seguro para entonces ya lo has solucionado tú solo o con la ayuda de alguien más :). Habrán muchas formas de hacerlo.

Lamento no contar con el tiempo. En unos tres días vuelvo a ver qué ha pasado.

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Hola,

he vuelto a releer lo que dices y aún no estoy seguro de entender. En todo caso, sí lo que quieres es que sólo se actualicen ciertas tablas en tu hoja (que me parece que por ahí es) quizás puedas crear un colección que albergue las tablas dinámicas y luego las recorres actualizándolas, algo así:

Sub PivotControl(Filtro, Valor As String)

Dim pt As PivotTable
Dim pts As Collection

Set pts = New Collection

With ActiveSheet
pts.Add .PivotTables("HomePivot_Año")
pts.Add .PivotTables("HomePivot_Mes")
pts.Add .PivotTables("HomePivot_Dia")
End With

On Error Resume Next

Application.ScreenUpdating = False
For Each pt In pts
pt.PivotFields(Filtro).CurrentPage = Valor
Next pt
Application.ScreenUpdating = True


End Sub


Sub HomeFiltro_Anio()
PivotControl "AÑO", Range("Home_PivotAño")
End Sub


Sub HomeFiltro_Mes()
PivotControl "MES", Range("Home_PivotMes")
End Sub


Sub HomeFiltro_Dia()
PivotControl "DIA", Range("Home_PivotDia")
End Sub[/CODE]

Bueno, por si aún vale de algo la respuesta :).

Share this post


Link to post
Share on other sites

Re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

... y acá dejo un archivo con una opción un poco más elaborada (puede parecer más compleja, pero resulta más fácil de mantener o modificar).

Saludos nuevamente y gracias pro la ayuda incondicional, realmente el archivo adjunto esta de lujo!!!, pero (cargoso yo) realmente no lo entiendo..... sobre todo en esa parte del codigo del Case


Select Case Application.Caller

Case "lstYear"
Filtro = "AÑO"
Valor = Range("Home_PivotAño")

Case "lstMonth"
Filtro = "MES"
Valor = Range("Home_PivotMes")

Case "lstDay"
Filtro = "DIA"
Valor = Range("Home_PivotDia")

End Select
[/CODE]

Realmente me perdí... y bueno esos filtro son solo unos cuantos.... trato de amoldar el case, a los demás filtros que tengo.. pero no me funciona...

pero sí tengo que rescartar... algo muy interesante... (algo que realmente no se me ocurrió) que a la macro Pivotcontrol es pasar una variable Array y ahí indicar que tablas se van a sincronizar...., y también que tablas van a hacer otro procedimiento.... el otro detalles que también en el mismo archivo al modificar un filtro de una hoja también se debe de actualizar en las demás.... en breve adjunto una muestra.....

pero si me has dado luces e ideas bien interesantes.....

Nuevamente Gracias!!!!!!

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

Nuevamente por aqui.... tratando de encajar.... las macros.... pero no me funciona..... un momento de desesperación..... me quede con unos cuantos pelos en la mano... y no es broma realmente me paso ello, por favor nuevamente tu ayuda ya que esta en en la forma que lo quiero hacer.... así se me es mas facil de interpretar.... puesto que sólo quiero que actualice algunas columnas en específico..., bueno con el archivo adjunto creo que vas a entender que es lo que deseo hacer exactamente......

Copia de Control TMP Mod.zip

Share this post


Link to post
Share on other sites

re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Hola,

applicationi.caller es el nombre de quien llama a la macro. En este caso la macro la ejecutan los combobox (o cuadro combinado), por lo tanto application.caller devuelve el nombre del combobox que se ha cambiado y ejecutó la macro. Yo les he puesto lstYear, lstMonth y lstDay a cada combobox. Puedes ponerle el nombre que quieras y lo usas en tu select case.

Si añades más filtros (combobox) sólo dales un nombre representativo y está. Es más, podrías simplificar aún más si homogenizas nombre. Por ejemplo, llamas al cuadro de combinado Año, al filtro Año y al rango con el valor Año, con esto, la macro se reduciría a:

pivotcontrol filtro:=application.caller, Valor:=range(application.caller), tabla1, tabla2, etc.

o algo así, estoy escribiendo de memoria.

Share this post


Link to post
Share on other sites

Re: Solución al "sincronizar" Tablas Dinamicas "condicionadas"

Saludos nuevamente.... despues de probar y probar... y realizar todo tipo de pruebas... este es mi codigo final en el cual funciona todo a la perfección.



Public Tablas As Variant


Sub HomeFiltro()


Dim Filtro As String
Dim Valor As String

Application.ScreenUpdating = False
Application.Run "Secur_Sheets_Protect", 0, "HOME", "AÑO", "MES", "DIA", "SEGMENT_CAMPA", "CARGO_AUDIT", "COORD_AGEN", "PARETO", "PRECISIONES", "IMPRESION"

Select Case Application.Caller

Case "lst_Anio"
Filtro = "AÑO"
Valor = Range("Home_PivotAño")
Tablas = Array("pt_Home_Año")

Case "lst_Mes"
Filtro = "MES"
Valor = Range("Home_PivotMes")
Tablas = Array("pt_Home_Mes", "pt_Mes_Mes_Porcentaje", "pt_Mes_Mes_Pec")

Case "lst_Dia"
Filtro = "DIA"
Valor = Range("Home_PivotDia")
Tablas = Array("pt_Home_Dia", "pt_Dia_Dia_Porcentaje", "pt_Dia_Dia_Pec")

Case "lst_Segmento"
Filtro = "SEGMENTO"
Valor = Range("Home_PivotSegmento")
Tablas = Array("pt_Home_Segmento_Cnt", "pt_Home_Segmento_Prc", "pt_Precisiones_Prc", "pt_Segment_Campa_Pec")

Case "lst_Campania"
Filtro = "CAMPAÑA"
Valor = Range("Home_PivotCampania")
Tablas = Array("pt_Home_Campaña", "pt_Segment_Campa_xy")

Case "lst_Tipo"
Filtro = "TIPO LLAMADA"
Valor = Range("Home_PivotLlamada")
Tablas = Array("")

Case "lst_Cargo"
Filtro = "CARGO"
Valor = Range("Home_PivotCargo")
Tablas = Array("pt_Home_Cargo")

Case "lst_Auditor"
Filtro = "AUDITOR"
Valor = Range("Home_PivotAuditor")
Tablas = Array("pt_Home_Auditor")

Case "lst_Coordinador"
Filtro = "COORDINADOR"
Valor = Range("Home_PivotCoordinador")
Tablas = Array("pt_Home_Coordinador")

Case "lst_Agente"
Filtro = "AGENTE"
Valor = Range("Home_PivotAgente")
Tablas = Array("pt_Home_Agente")

End Select

Application.Run "Actualiza_Listas"
Application.Run "PivotControl_Filtro", Filtro, Valor
Application.ScreenUpdating = True

End Sub



Private Sub PivotControl_Filtro(Filtro, Valor As String) ', ParamArray Hojas() As Variant)


Dim pt As PivotTable
Dim PvtTbl As PivotTable
On Error Resume Next

'HojasPivot son las hojas que recorrerá la macro para actualizar las tablas dinamicas a nivel de filtro, sin embargo sólo actualizará las tablas dinamicas que está en la variable a nivel global, sólo si no da error
HojasPivot = Array("HOME", "AÑO", "MES", "DIA", "SEGMENT_CAMPA", "CARGO_AUDIT", "COORD_AGEN", "PARETO", "PRECISIONES", "IMPRESION")


For i = 0 To UBound(HojasPivot)
For Each pt In SHEETS(HojasPivot(i)).PivotTables
pt.PivotFields(Filtro).CurrentPage = Valor
Next pt
Next i


For i = 0 To UBound(HojasPivot)
For y = 0 To UBound(Tablas)
Worksheets(HojasPivot(i)).PivotTables(Tablas(y)).PivotFields("(Todas)").ClearAllFilters
If Valor <> "(Todas)" Then
For Each pvtItm In Worksheets(HojasPivot(i)).PivotTables(Tablas(y)).PivotFields("(Todas)").PivotItems
If pvtItm = Valor Then
pvtItm.Visible = True
Else
pvtItm.Visible = False
End If
Next
End If
Next y
Next i


End Sub

[/CODE]

Realmente muchas gracias [color=#4D5153]mjrofra, por tu ayuda y por darme pistas para optimizar otras macros en donde se le dan variables como arrays, ahi eh resumido un monton de codigo en otras macros..., nuevamnete gracias.

[/color]

y dar por cerrado el tema.

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

Saludos nuevamente.... despues de probar y probar... y realizar todo tipo de pruebas... este es mi codigo final en el cual funciona todo a la perfección.

[CODE]

Public Tablas As Variant


Sub HomeFiltro()


Dim Filtro As String
Dim Valor As String

Application.ScreenUpdating = False
Application.Run "Secur_Sheets_Protect", 0, "HOME", "AÑO", "MES", "DIA", "SEGMENT_CAMPA", "CARGO_AUDIT", "COORD_AGEN", "PARETO", "PRECISIONES", "IMPRESION"

Select Case Application.Caller

Case "lst_Anio"
Filtro = "AÑO"
Valor = Range("Home_PivotAño")
Tablas = Array("pt_Home_Año")

Case "lst_Mes"
Filtro = "MES"
Valor = Range("Home_PivotMes")
Tablas = Array("pt_Home_Mes", "pt_Mes_Mes_Porcentaje", "pt_Mes_Mes_Pec")

Case "lst_Dia"
Filtro = "DIA"
Valor = Range("Home_PivotDia")
Tablas = Array("pt_Home_Dia", "pt_Dia_Dia_Porcentaje", "pt_Dia_Dia_Pec")

Case "lst_Segmento"
Filtro = "SEGMENTO"
Valor = Range("Home_PivotSegmento")
Tablas = Array("pt_Home_Segmento_Cnt", "pt_Home_Segmento_Prc", "pt_Precisiones_Prc", "pt_Segment_Campa_Pec")

Case "lst_Campania"
Filtro = "CAMPAÑA"
Valor = Range("Home_PivotCampania")
Tablas = Array("pt_Home_Campaña", "pt_Segment_Campa_xy")

Case "lst_Tipo"
Filtro = "TIPO LLAMADA"
Valor = Range("Home_PivotLlamada")
Tablas = Array("")

Case "lst_Cargo"
Filtro = "CARGO"
Valor = Range("Home_PivotCargo")
Tablas = Array("pt_Home_Cargo")

Case "lst_Auditor"
Filtro = "AUDITOR"
Valor = Range("Home_PivotAuditor")
Tablas = Array("pt_Home_Auditor")

Case "lst_Coordinador"
Filtro = "COORDINADOR"
Valor = Range("Home_PivotCoordinador")
Tablas = Array("pt_Home_Coordinador")

Case "lst_Agente"
Filtro = "AGENTE"
Valor = Range("Home_PivotAgente")
Tablas = Array("pt_Home_Agente")

End Select

Application.Run "Actualiza_Listas"
Application.Run "PivotControl_Filtro", Filtro, Valor
Application.ScreenUpdating = True

End Sub



Private Sub PivotControl_Filtro(Filtro, Valor As String) ', ParamArray Hojas() As Variant)


Dim pt As PivotTable
Dim PvtTbl As PivotTable
On Error Resume Next

'HojasPivot son las hojas que recorrerá la macro para actualizar las tablas dinamicas a nivel de filtro, sin embargo sólo actualizará las tablas dinamicas que está en la variable a nivel global, sólo si no da error
HojasPivot = Array("HOME", "AÑO", "MES", "DIA", "SEGMENT_CAMPA", "CARGO_AUDIT", "COORD_AGEN", "PARETO", "PRECISIONES", "IMPRESION")


For i = 0 To UBound(HojasPivot)
For Each pt In SHEETS(HojasPivot(i)).PivotTables
pt.PivotFields(Filtro).CurrentPage = Valor
Next pt
Next i


For i = 0 To UBound(HojasPivot)
For y = 0 To UBound(Tablas)
Worksheets(HojasPivot(i)).PivotTables(Tablas(y)).PivotFields("(Todas)").ClearAllFilters
If Valor <> "(Todas)" Then
For Each pvtItm In Worksheets(HojasPivot(i)).PivotTables(Tablas(y)).PivotFields("(Todas)").PivotItems
If pvtItm = Valor Then
pvtItm.Visible = True
Else
pvtItm.Visible = False
End If
Next
End If
Next y
Next i


End Sub

[/CODE]

Realmente muchas gracias [color=#4D5153]mjrofra, por tu ayuda y por darme pistas para optimizar otras macros en donde se le dan variables como arrays, ahi eh resumido un monton de codigo en otras macros..., nuevamnete gracias.

[/color]

y dar por cerrado el tema.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  



  • Si estás experimentando errores al acceder al foro, te recomendamos que modifiques la contraseña desde aquí (haciendo clic en el enlace "¿Olvidaste tu contraseña?").

    Próximamente  habrá mejoras en la web y es necesario cambiar la contraseña para acceder a los nuevos contenidos.

    Disculpa las molestias.

  • Recently Browsing

    No registered users viewing this page.

  • Latest Best Answers

×
×
  • Create New...

Important Information

Privacy Policy