XLS 2010 - Un problème de boucle sur des tcd
ap49
Messages postés
8
Statut
Membre
-
ap49 Messages postés 8 Statut Membre -
ap49 Messages postés 8 Statut Membre -
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 :
Merci d'avance !
ap.
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:
- XLS 2010 - Un problème de boucle sur des tcd
- Tcd excel - Guide
- Clé activation office 2010 gratuit - Télécharger - Sécurité
- Comment ouvrir un fichier xls? - Guide
- Waptrick java football 2010 - Télécharger - Jeux vidéo
- Xls viewer - Télécharger - Tableur
7 réponses
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 :
pour me passer des contrôles avec If qui ralentissent la macro.
A+
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+
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
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
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
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 ...
Sachant que mon fichier est le même que celui de cjoint, mais avec des onglets en plus, ce qui ne devrait rien changer ...
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)
..
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)
..
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 !
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 !
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)...
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)...
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.
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