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 :

Créer une liste en VBA à partir d'une pivottable


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut Créer une liste en VBA à partir d'une pivottable
    Bonjour,

    Je souhaiterai savoir s'il est possible d'utiliser une liste en VBA et comment récupérer les valeurs du "row label" (voir pièce jointe) d'une pivot table dans une liste donc.

    Le but est de pouvoir utiliser chaque entrée dans une autre fonction.
    J'ai pensé à un while comme ci-dessous par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            While "entré de ma liste" <> "Grand Total"
     
                CaptureCallLogHistory "entré de ma liste"
     
            Wend
    une idée?
    Images attachées Images attachées  

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Ton champ de ligne a un nom. Tu peux instancier ce champ et lire la collection de ses éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim pvtIt as Excel.PivotItem
    For each pvtIt in ThisWorkbook.Worksheets("NomFeuille").PivotTables("NomTCD").RowFields("NomChamp").PivotItems
        call Maprocedure(pvtIt.Name)
    Next pvtIt
    En espérant que cela t'aide,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut
    Merci PGZ,

    ca marche nickel, je pensais pas que cela pouvait se faire aussi rapidement (avec aussi peu de ligne de code)
    Ça fonctionne mais à un détail prés dans mon cas.

    Le each passe en revue toutes les valeurs du "row label", même celles qui ne sont pas affiché (comme tu peux le voir en pièce jointe), car pas valeur.
    Du coup, ma procédure plante ensuite, tu sais pourquoi

    Hier tu m'as donné l'astuce pour afficher les colonnes même quand celle-ci n'ont pas de valeur, ce qui est parfait pour mon cas.

    Par contre, je n'ai pas trouvé comment afficher les "row label" dans ce cas. Est-ce possible?
    Ou devrais-je faire un test ensuite dans mon procédure genre:

    "Si" pvtIt.Name "est dans le row label de mon de ma 2éme pivotabel" alors

    Mais la pareil, il faut que le check se fasse sur ceux affichés.
    Mais je pense que tout serait réglé s'il est possible d'afficher la liste complète.

    merci par avance

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Le champ de ligne fonctionne comme le champ de colonne. Tu peux regler ses paramètres (Field settings) avec l'option "Show items with no data", et tous les éléments du champ seront affichés.

    Sinon, tu peux savoir si un élément a des données en testant la valeur de sa propriété recordcount. Cela donnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim pvtIt as Excel.PivotItem
    For each pvtIt in ThisWorkbook.Worksheets("NomFeuille").PivotTables("NomTCD").RowFields("NomChamp").PivotItems
        If pvtIt.recordcount > 0 then call Maprocedure(pvtIt.Name)
    Next pvtIt
    COrdialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut
    RRRRRah! presque.

    J'avoue que je préfèrerai ne pas avoir à afficher les row sans valeur car ensuite mes graphes qui en dépendent sont moins "propre".
    Néanmoins, avec toutes les rows affichées, cela fonctionne nickel.

    J'ai tenté le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If pvtIt.recordcount > 0
    , cela ignore bien la row "blank" mais pas la row "jer" dans mon exemple.

    Désolé, j'ai oublié de joindre l'image dans mon précédent message.
    Images attachées Images attachées  

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut
    je voulais dire "Jes", c'est "Jes" qui n'a pas de valeur et qui et quand même traité malgré le fait qu'elle n'apparaisse pas dans la pivottable.

  7. #7
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Citation Envoyé par yzf-r Voir le message
    J'ai tenté le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If pvtIt.recordcount > 0
    , cela ignore bien la row "blank" mais pas la row "jer" dans mon exemple.
    Si l'élément "jes" n'a pas de valeurs, alors sa propriété RecordCount doit être à 0.

    SI ce n'est pas le cas, ce n'est pas normal et j'aimerais bien savoir la valeur renvoyée. Pour le savoir, tu peux modifier le programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim pvtIt as Excel.PivotItem
    For each pvtIt in ThisWorkbook.Worksheets("NomFeuille").PivotTables("NomTCD").RowFields("NomChamp").PivotItems
        Debug.print pvtit.name & " : " & pvtit.RecordCount
        'If pvtIt.recordcount > 0 then call Maprocedure(pvtIt.Name)
    Next pvtIt
    Peux-tu faire cet essai et dire ce que tu lis pour "jes"?

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut
    la valeur est 18.
    Après vérification, c'est donc à cause de mon "report filter", voir pièce jointe.

    Je filtre les entrées, c'est pour cela que "jes" n'apparait.
    Si j'affiche tout alors, la valeur est alors de 18
    Images attachées Images attachées  

  9. #9
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Si je comprends bien, c'est un filtrage sur le champ de colonne qui empêche l'affichage de "jes" alors que cet item a la propriété Visible = True et la propriété RecordCount > 1.

    SI c'est cela, tu peux essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim oRng As Excel.Range
    Dim pvtIt As Excel.PivotItem
     
    For Each oRng In ThisWorkbook.Worksheets("NomFeuille").PivotTables("NomTCD").RowRange.Cells
        On Error Resume Next
            Set pvtIt = ThisWorkbook.Worksheets("NomFeuille").PivotTables("NomTCD").RowFields("NomChampDeLigne").PivotItems(oRng.Value)
            If Err.Number = 0 Then call Maprocédure(pvtIt.Name)
        On Error GoTo 0
    Next oRng
    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 84
    Points : 47
    Points
    47
    Par défaut
    C'est exactement ça

    merci PGZ

    si je peux abuser de ta bonté, j'aurai une dernière requête.
    Existe-t-il une commande simple en VBA pour faire un refresh de toutes les pivottable d'un workbook.

    Pour l'instant, je le fais sheet aprés sheet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub RefreshAllWorksheetPivots()
     
    Dim pt As PivotTable
     
        Sheets("ARM Incoming APOs").Select
        For Each pt In ActiveSheet.PivotTables
            pt.RefreshTable
        Next pt
    .......

  11. #11
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Tu commences par scruter les feuilles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub RefreshAllWorksheetPivots()
     
    Dim pt As Excel.PivotTable
    Dim oSh as Excel.Worksheet
     
    application.ScreenUpdating = False 
     
    For each oSh in thisworkbook.WorkSheets
        For Each pt In osh.PivotTables
            pt.RefreshTable
        Next pt
    next oSh
     
    Application.ScreenUpdating = True
    Mais attention : au cas où tous les TCD utilisent les mêmes données, il est préférable de leur affecter un unique cache commun à tous les TCD. Dans ce cas, tu peux te contenter de rafraîchir ce cache. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.PivotCaches("NomCache").Refresh
    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2015, 12h14
  2. Réponses: 1
    Dernier message: 11/07/2014, 08h58
  3. Réponses: 0
    Dernier message: 01/09/2012, 16h42
  4. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  5. Créer une variable d'environnement à partir d'une liste de fichier
    Par ddams dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/02/2007, 20h03

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