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 :

VBA - Fermeture du UserForm après sélection dans un Combobox [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut VBA - Fermeture du UserForm après sélection dans un Combobox
    Bonjour,
    Débutant confirmé , je consulte régulièrement les forums de developpez.net avec beaucoup de plaisir et de bonheur. J'en profite pour adresser un grand bravo à toute l'équipe et aux bénévoles !
    Cette fois ci ma recherche est restée infructueuse...

    Voici mon problème :
    J'ai un Userform (FormCPVille) avec 2 Conbobox (ComboVille et CodePostal) qui sont liés et qui vont piocher leurs données dans une feuille excel.
    Nom : FormCPVille.png
Affichages : 1572
Taille : 8,5 Ko
    Comment exécuter mon code de fin (actuellement déclenché par le bouton "Validation") dès qu'une sélection a été effectuée dans l'un des Combobox ?
    J'ai essayé plusieurs solutions sans succès (événements Exit, Enter, AfterUpdate)

    Les 2 Combobox et le bouton "validation" sont alimentés par le code suivant :
    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
    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
     
    Private Sub B_validation_Click()
    'appel de la fonction de Validation
    Call ValidationCPVille
     
    End Sub
    Private Sub ComboVille_Change()
     On Error Resume Next
     If ActiveControl.Name <> "ComboVille" Then Exit Sub
     On Error GoTo 0
     If Me.ComboVille.ListIndex = -1 And _
         IsError(Application.Match(Me.ComboVille, Application.Index(ListeVille, , 1), 0)) Then
         Dim b()
         Me.CodePostal = ""
         clé = UCase(Me.ComboVille) & "*"
         n = 0
         For I = LBound(ListeVille) To UBound(ListeVille)
           If UCase(ListeVille(I, 1)) Like clé Then
             n = n + 1: ReDim Preserve b(1 To 2, 1 To n)
             b(1, n) = ListeVille(I, 1): b(2, n) = ListeVille(I, 2)
           End If
          Next I
          If n > 0 Then
            ReDim Preserve b(1 To 2, 1 To n + 1)
            Me.ComboVille.List = Application.Transpose(b)
            Me.ComboVille.RemoveItem n
          End If
          Me.ComboVille.DropDown
       Else
          On Error Resume Next
          Me.CodePostal = Me.ComboVille.Column(1)
       End If
    End Sub
     
    Private Sub CodePostal_Change()
     On Error Resume Next
     
     If ActiveControl.Name <> "CodePostal" Then Exit Sub
     On Error GoTo 0
     If Me.CodePostal.ListIndex = -1 And _
         IsError(Application.Match(Me.CodePostal, Application.Index(ListeVille, , 2), 0)) Then
         Dim b()
         clé = UCase(Me.CodePostal) & "*"
         n = 0
         For I = LBound(ListeVille) To UBound(ListeVille)
           If UCase(ListeVille(I, 2)) Like clé Then
             n = n + 1: ReDim Preserve b(1 To 2, 1 To n)
             b(1, n) = ListeVille(I, 2): b(2, n) = ListeVille(I, 1)
           End If
          Next I
          If n > 0 Then
            ReDim Preserve b(1 To 2, 1 To n + 1)
            Me.CodePostal.List = Application.Transpose(b)
            Me.CodePostal.RemoveItem n
          End If
          Me.CodePostal.DropDown
       Else
          On Error Resume Next
          Me.ComboVille = Me.CodePostal.Column(1)
       End If
    End Sub
    PS : Ce code est adapté d'un code trouvé sur Internet ; je remercie l'auteur originel.

    Merci pour votre aide

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par lemoineeric Voir le message
    Comment exécuter mon code de fin (actuellement déclenché par le bouton "Validation") dès qu'une sélection a été effectuée dans l'un des Combobox ?
    A priori, en ajoutant le code lié à ce bouton dans les codes de chaque ComboBox, à la suite du code contenu actuellement.

    Je doute qu'un simple copier/coller suffise. Il faudra sans doute un peu adapter le code.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut
    Citation Envoyé par Menhir Voir le message
    A priori, en ajoutant le code lié à ce bouton dans les codes de chaque ComboBox, à la suite du code contenu actuellement.

    Je doute qu'un simple copier/coller suffise. Il faudra sans doute un peu adapter le code.
    Merci Menhir pour ta proposition.
    Le problème est que le combobox est dans une procédure de mise à jour automatique en fonction du début de saisie de l'utilisateur.
    L'appel à validation ne peux donc pas se faire pendant ce processus.
    Il faudrait pouvoir le mettre dans un autre événement...
    Pour l'instant je conserve le bouton "validation"

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par lemoineeric Voir le message
    Comment exécuter mon code de fin (actuellement déclenché par le bouton "Validation") dès qu'une sélection a été effectuée dans l'un des Combobox ?
    Citation Envoyé par lemoineeric Voir le message
    Le problème est que le combobox est dans une procédure de mise à jour automatique en fonction du début de saisie de l'utilisateur.
    L'appel à validation ne peux donc pas se faire pendant ce processus.
    A ma connaissance, les macro Change se déclenchent à la validation d'un champ.
    Tes explications sont donc contradictoires.
    Il faudrait que tu sois plus clair.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut
    Citation Envoyé par Menhir Voir le message
    A ma connaissance, les macro Change se déclenchent à la validation d'un champ.
    Tes explications sont donc contradictoires.
    Il faudrait que tu sois plus clair.
    Désolé si je n'emploie pas les bons termes ; je ne suis pas informaticien et je développe pour me faciliter le travail (et pour le plaisir d'avoir des outils sympa).
    Je vais donc essayer d'être plus clair...
    Dans chaque combobox, la liste déroulante des propositions est rafraîchie au fur et à mesure de la saisie de l'utilisateur. Les macros 'change' sont donc déclenchées à chaque modification de la saisie (ou alors j'ai loupé quelque chose).
    J'ai essayé les macros 'Click' et 'Enter' sur le combobox ; elles ferment le UserForm dès son ouverture. Peut-être qu'en mettant un compteur et une condition pour éviter le 1er passage sur la macro...

    Veux-tu que je partage l'appli ? Ce serait probablement plus parlant.
    En tout cas, merci de te préoccuper de mon problème

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut
    Citation Envoyé par lemoineeric Voir le message
    J'ai essayé les macros 'Click' et 'Enter' sur le combobox ; elles ferment le UserForm dès son ouverture. Peut-être qu'en mettant un compteur et une condition pour éviter le 1er passage sur la macro...
    Cela fonctionne très bien :
    - une variable initialisée à l'ouverture du UserForm
    - une condition avec un changement de valeur de ladite variable
    et le tour est joué.
    Voici le code pour l'utilisation avec la macro 'Click'. Il reste à faire la même chose pour une validation avec 'Enter'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim CptCode, CptVille As Integer
     
    Private Sub CodePostal_Click()
    If CptCode = 1 Then
        'appel de la fonction de Validation
        Call ValidationCPVille
    End If
    CptCode = 1
     
    End Sub

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut
    Bonjour Pierre et merci pour cette réponse détaillée.
    Je crains cependant que tu n'atteignes la limite de mes compétences...

    Je vais donc étudier de près ton code et ta proposition de gestion du formulaire. En particulier, je vais regarder du côté des transferts d'informations entre la feuille qui appelle et le formulaire qui permet la sélection d'une information.
    Cela nécessitera sans doute un peu de temps car je reprends le travail...

    PS : Concernant l'association CP/Ville, nous avons en France la même situation qu'en Belgique ; CP multiples et Villes ayant le même nom.

    Merci encore pour tes conseils avisés !

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Normalement, ton userform ne devrait "rien" faire. Il sert juste à renseigner à la procédure qui a affiché le userform du choix de l'utilisateur. Tu remarqueras d'ailleurs qu'en gros, tu dupliques le traitement sur tes deux Change alors que ce n'est pas nécessaire. Un userform de choix comme celui-ci devrait être autonome, de façon à pouvoir être réutilisé à chaque besoin, indépendamment du classeur avec lequel tu vas travailler. Le traitement spécifique à un classeur doit donc être fait en amont et en aval de l'utilisation du userform, qui est à considérer comme une fonction qui renvoie un choix (ici, la position de la ville choisie dans la table des villes)

    Dès lors, fermer le useform lors d'une sélection dans un combobox revient à ceci. Cela rend la main au code qui a ouvert le userform et qui va continuer le traitement. Afin de savoir quel combo a été utilisé, on peut utiliser le code suivant au niveau du userform, qui transfère à deux propriétés publiques du userform la valeur choisie et le type de donnée utilisé (cp ou ville). Le code appelant reprend la main et peut poursuivre le traitement (dans l'exemple, ce traitement consiste à retrouver l'index de la ville sélectionnée*
    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
     
    Option Explicit
     
    Public DataType As String
    Public Value As String
     
    Private Sub cboCity_Change()
      DataType = "City"
      Value = cboCity.Value
      Me.Hide
    End Sub
     
    Private Sub cboZipCode_Change()
      DataType = "ZipCode"
      Value = cboZipCode.Value
      Me.Hide
    End Sub
    Voici le code d'un module standard qui gère le userform et poursuit le traitement. Je me suis basé sur un tableau structuré t_Villes composé des deux colonnes CP et Ville. On voit bien que le userform est inclus dans une fonction qui renvoie la position de la ville choisie.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    Sub Test()
      Dim Index As Long
     
      Index = getCityIndex()
    End Sub
     
    Function getCityIndex() As Long
      Dim Formula As String
      Dim Index As Long
      Dim Value As String
      Dim DataType As String
     
      With usfCities
        .cboCity.List = Range("t_Villes[Ville]").Value
        .cboZipCode.List = Range("t_Villes[CP]").Value
        .Show
        Value = .Value
        DataType = .DataType
      End With
      Unload usfCities
      If DataType <> "" Then
        Formula = "match(""" & Value & """,t_Villes[{Column}],0)"
        If DataType = "City" Then
          Formula = Replace(Formula, "{Column}", "Ville", , , vbTextCompare)
        Else
          Formula = Replace(Formula, "{Column}", "CP", , , vbTextCompare)
        End If
        getCityIndex = Evaluate(Formula)
      End If
    End Function

    Normalement, la fonction devrait recevoir les deux arrays sans aller les chercher elle-même dans la feuille Excel, de façon à être parfaitement générique. Si tu veux pousser jusque-là, on pourra voir cela dans un second temps, car la solution que je te propose ne tient pas compte de plusieurs villes portant le même nom ou de codes postaux identiques pour des localités différentes d'une même entité administrative (je ne sais pas si cela existe en France, mais en Belgique, on a ce genre de cas, nous amenant à considérer que c'est la paire CP/Ville qui est unique)..

    * Je ne me sers pas de l'index de la ligne choisie dans le combo car si pour l'exemple, je n'ai pas trié les codes postaux pour le combo des codes postaux et les villes pour le combo des villes, je suppose que normalement, c'est fait au moment d'alimenter les combo, et donc l'index sélectionné dans un des combo ne correspondra pas à la position de la ville dans la table des villes.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Marcel,

    Les lignes suivantes, parce que présentes dans un module de classe, ne sont en fait rien d'autre que des "property" auto-implémentées en lecture-écriture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public DataType As String
    Public Value As String
    Comme il s'agit de variables primitives ( <> d'objets) et qu'elle ne sont pas transformées au moment de leur lecture ou de leur écriture, il n'est pas nécessaire de passer par les blocs plus formels "Public Property Get(...)" qui nécessitent l'utilisation d'une variable privée de portée "module"... La propriété DataType permet de savoir si l'on a récupéré la ville ou le CP.

    Je pense donc que l'on se rejoint assez bien sur l'idée.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Pierre, Bonjour le Forum,

    Bien noté. Merci

    (Encore un lien dans mes dossiers aide-mémoire )

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Marcel,

    En complément: Voici un userform1 qui possède une propriété autoimplémentée Property1 de type long et une propriété autoimplémentée Object1 de type Object...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Property1 As Long
    Public Object1 As Object
    Pour Property1, pas de soucis particuliers puisque c'est une propriété d'un type simple(<> object). On la valorise avec UserForm1.Property1 = 4 (quelle que soit la syntaxe de déclaration, autoimplémentée ou formelle). Cette façon de la déclarer ("comme" une variable publique) revient au même que la déclaration formelle suivante, qui est inutilement verbeuse puisque les Property ne modifient pas la valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private mProperty1 As Long
     
    Property Get Property1() As Long
      Property1 = mProperty1
    End Property
     
    Property Let Property1(Value As Long)
      mProperty1 = Value
    End Property
    Evidemment, si la valeur doit être modifiée au moment de son écriture et/ou de sa lecture, on n'aura pas le choix et on devra passer par la déclaration formelle.



    Par contre, pour la propriété Object1, comme elle pointe vers un objet et qu'elle est autoimplémentée, on doit la valoriser comme ceci Set UserForm1.Object1 = .... Ca oblige à utiliser Set, ce qui amène à ne pas valoriser cette propriété avec la même syntaxe que pour une propriété de type simple car il n'y a pas de similitude dans les appels de propriétés. Or, cette façon de faire n'est pas habituelle avec les objets ayant des propriétés Objet.

    Pour éviter cela, et dans le cadre d'une propriété pointant vers un objet, générique (as object) ou particulier (comme par exemple as worksheet), même si la classe ne modifie pas l'objet en lecture/écriture, je préfère passer par la déclaration formelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private mObject1 As Object
     
    Property Get Object1() As Object
      Set Object1 = mObject1
    End Property
     
    Property Let Object1(Value As Object)
      Set mObject1 = Value
    End Property
    Ainsi, je peux l'adresser comme toute autre propriété avec la ligne UserForm1.Object1 = ... car le Set n'est plus nécessaire et ne peut plus être utilisé.


    Au passage, il faut bien noter que la déclaration d'une variable Public Property1 As Long dans un module de classe ne crée pas une variable publique (appelée aussi variable globale) mais bien une propriété publique de la classe... Ce qui est tout à fait différent (surtout si on se souvient qu'il ne faut pas utiliser les variables publiques ^^)
    J'espère que ce complément t'intéressera.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut Pierre,

    Oui, ce complément est intéressant.
    Je vais intégrer ce processus dans l'un de mes applicatifs.

    Peut-être pourrait-il illustrer ton tutoriel, non?

    En tout cas, merci à toi.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Par défaut
    Un grand merci à tous pour vos conseils et votre pédagogie.

    Mon appli fonctionne même si elle n'est pas très clean.
    C'est là où je me rends compte que je suis vraiment un "bricolo" !

    Prenez soin de vous et de vos proches en cette période de confinement.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/06/2016, 15h06
  2. [OpenOffice][Base de données] Récupérer les données aprés sélection dans une combobox
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/02/2009, 09h27
  3. Réponses: 3
    Dernier message: 27/11/2008, 17h57
  4. Rediriger vers une page après sélection dans un select
    Par belzeluc dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/11/2006, 22h32

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