XLS 2010 - Un problème de boucle sur des tcd

Fermé
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013 - Modifié par ap49 le 29/08/2013 à 09:52
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013 - 29 août 2013 à 18:54
Bonjour,

Je me tourne vers vous car je suis bloqué sur une macro qui ne veut pas fonctionner.
Le fichier ( https://www.cjoint.com/?0HDjXK9uWb7 ) contient une feuille 'saisie' dans laquelle il va y avoir plein de données au cours de l'année.
A tout moment je veux pouvoir actualiser tous mes tcd (qui sont sur des feuilles séparées)
et en meme temps leur décocher les (Vide) et " " et autres choses indésirables.

Du coup j'ai codé la macro qui est associé au bouton ''ACTUALISER TOUS LES TCD" de cette feuille saisie, mais elle ne fonctionne pas...
Selon vous, d'où vient le soucis.... ?
Le code de la macro est le suivant :
(il coince à p.Visible=False)
j'ai aussi essayé avec comme condition p.Value au lieu de p.Name, mais rien n'y fait ...
Sachant qu'à la base j'avais tapé une looooooongue macro qui sélectionnait feuille après feuille, tcd après tcd (avec leur nom) et ensuite qui changeait p.Visible et là ça fonctionnait mais la macro était longue, lente et spécifique aux noms des tcd déjà créés (donc assez limitée !)
Bref, voilà la bête :

Sub Mise_a_jour_des_TCD()
'_______définition des variables_______________________________________________________________________
Dim ws As Worksheet
Dim wb As Workbook
Dim TCD As PivotTable
Dim CHAMP As PivotField
Dim p As PivotItem
Set wb = ThisWorkbook
'_______Conditions d'application de la macro : si il y a des données dais saisie________________________
    If Cells(11, 7) <> "" Then
'_______Freeze de l'écran, pour ne pas trop ralentir le système_______________________________________________________________________________
        Application.ScreenUpdating = False
'_______MAJ des TCD_____________________________________________________________________________________
            For Each ws In wb.Worksheets
                For Each TCD In ws.PivotTables
                    For Each CHAMP In TCD.PivotFields
                        For Each p In CHAMP.PivotItems
                            If p.Name = "(blank)" Then
                                p.Visible = False
                            End If
                            If p.Name = """" Then
                                p.Visible = False
                            End If
                        Next p
                    Next CHAMP
                Next TCD
            Next ws
'_______défreeze de l'écran____________________________________________________________________________
        Application.ScreenUpdating = True
'_______Message de réussite____________________________________________________________________________
        MsgBox ("Les TCD ont été mis à jour, reste à définir la précocité & vérifier les récap")
'_______Fin des conditions_____________________________________________________________________________
    End If
'_______Fin de la macro_____________________________________________________________________________
End Sub



Merci d'avance !

ap.
A voir également:

7 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
Modifié par Zoul67 le 29/08/2013 à 10:50
Bonjour,

C'est étrange ; chez moi, il n'y a pas d'erreur (j'ai fait des TCD très légers, mais le principe y est). Si tu désélectionnes "à la main", Excel le tolère ? Peux-tu fournir ton fichier sur cjoint.com ?
Par ailleurs si tu as beaucoup de données, j'aurais tendance à plutôt écrire :
On Error Resume Next
   For Each CHAMP In TCD.PivotFields
      CHAMP.PivotItems("(blank)").Visible=False
      CHAMP.PivotItems("""").Visible=False
   Next CHAMP
On Error GoTo 0

pour me passer des contrôles avec If qui ralentissent la macro.

A+
0
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013
29 août 2013 à 10:44
Je vais essayer de suite ta solution !

j'ai actualisé mon premier post, le fichier est sur cjoint avec le lien.

Est ce que ca pourrait venir du fait qu'à un moment donné dans mes manip j'ai fait une erreur de code et au lieux d'écrire p.Visible = False j'ai écrit p.Value = False (ou True) ? Et du coup il ne reconnait plus (blank) et "" comme du texte mais des bouléens ou quelque chose du genre ?

Et si oui, que faire ^^

merci de ton aide, je reviens dès que j'ai testé ton code
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
29 août 2013 à 10:49
Je me suis trompé dans le code, il ne doit plus y avoir de p. J'ai corrigé dans https://forums.commentcamarche.net/forum/affich-28608242-xls-2010-un-probleme-de-boucle-sur-des-tcd#1
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
29 août 2013 à 10:57
J'ai testé ta macro avec ton fichier... elle ne me renvoie pas d'erreur :-/ (Excel2010 également)
0
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013
29 août 2013 à 11:00
Avec ce que tu m'as donné comme code, chez moi ca tourne sans interruption depuis quelques minutes déjà !
Sachant que mon fichier est le même que celui de cjoint, mais avec des onglets en plus, ce qui ne devrait rien changer ...
0
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013
29 août 2013 à 11:10
En fait la macro ne bug pas si on laisse On Error Resume Next, mais elle ne fait rien de ce qui est demandé, elle ne décoche pas les vides si il y en a.


mais si je l'enlève, ca ne marche pas, ''erreur 1004, impossible de définir la propriété PivotItems de la classe PivotField"
(à la ligne : CHAMP.PivotItems("""").Visible = False, ou à l'autre d'ailleurs)
..
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
Modifié par Zoul67 le 29/08/2013 à 11:35
En fait la macro ne bug pas si on laisse On Error Resume Next, mais elle ne fait rien de ce qui est demandé, elle ne décoche pas les vides si il y en a.
Je n'aurais pas dû me fier à ta syntaxe pour les vides ; en mettant "" (au lieu de """"), chez moi ça retire les vides.
Pour les blank, j'ai dû utiliser un autre fichier que celui de cjoint, et ça marche aussi.


mais si je l'enlève, ca ne marche pas, ''erreur 1004, impossible de définir la propriété PivotItems de la classe PivotField"
(à la ligne : CHAMP.PivotItems("""").Visible = False, ou à l'autre d'ailleurs)
Je n'ai pas mis le On Error par hasard (il est d'ailleurs généralement à éviter). Si la macro tente de décocher une case qui n'existe pas, il y aura une erreur : l'erreur 1004 que tu mentionnes.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013
29 août 2013 à 15:13
effectivement ca fonctionne pour les "" avec ta correction, pour les blank je cherche encore mais je pense que ca vient d'une erreur précédente de codage :
J'ai à un moment donné, malheureusement écrit PivotItems("(blank)").Value = False au lieu de PivotItems("(blank)").Visible = False

Alors du coup ca avait changé tous les (vide) par Faux, logique .... !

J'ai alors rajouté dans le code
PivotItems("Faux").Value = (vide)

pour me remettre des (vide) au lieu des Faux
puis je suis revenu à un code correctement rédigé (que j'ai collé plus haut donc)
Et je pense que c'est depuis ce moment qu'il ne veut pas fonctionner sur les (vide) (et qu'il fonctionne bien sur "")...

le problème c'est surement qu'il ne reconnait plus (blank) ou quelque chose du genre...

En tout cas ma macro progresse déja bien, c'est ma chef qui est ravie ^^ merci !
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
29 août 2013 à 15:59
Ah ben j'étais presque agacé par le fait que tu veuilles décocher les "(vide)" alors qu'il n'y en avait pas... Je m'étonnais en revanche de la présence de "Faux".
En actualisant les données, je pensais que tout se remettrait en ordre, mais ça ne marche pas sur mon fichier. Et sur le tien.

Sinon, j'espère que tu peux repartir d'un ancien fichier (avant de baptiser les Faux)...
0
ap49 Messages postés 8 Date d'inscription jeudi 29 août 2013 Statut Membre Dernière intervention 2 octobre 2013
29 août 2013 à 18:54
Et bien merci beaucoup pour ton aide, maintenant tout fonctionne.
La macro pourrait surement être plus simplement codée, mais bon, j'ai mis les vérif sur (blank) & (vide); et comme ça ils se décochent bien tous.
Je mets le code qui fonctionne, à adapter.

Sub Mise_a_jour_des_TCD()
'_______définition des variables_______________________________________________________________________
Dim ws As Worksheet
Dim wb As Workbook
Dim TCD As PivotTable
Dim CHAMP As PivotField
Dim p As PivotItem
Set wb = ThisWorkbook
'_______Conditions d'application de la macro : si il y a des données dans saisie________________________
    If Cells(110, 7) <> "" Then
'_______Freeze de l'écran, pour ne pas trop ralentir le système_______________________________________________________________________________
        Application.ScreenUpdating = False
'_______MAJ des TCD_____________________________________________________________________________________
            For Each ws In wb.Worksheets
                For Each TCD In ws.PivotTables
                On Error Resume Next
                    For Each CHAMP In TCD.PivotFields
                        CHAMP.PivotItems("(blank)").Visible = False
                        CHAMP.PivotItems("(vide)").Visible = False
                        CHAMP.PivotItems((blank)).Visible = False
                        CHAMP.PivotItems((vide)).Visible = False
                        CHAMP.PivotItems("").Visible = False
                    Next CHAMP
                On Error GoTo 0
                Next TCD
            Next ws

'_______défreeze de l'écran____________________________________________________________________________
        Application.ScreenUpdating = True
'_______Message de réussite____________________________________________________________________________
        MsgBox ("Les TCD ont été mis à jour, reste à définir la précocité & vérifier les récap")
'_______Fin des conditions_____________________________________________________________________________
    End If
'___________Actualisation 3 fois de suite, pour les tcd dépendant d'autres tcd, sinon tout n'est pas à jour ...
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.RefreshAll
'_______Fin de la macro_____________________________________________________________________________
End Sub
0