IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

TCD - Problème avec un item à "(Vide)" [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut TCD - Problème avec un item à "(Vide)"
    Bonjour,

    Je bute sur ce problème : Dans le champ de filtre, j'ai plusieurs items sélectionnés. Je peux afficher ou cacher l'item "(Vide)"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("Feuil2").PivotTables(1).PivotFields("Noms")
        .PivotItems("(blank)").Visible = True
    End With
    Je ne peux pas tester cette propriété. Le test retourne une erreur 2042 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("Feuil2").PivotTables(1).PivotFields("Noms")
        Debug.Print .PivotItems("(blank)").Visible
    End With
    C'est d'autant plus bizarre que, dans la fenêtre des variables locales, si on examine l'objet, on voit que la propriété "Visible" est correctement renseignée.
    On trouve beaucoup de problèmes apparentés sur internet, mais pas de solution, apparemment.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 958
    Points : 28 968
    Points
    28 968
    Billets dans le blog
    53
    Par défaut
    Bonjour Daniel,
    C'est effectivement un phénomène très curieux et quand on veut inverser l'état de la propriété Visible on obtient une erreur 13 - incompatibité de type dès que l'on arrive en fin de boucle (Item '(blank)' ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub testTcd()
     Dim pvt As PivotTable: Set pvt = ActiveSheet.PivotTables("myTcd")
     Dim pvtFld As PivotField: Set pvtFld = pvt.PivotFields("VOITURE")
     Dim c As Byte
     For c = 1 To pvtFld.PivotItems.Count
      If pvtFld.PivotItems(c).Name = "(blank)" Then
        pvtFld.PivotItems(c).Visible = True
       Else
        pvtFld.PivotItems(c).Visible = False
      End If
     Next
     For c = 1 To pvtFld.PivotItems.Count
      pvtFld.PivotItems(c).Visible = Not pvtFld.PivotItems(c).Visible
     Next
    End Sub
    Pour pallier ce problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      On Error Resume Next
      pvtFld.PivotItems(c).Visible = Not pvtFld.PivotItems(c).Visible
      If Err Then pvtFld.PivotItems(c).Visible = False
      On Error GoTo 0
    Mais c'est fou

  3. #3
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour Philippe,

    Je n'ai pas très bien compris ton code; quand le nom de l'item est "(blank)", la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pvtFld.PivotItems(c).Visible = Not pvtFld.PivotItems(c).Visible
    renvoie une erreur. Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Err Then pvtFld.PivotItems(c).Visible = False
    La propriété Visible est toujours mise à "faux". Ou j'ai mal compris ?

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 958
    Points : 28 968
    Points
    28 968
    Billets dans le blog
    53
    Par défaut
    Bonjour Daniel,
    La propriété Visible est toujours mise à "faux". Ou j'ai mal compris ?
    Oui tu a parfaitement compris, dans ce code test, la première partie met la propriété Visible à True de l'Item (Blank) et tous les autres à False et la seconde partie inverse les valeurs.
    Après avoir constaté comme toi l'erreur 2202 avec le Debug.Print, j'ai voulu voir ce qui se passait avec un test conditionnel.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Ouf, j'ai fait le tour. Ca ne résoud pas mon problème qui est d'inverser la valeur (si visible, alors, masquée et réciproquement). J'admets que c'est assez tordu comme question.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 958
    Points : 28 968
    Points
    28 968
    Billets dans le blog
    53
    Par défaut
    Bonjour Daniel,
    Citation Envoyé par Daniel.C Voir le message
    Ouf, j'ai fait le tour. Ca ne résoud pas mon problème qui est d'inverser la valeur (si visible, alors, masquée et réciproquement). J'admets que c'est assez tordu comme question.
    Au contraire ta question est des plus pertinentes. Je trouve plutôt tordue la manière dont le code réagit.

  7. #7
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonsoir Daniel,

    c'est embêtant les modes d'accès à certaines propriétés en vba.
    On s'y perd. ce qui m'a inspiré c'est qu'avec les Shapes il y a des fois où il vaut mieux ne pas indexer mais indiquer le nom.

    ce bloc ne fait pas d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ActiveSheet.PivotTables("TableauCroiséDynamique2").PivotFields("Produit")
            .PivotItems("(blank)").Visible = True
    End With

  8. #8
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    Il semblerait que cela vienne d'un problème de localisation : blank et vide.

    J'ai tenté un contournement qui semble résoudre
    Nom du champ à adapter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois")
     
            For i = 1 To .PivotItems.Count
                If .PivotItems(i) = "(blank)" Then
                    .PivotItems(i).Value = "vide"
                    x = .PivotItems(i).Visible
                    If x = True Then
                        .PivotItems(i).Visible = False
                    Else
                        .PivotItems(i).Visible = True
                    End If
                    .PivotItems(i).Value = "(vide)"
                End If
            Next i
        End With

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Merci 78Chris, c'est le bon contournement. Bizarre quand même, puisqu'en utilisant l'index, on n'utilise pas le nom et qu'on a accès aux autres propriétés. Je pense en se moment au pauvre gars qui a posé un problème similaire (sur internet, sans réponse) avec, en plus, des utilisateurs francophones et néerlandophones...

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Bonsoir à tous
    Daniel.C tu poses la question à laquelle personne ne veut me répondre depuis quelques jours. Merci.

    Mon but est d'afficher les filtres cochés dans un TCD. Eh oui, ils n'apparaissent pas : on le droit à "(plusieurs éléments)" ou a "(tous)" (moins génant).

    J'essaye la méthode de 78chris.

    ESVBA

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour à tous.

    Le problème semble bien lié aux paramètres locaux de Windows. Il y a un problème analogue avec les dates. Les valeurs renvoient également une erreur 2042 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        With ActiveSheet.PivotTables(1).PivotFields("Dates")
            For Each Pi In .PivotItems
                Debug.Print Pi.Name
                Debug.Print Pi.Visible
            Next Pi
        End With
    En adaptant la méthode "78Chris", le problème disparaît :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        With ActiveSheet.PivotTables(1).PivotFields("Dates")
            For Each Pi In .PivotItems
                Pi.Name = Format(Pi.Name, "m/d/yyyy")
                Debug.Print Pi.Name
                Debug.Print Pi.Visible
            Next Pi
        End With

  12. #12
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    La localisation laisse de plus en plus à désirer...

    Merci Daniel de cette info pour les dates.

  13. #13
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    En synthétisant les deux exemples on pourrait faire une fonction testant l'état d'un item valable pour tous les cas (s'il n'y a pas d'autre loup )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Function EtatChamp(TCDOnglet As String, TCDNom As String, TCDChamp As String, Position As Long) As Boolean
     
        With Worksheets(TCDOnglet).PivotTables(TCDNom).PivotFields(TCDChamp)
     
            If .PivotItems(Position) = "(blank)" Then
                .PivotItems(Position).Value = "vide"
                EtatChamp = .PivotItems(Position).Visible
                .PivotItems(Position).Value = "(vide)"
            ElseIf IsDate(.PivotItems(Position)) Then
                Dim Valini As Date
                Valini = .PivotItems(Position).Name
                .PivotItems(Position).Name = Format(.PivotItems(Position).Name, "m/d/yyyy")
                EtatChamp = .PivotItems(Position).Visible
                .PivotItems(Position).Name = Valini
            Else
                EtatChamp = .PivotItems(Position).Visible
            End If
     
        End With
     
    End Function
    Fonction appelable depuis une procédure mais non depuis une cellule.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    De plus en plus étonnant; il suffit de mettre dans la valeur initiale (s'il n'y a pas un loup ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function EtatChamp2(TCDOnglet As String, TCDNom As String, TCDChamp As String, Position As Long) As Boolean
     
        With Worksheets(TCDOnglet).PivotTables(TCDNom).PivotFields(TCDChamp)
            .PivotItems(Position).Value = .PivotItems(Position).Value
            EtatChamp2 = .PivotItems(Position).Visible
        End With
     
    End Function

  15. #15
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    Sur 2010 cela marche pour le vide mais pas pour les dates : quid de ton côté ?

  16. #16
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Effectivement, ça ne fonctionne pas avec Excel 2010 (j'avais testé avec 2013); mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .PivotItems(Position).Name = .PivotItems(Position).Name
    fonctionne ! Au fou !

  17. #17
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 520
    Points : 16 455
    Points
    16 455
    Par défaut
    Bonjour

    Suite du feuilleton : d'après mes tests sur 2010 ni l'un, ni l'autre ne marche pour les dates et Name sur (vide) laisse (blank).

    A l'occasion je regarde sur 2013 avec mon exemple...

    J'en reste à 2 cas : date ou pas date. Value marchant pour (vide) et toute valeur non date semble-t-il.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Je viens de vérifier pour plus de sûreté. Je confirme.

    Name sur (vide) laisse (blank)
    Oui mais le test fonctionne. Il est possible, comme j'ai les 2 versions sur le même ordi, que l'installation de 2013 ait modifié quelque chose dans Excel 2010.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les items d'un repeater
    Par sarapis dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/09/2008, 20h28
  2. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo