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 :

Boucle de filtrage sur TCD via un tableau de valeurs [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut Boucle de filtrage sur TCD via un tableau de valeurs
    Bonjour à tous,

    Je souhaite implémenter une macro reposant sur le calcul d'un temps optimum de production pour un article donné.
    C'est en quelque sorte une gestion des nomenclatures des produits.

    Dans mon classeur, j'ai un TCD lié à une connexion OLDB à SQL Server (via PowerPivot) qui affiche pour un article unique (filtré par un segment) l'ensemble des temps enregistrés par date de réalisation, comme ceci :

    Nom : Capture.PNG
Affichages : 2086
Taille : 10,9 Ko

    À partir de ce tableau, et à l'aide d'un modèle de calculs statistiques (Six Sigma, Déviations et calcul d'histogrammes, etc.), je calcule une valeur optimale (cellule affichée dans la même feuille)
    L'objectif final de ce classeur étant de permettre d'afficher clairement pour chaque article la valeur optimale calculée et définir s'il y a besoin de mettre à jour la nomenclature ou non.
    Le fonctionnement actuel ne permettant qu'une analyse article par article au bon vouloir de l'utilisateur, je cherche à automatiser cette analyse.

    J'ai donc réfléchit à une méthode qui me permettrait d'utiliser dynamiquement les données de mon TCD tout en enregistrant la valeur optimale calculée. Bien que ma première solution fut d'adapter ma suite de calcul à mon modèle PowerPivot, je n'ai pas trouvé de solution acceptable, c'est pourquoi je me tourne vers les macros, mal grès ma totale incompétence dans ce domaine.

    La macro que j'essaye donc de faire repose sur ce fonctionnement :
    1. Parcourir le tableau listant les articles par code
    2. Filtrer le TCD avec l'article actuel
    3. Récupérer la variable calculée
    4. Coller cette valeur dans la ligne du tableau correspondante
    5. Passer à l'article suivant


    L'idéal (pour l'utilisateur) serait donc de cliquer sur un bouton 'Calculer' qui pour chaque article listé dans un tableau renverrait le temps optimum de production de l'article correspondant.

    Et c'est ici que j'ai besoin de vos lumières. Comme je l'ai dis un peu plus tôt, je ne suis pas familier avec les macros Excel. J'ai bien essayé d'écrire un semblant de code pour me faire la main et filtrer mon TCD mais je n'obtiens rien d'intéressant. Après avoir cherché dans tous les forums qui traitaient de ce sujet, je n'ai même pas réussi à traiter le filtrage d'un TCD, ce qui est pourtant la fonctionnalité centrale de mon projet de macro.

    Dans mon exemple, j'ai une feuille 'Analyse' contenant le TCD et la valeur optimale calculée, et dans une feuille 'Tableau de bord' le tableau listant les articles.

    Je ne demande pas forcément une solution toute faite (bien qu'acceptable ) mais j'en appelle humblement à votre connaissance dans ce domaine pour résoudre mon problème car je dois avouer que je n'ai pas d'autres solutions à l'esprit pour l'instant.

    Toute idée est bonne à prendre.
    Merci d'avance pour les personnes qui prendront le temps de m'en proposer.
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je ne sais pas si c'est ça que tu cherche!
    http://www.developpez.net/forums/d14...n/#post8006131

  3. #3
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Bonjour

    N'est-il pas possible de créer un tableau des articles + valeur optimale calculée et d'ajouter ce tableau dans le modèle Powerpivot puis d'éatblir une relation entre tes données journalières et ce tableau ?

    Ou bien si tu n'as pas cette liste des codes articles (si j'ai bien compris, tu veux la déduire du TCD), de l'obtenir via une requête sur la base SQL server avec un select DISTINCT sur le même source ?
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    Bonjour,
    je ne sais pas si c'est ça que tu cherche!
    http://www.developpez.net/forums/d14...n/#post8006131
    Merci pour ta réponse.

    J'ai relu la discussion dont provient ton post. Il s'avère que le contexte n'est pas le même puisque dans mon cas je ne veux pas une sélection multiple dans le TCD.
    De plus, bien que je pense comprendre ton code, je doute savoir comment le tester dans mon classeur.

    Et quand bien même il fonctionnerait dans mon cas, il ne répond pas à ma problématique de base, à savoir parcourir une plage de cellules à l'aide d'une boucle et copier un cellule calculée à chaque modification du filtre du TCD.

    Que fait ton code exactement ? Pour être sur que je suis complètement à côté de la plaque !

    Citation Envoyé par 78chris Voir le message
    Bonjour

    N'est-il pas possible de créer un tableau des articles + valeur optimale calculée et d'ajouter ce tableau dans le modèle Powerpivot puis d'éatblir une relation entre tes données journalières et ce tableau ?

    Ou bien si tu n'as pas cette liste des codes articles (si j'ai bien compris, tu veux la déduire du TCD), de l'obtenir via une requête sur la base SQL server avec un select DISTINCT sur le même source ?
    Merci de ta réponse.

    Le tableau des articles existe déjà. Je veux justement m'en servir pour que la macro parcoure la colonne "Article" du tableau, filtre automatiquement le TCD et pour chaque article trouvé dans le tableau ajouter la valeur optimale dans la ligne correspondante.

    Le traitement se ferait donc en 3 parties :
    1. Le TCD renvoit les temps de gamme d'un article
    2. Mon modèle calcule la valeur optimale
    3. La macro affecte la valeur optimale à la liste des articles dans le tableau

    Et cela se répéterai pour chaque article listé dans le tableau.
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  5. #5
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Re

    La valeur optimale se calcule en fonction de l'historique ?

    Sans savoir comment tu calcules il est difficile de te donner d'autres pistes : DAX permet aussi de calculer hors TCD...
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    Toutes les mesures que j'ai essayé via des mesures DAX ne m'ont pas permis de projeter le calcul que je fais sur mon modèle, c'est d'ailleurs pour ça que j'ai préféré effectué des mesures en "brut" plutôt qu'avec le modèle de données PowerPivot.

    Le calcul se fait en fonction de la plage de temps récupéré par le TCD. Le tableau que j'ai mis en exemple est une plage de données que je récupère. Cette plage est utilisé comme référentiel pour une méthode de calcul qui me permet d'afficher un graphique de ce type :

    Pour info, les temps sont enregistrés en heures.

    Nom : Capture.PNG
Affichages : 2048
Taille : 17,9 Ko

    Toutefois, l'important ici n'est pas le calcul mais la valeur qui est calculée. Ma problématique est justement d'envoyer cette valeur vers un tableau pour le code article correspondant dans ledit tableau, d'où mon idée de macro qui va créer une boucle pour filtrer le TCD et récupérer cette valeur automatiquement entre chaque itération.
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  7. #7
    Invité
    Invité(e)
    Par défaut
    si j'ai bien compris ma proposition ne convient pas!

  8. #8
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Re

    Une piste partant du slicer, à adapter : c'est plus sûr de partir de ce qui existe dans le TCD que de la liste complète qui n'aura peut-être pas de correspondance dans le TCD.

    Ajouter une actualisation au début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        With ThisWorkbook.SlicerCaches("Segment_Nom")
        .ClearManualFilter
        For Each Cas1 In .SlicerItems
            Cas1.Selected = True
                For Each Cas2 In .SlicerItems
                    If Cas2.Caption <> Cas1.Caption Then Cas2.Selected = False
                Next Cas2
            ThisWorkbook.Worksheets("Analyse").PivotTables("NomTCD").PivotFields("NomChampArticle").DataRange.Select
            Mon modèle calcule la valeur optimale
            La macro affecte la valeur optimale à la liste des articles dans le tableau
        Next Cas1
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  9. #9
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    Encore merci pour ton aide, c'est une piste très intéressante que de prendre le segment comme référentiel.

    J'ai créé une nouvelle feuille "TEST" qui accueillera les valeurs que je souhaite afficher en attendant d'avoir le luxe de mettre en forme tout ça pour faciliter l'analyse.

    Voici ce que j'essaye de tester :

    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
    With ThisWorkbook.SlicerCaches("Segment_Article")
        .ClearManualFilter
        For Each Cas1 In .SlicerItems
            Cas1.Selected = True
                For Each Cas2 In .SlicerItems
                    If Cas2.Caption <> Cas1.Caption Then Cas2.Selected = False
                Next Cas2
            ThisWorkbook.Worksheets("Analyse").PivotTables("Article").PivotFields("Article").DataRange.Select
    
           'Pour chaque Item du segment, je veux écrire dans ces cellules les variables concernées.  
            Dim i As Integer
            i = 2
    
            Worksheets("TEST").Range("B" & i).Value = Worksheets("Analyse").Range("K4").Value
            Worksheets("TEST").Range("C" & i).Value = Worksheets("Analyse").Range("E37").Value
               
            i = i + 1
        Next Cas1
     End With
    Je cherche donc à parcourir l'ensemble des membres du segment, et pour chaque membre copier la valeur de l'article (K4 faisant référence à la cellule où est affichée l'article sélectionné) et la valeur optimum (E37 étant la cellule où est enregistrée cette valeur).
    Le code que j'ai rajouté est complètement faux mais représente assez bien mon idée finale.

    De plus, lorsque je lance la macro avec un bouton, il me retourne une erreur d'éxécution 1004 : 'Erreur définie par l'application ou par l'objet' et se fixe au Débogage sur la ligne 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For Each Cas1 In .SlicerItems
    Désolé mais je ne susi vraiment pas à l'aise avec les macros VBA ...
    Une idée ?
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  10. #10
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Bonjour

    Si c'est le bon slicer et qu'il contient bien des articles, je ne vois pas pourquoi cela plante.

    En mode debug tu peux voir son contenu en mettant un espion sur ThisWorkbook.SlicerCaches("Segment_Nom").SlicerItems

    où est le bouton ? Où est situé le code ?
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  11. #11
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par 78chris Voir le message
    En mode debug tu peux voir son contenu en mettant un espion sur ThisWorkbook.SlicerCaches("Segment_Nom").SlicerItems
    J'ai placé l'espion comme indiqué, et en débogage lorsque je passe sur les première lignes du With, il m'affiche cette valeur : "<Variable objet ou variable de bloc With non définie>" ; puis vide bien le cache et retire le filtre du segment. Au moment de filtrer le segment item par item, il me renvoie la même erreur que précédemment.

    Citation Envoyé par 78chris Voir le message
    où est le bouton ?
    Le bouton se situe dans la feuille "Analyse".

    Citation Envoyé par 78chris Voir le message
    Où est situé le code ?
    Le code est enregistré dans un module appelé "Module1".

    D'ailleurs, lorsque je le déplace dans l'objet ThisWorkbook ou Analyse, j'obtiens l'erreur 400.

    J'ai avancé un petit peu de mon côté, et j'ai pris le temps de faire quelques recherches.

    Voici ce que j'ai fais :

    Code VBA : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    'J'ai ajouté Option Explicit pour m'aider dans le débogage
    Option Explicit
    Sub FiltrerTCD()
        'Je déclare toutes mes variables
        Dim C As SlicerCache
        Dim CL As SlicerCacheLevel
     
        Set C = ThisWorkbook.SlicerCaches("Segment_Article")
        Set CL = C.SlicerCacheLevels(1)
     
        Dim Cas1 As SlicerItem
        Dim Cas2 As SlicerItem
     
        Dim I As Integer
        I = 2
     
        With C
            .ClearManualFilter
            'J'ai supprimé ici la ligne Cas1.Selected=True car elle ne sert pas vraiment puisqu'il y a .ClearManualFilter juste avant
            For Each Cas1 In CL.SlicerItems
                For Each Cas2 In CL.SlicerItems
                    If Cas2.Caption <> Cas1.Caption Then
                        'C'est ici que j'obtiens mon erreur d'éxécution 1004
                        Cas2.Selected = False
                    End If
                Next
     
                ThisWorkbook.Worksheets("Analyse").PivotTables("Article").PivotFields("Article").DataRange.Select
     
                'Pour chaque Item du segment, j'écris dans la feuille TEST
     
                ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
     
                I = I + 1
            Next
        End With
    End Sub

    Pour le débogage, j'ai placé 2 espions sur Cas1 et Cas2 afin d'identifier les valeurs de Cas1 et Cas2. À ce niveau là, pas de soucis.
    Toutefois, dès que j'effectue la deuxième itération du 2ème For et que l'instruction essaye de passer Cas2.Selected à False, l'erreur est retournée.

    Erreur d'éxécution '1004':
    Erreur définie par l'application ou par l'objet
    Si vous avez une idée, je suis preneur !
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  12. #12
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Bonjour

    Mon code s'applique à un segment classique où SlicerCacheLevels n'existe pas.

    Pour PowerPivot c'est plus complexe. Ceci devrait marcher

    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
    22
    Option Explicit
    Sub FiltrerTCD()
    Dim Cas1 As SlicerItem, Cas2 As SlicerItem
    Dim MaSource As String
    Dim MonChamp As String
    MaSource = "[Tableau1].[Article]" 'Nom de la Table dans PowerPivot 
    MonChamp = "[Article]"
    
        With ThisWorkbook.SlicerCaches("Segment_Article")
        .ClearManualFilter
        For Each Cas1 In .SlicerCacheLevels(1).SlicerItems
            .VisibleSlicerItemsList = Array(MaSource & ".&[" & Cas1.Caption & "]")
    
                 'Pour chaque Item du segment, j'écris dans la feuille TEST
     
                ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
    
        Next Cas1
    
        End With
    End Sub
    On doit pouvoir changer les références sous forme de chaîne par des références objet...
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  13. #13
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    En effet, j'avais lu que pour Powerpivot, il y a quelques subtilités. Mais finalement ça fonctionne !
    J'ai ajouté ma variable I pour écrire les valeurs ligne par ligne et j'ai ajouté une condition pour ne sélectionner que les segments ayant des données, comme ceci :

    Code VBA : 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
    22
    23
    24
    25
    26
    27
    Option Explicit
    Sub FiltrerTCD()
        Dim Cas1 As SlicerItem, Cas2 As SlicerItem
        Dim MaSource As String
        Dim MonChamp As String
        Dim I As Integer
        MaSource = "[ANALYSE].[Article]" 'Nom de la Table dans PowerPivot
        MonChamp = "[Article]"
        I = 2
     
        With ThisWorkbook.SlicerCaches("Segment_Article")
            .ClearManualFilter
            For Each Cas1 In .SlicerCacheLevels(1).SlicerItems
                If Cas1.HasData = True Then
                    .VisibleSlicerItemsList = Array(MaSource & ".&[" & Cas1.Caption & "]")
     
                    ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                    ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                    ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
     
                    I = I + 1
                Else
                    Exit For
                End If
            Next Cas1
        End With
    End Sub

    Avant de marquer cette discussion comme résolue, j'aurai aimé une dernière fois ton aide si ce n'est pas trop te demander. Il s'avère que mon TCD "Article" affiche les temps pour chaque article et pour chaque composant utilisé :

    Nom : Capture.PNG
Affichages : 1999
Taille : 6,4 Ko

    Aurais-tu une idée pour, selon le nombre de composant présent dans le TCD, écrire dans la feuille "TEST" les valeurs du temps optimum les uns à la suite des autres. Tout en sachant que ces valeurs sont enregistrés sur la feuille "Analyse".

    Voici ce que j'essaye de faire actuellement, mais c'est assez redondant.
    Ce traitement fonctionne mais mon compteur renvoie parfois un nombre d'éléments incorrect, je me retrouve par exemple avec un compteur qui est égal à 3 alors qu'il n'y en a qu'1 qui est visible. Comment exclure ces éléments invisibles ?

    Si tu vois mon erreur, ou a une meilleure idée pour effecteur le même traitement, je suis preneur.

    Code VBA : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    Option Explicit
    Sub FiltrerTCD()
        Dim Cas1 As SlicerItem, Cas2 As SlicerItem
        Dim MaSource As String
        Dim MonChamp As String
        Dim I As Integer
        Dim NbComposant As Long
        MaSource = "[ANALYSE].[Article]" 'Nom de la Table dans PowerPivot
        MonChamp = "[Article]"
        I = 3
     
        With ThisWorkbook.SlicerCaches("Segment_Article")
            .ClearManualFilter
            For Each Cas1 In .SlicerCacheLevels(1).SlicerItems
                If Cas1.HasData = True Then
                    .VisibleSlicerItemsList = Array(MaSource & ".&[" & Cas1.Caption & "]")
     
                    NbComposant = ActiveWorkbook.ActiveSheet.PivotTables(1).PivotFields(3).PivotItems.Count
     
                    Select Case NbComposant
                        Case 1
                            ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
                            I = I + 1
                        Case 2
                            ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            I = I + 2
                        Case 3
                            ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            I = I + 3
                        Case 4
                            ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 3).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 3).Value = Worksheets("Analyse").Range("E163").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 3).Value = Worksheets("Analyse").Range("O3").Value
                            I = I + 4
                        Case 5
                            ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 3).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 3).Value = Worksheets("Analyse").Range("E163").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 3).Value = Worksheets("Analyse").Range("O3").Value
                            ThisWorkbook.Worksheets("TEST").Range("B" & I + 4).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("TEST").Range("C" & I + 4).Value = Worksheets("Analyse").Range("E205").Value
                            ThisWorkbook.Worksheets("TEST").Range("D" & I + 4).Value = Worksheets("Analyse").Range("P3").Value
                            I = I + 5
                        End Select
                Else
                    Exit For
                End If
            Next Cas1
        End With
    End Sub

    Merci en tous cas pour l'aide que tu m'as apportée, cela fut très instructif !
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

  14. #14
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : février 2010
    Messages : 7 258
    Points : 13 733
    Points
    13 733
    Par défaut
    Bonjour

    Difficile de vérifier en détail le code sans le fichier mais tu dois pouvoir remplacer ton select case par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For z = 1 to NbComposant
    	ThisWorkbook.Worksheets("TEST").Range("B" & I).Value = CStr(Cas1.Value)
    	ThisWorkbook.Worksheets("TEST").Range("C" & I).Value = Worksheets("Analyse").Range("E37"). offset(42*(z-1),0).Value 
    	ThisWorkbook.Worksheets("TEST").Range("D" & I).Value = Worksheets("Analyse").Range("L3").offset(0,z-1).Value 
    	I=I+1
    Next z
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  15. #15
    Membre habitué Avatar de TheChovix
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2014
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2014
    Messages : 77
    Points : 165
    Points
    165
    Par défaut
    Ci-après mon code final corrigé et fonctionnel.
    J'ai donc ajouté mon code à un UserForm qui me permet de construire un bouton avec une barre de progression ( tutoriels excel ) pour le rendre un peu plus "user friendly".
    J'ai également ajouté quelques champs pour mieux présenter mes données.

    J'assume totalement que ce code est très assez redondant mais il répond à mon besoin actuel et subira probablement une Màj bientôt. Même si je n'ai pas utilisé l'astuce de 78chris pour l'utilisation de Case, elle me sera sans doute utile.

    Code VBA : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    Private Sub CommandButton1_Click()
        Application.ScreenUpdating = False
        UserForm1.Height = 159
     
        compteur = 0
        progression = 0
     
        Dim Cas1 As SlicerItem, Cas2 As SlicerItem
        Dim MaSource As String
        Dim MonChamp As String
        Dim I As Integer
        Dim NbArticle As Long
        Dim NbComposant As Long
        MaSource = "[ANALYSE].[Article]" 'Nom de la Table dans PowerPivot
        I = 3
     
        With ThisWorkbook.SlicerCaches("Segment_Article")
            .ClearManualFilter
            NbArticle = ActiveWorkbook.ActiveSheet.PivotTables(1).PivotFields(1).PivotItems.Count
     
            For Each Cas1 In .SlicerCacheLevels(1).SlicerItems
                If Cas1.HasData = True Then
                    .VisibleSlicerItemsList = Array(MaSource & ".&[" & Cas1.Caption & "]")
     
                    NbComposant = ActiveWorkbook.ActiveSheet.PivotTables(1).PivotFields(3).PivotItems.Count
     
                    ' Me permet de gérer les lignes vides en fonction du nombre de composant utilisé
                    Select Case NbComposant
                        Case 1
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I).Value = Worksheets("Analyse").Range("E40").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I).Value = Worksheets("Analyse").Range("L3").Value
                            I = I + 1
                        Case 2
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I).Value = Worksheets("Analyse").Range("E40").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 1).Value = Worksheets("Analyse").Range("E82").Value
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 1).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            I = I + 2
                        Case 3
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I).Value = Worksheets("Analyse").Range("E40").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 1).Value = Worksheets("Analyse").Range("E82").Value
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 1).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E124").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 2).Value = Worksheets("Analyse").Range("F122").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            I = I + 3
                        Case 4
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I).Value = Worksheets("Analyse").Range("E40").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 1).Value = Worksheets("Analyse").Range("E82").Value
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 1).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E124").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 2).Value = Worksheets("Analyse").Range("F122").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 3).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 3).Value = Worksheets("Analyse").Range("E166").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 3).Value = Worksheets("Analyse").Range("E163").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 3).Value = Worksheets("Analyse").Range("F164").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 3).Value = Worksheets("Analyse").Range("O3").Value
                            I = I + 4
                        Case 5
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I).Value = Worksheets("Analyse").Range("E40").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I).Value = Worksheets("Analyse").Range("E37").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I).Value = Worksheets("Analyse").Range("L3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 1).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 1).Value = Worksheets("Analyse").Range("E82").Value
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 1).Value = Worksheets("Analyse").Range("E79").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 1).Value = Worksheets("Analyse").Range("F38").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 1).Value = Worksheets("Analyse").Range("M3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 2).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 2).Value = Worksheets("Analyse").Range("E124").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 2).Value = Worksheets("Analyse").Range("E121").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 2).Value = Worksheets("Analyse").Range("F122").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 2).Value = Worksheets("Analyse").Range("N3").Value
                            ' ----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 3).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 3).Value = Worksheets("Analyse").Range("E166").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 3).Value = Worksheets("Analyse").Range("E163").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 3).Value = Worksheets("Analyse").Range("F164").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 3).Value = Worksheets("Analyse").Range("O3").Value
                            ' -----------------------------------------
                            ThisWorkbook.Worksheets("Tableau").Range("B" & I + 4).Value = CStr(Cas1.Value)
                            ThisWorkbook.Worksheets("Tableau").Range("C" & I + 4).Value = Worksheets("Analyse").Range("E208").Value
                            ThisWorkbook.Worksheets("Tableau").Range("D" & I + 4).Value = Worksheets("Analyse").Range("E205").Value
                            ThisWorkbook.Worksheets("Tableau").Range("E" & I + 4).Value = Worksheets("Analyse").Range("F206").Value
                            ThisWorkbook.Worksheets("Tableau").Range("F" & I + 4).Value = Worksheets("Analyse").Range("P3").Value
                            I = I + 5
                        End Select
     
                    ' Suivant le tutoriel, je gère la barre de progression
                    compteur = compteur + 1
     
                    ' En fonction du nombre d'article géré, je fais avancer ma barre de progression d'un pourcent à chaque fois que mon compteur
                    ' atteint un 100ème du nombre total de mes articles
                    If compteur Mod (NbArticle / 100) = 0 Then
                        progression = progression + 1
                        Image_barre.Width = progression * 1.5
                        Label_barre.Caption = progression & "%"
                        DoEvents
                    End If
                Else
                    Exit For
                End If
            Next Cas1
        End With
        Label_barre.Caption = 100 & "%"
        Application.ScreenUpdating = True
        UserForm1.Height = 186
    End Sub

    Encore merci à toi 78chris pour ton aide !
    J'étais une véritable bouse en VBA (et je le suis toujours ) mais c'est en forgeant qu'on devient forgeron !
    Le seul bogue à ne pas corriger c'est celui qui fait fonctionner le projet.

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

Discussions similaires

  1. [XL-2003] TCD - Générer un tableau par valeur du filtre
    Par nawakbling dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/09/2011, 13h00
  2. Réponses: 6
    Dernier message: 20/10/2009, 11h05
  3. Filtrage sur un tableau EXCEL par macro
    Par cati_78 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/05/2009, 18h25
  4. Filtrage sur tableau
    Par cyberspace7119 dans le forum VBA Access
    Réponses: 1
    Dernier message: 21/06/2007, 13h35
  5. Réponses: 2
    Dernier message: 07/09/2006, 00h20

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