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

VB 6 et antérieur Discussion :

[VB]Passage de paramètre à une macro


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [VB]Passage de paramètre à une macro
    Alors voilà mon problème :

    J'ai une application (écrite en PowerBuilder) qui lance la fusion d'une lettre dans Word à l'aide d'une macro.

    Je suis confronter au problème de sécurité connu sous Office 2002 et 2003 : "L'ouverture de se fichier executera la commande SQL suivante : Select * from ..."

    J'ai donc été amenée à modifier ma macro pour inhiber cette sécurité et la réactiver en fin de fusion. Cela n'a pas vraiment arranger les choses car telle que j'avais ércit ma macro, mon modèle était ouvert avant d'inhiber la sécurité.

    J'ai donc essayer de changer la valeur de la clef de registre dans mon application, mais je n'ai pas trouver le moyen de tester la version de Word, version dont dépend le chemin de la clef de registre.

    Je me suis donc mise à retravailler ma macro
    Après quelques échanges avec l'auteur des sources pour inhiber la sécurité, je me retrouve avec une macro dans laquelle :
    - J'inhibe la sécurité
    - J'ouvre mon modèle de lettre
    - Je fusionne
    - Je ferme le modèle de lettre
    - Je réactive la sécurité
    Jusque là tout va bien car le chemin et le nom du modèle sont en dur dans la macro.

    Maintenant, mon réel problème est de savoir comment passer en paramètre à ma macro ce chemin et ce nom de modèle qui sont amener à changer dans l'application.

    Et là je m'adresse à vous car je suis plus que novice en VB.

    Merci de vos réponses qui sont très attendues

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu peux nous mettre ton code ?

    Tu prends où tes paramètres ? Dans VB ?

    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Les paramètres que j'aimerais passer à ma macro sont envoyés depuis mon application développée en PowerBuilder.
    J'ouvre Word avec la fonction Run(winword /mnom_macro).
    Avec cette fonction, j'ai la posssibilité de passer des paramètres, le problème est que je n'arrive pas à les récupérer dans ma macro Word.

    Voici le code de ma macro Word, des fois que cela vous permette de m'aider, pour l'instant le modèle à ouvrir est en dur dans la macro :
    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
    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
    Const HKEY_CURRENT_USER = &H80000001
    Const REG_DWORD As Long = 4
    Const KEY_ALL_ACCESS = &HF003F
     
    'Fonction permettant d’ouvrir une clé existante de la base de registre
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpSubKey String Nom de la clé que vous souhaitez ouvrir.
    'ulOptions Long Paramètre inutilisé: Vaut 0
    'samDesired Long Droits que vous souhaitez utiliser pour cette clé.
    'phkResult Long Cette variable prendra le Handle de la clé que vous venez d'ouvrir.
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(si la fonction réussi.)
     
    Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
     
     
    'Fonction permettant de fermer une clé de la base de registre.
    'hKey Long Handle de la clé que vous souhaitez fermer
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(si la fonction réussi.)
     
    Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
     
    'Cette fonction permet de modifier les données d'une valeur et même de changer son type.
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpValueName String Nom de la valeur à modifier. Si cette valeur n'existe pas elle est alors créée.
    'Reserved Long Paramètre inutilisé: Vaut 0
    'dwType Long Constante définissant le type de valeur à créer ou modifier.
    'szData Long Variable contenant les données de la valeur à créer ou modifier.
    'cbData Long Vous devez ici mettre une variable qui contient le nombre de caractères que vous avez écrit + 1 (+ caractère de fin de chaîne)
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(Si la fonction réussie.)
     
    Public Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
        (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, szData As Long, ByVal cbData As Long) As Long
     
     
    'Fonction permettant de supprimer une valeur de la base de registre.
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpValueName String Nom de la clé que vous souhaitez supprimer.
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(Si la fonction réussie.)
     
    Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
        (ByVal hKey As Long, ByVal lpValueName As String) As Long
     
    Sub fusionner()
     
        Dim lngHandle As Long         'Manipulation de la bdr
        Dim sCheminCle As String      'Chemin dans la bdr de la clé à ouvrir et à fermer
     
        Dim sModele As String         'Nom du modèle
        Dim sFic_a_Charger As String  'Chemin + modèle à ouvrir
     
        sFic_a_Charger = "S:\Informatique\Projet\Gesper\Sources\modeles_word\Pontoise\AND.doc"
     
    '-------------------------------------------------------------------------------------------------
    'Remarques:
    'Un handle est une valeur de type Long qui définit un objet de l'environnement Windows.
    'Lorsque nous ouvrirons une clé, elle possèdera donc son propre handle qui est renvoyé par la fonction.
    'Ce handle nous servira lors de la manipulation de cette clé.
    '-------------------------------------------------------------------------------------------------
    'Détermine le chemin de la clé dans la bdr en fonction de la version d'Office.
        If Application.Version = "11.0" Then
            sCheminCle = "Software\Microsoft\Office\11.0\Word\Options"
        Else
            If Application.Version = "10.0" Then
                sCheminCle = "Software\Microsoft\Office\10.0\Word\Options"
            End If
        End If
     
    'Désactive le message d'alerte : "L'ouverture de ce document exécutera la commande SQL suivante...." => Office 2002 et 2003
    'Ouvre la clé, affecte lui la donnée "SQLSecurityCheck" dont la valeur est = 0, ferme la clé
        If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
            If RegSetValueExLong(lngHandle, "SQLSecurityCheck", 0&, REG_DWORD, 0, 4) = 0 Then
                RegCloseKey (lngHandle)
            Else
                Call MsgBox("L'écriture de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                         "Merci de contacter le service informatique", vbCritical)
                RegCloseKey (lngHandle)
            End If
        Else
            Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                    "Merci de contacter le service informatique", vbCritical)
        End If
     
     
    'N'affiche aucune alerte ou boîte de dialogue
    '    Application.DisplayAlerts = wdAlertsNone
    'Ouvre le modèle en lecture seule
        Documents.Open FileName:=sFic_a_Charger, ReadOnly:=True
    'Positionne-toi sur le modèle
        sModele = ActiveDocument.Name
        With ActiveDocument.MailMerge
            .Destination = wdSendToNewDocument 'Définition du résultat de la fusion comme nouveau document
            .MailAsAttachment = False
            .MailAddressFieldName = ""
            .MailSubject = ""
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
            End With
            .Execute Pause:=True 'Exécution de la fusion
        End With
    'Réaffiche toutes les alertes et boîtes de dialogue
    '    Application.DisplayAlerts = wdAlertsAll
    'Ferme le modèle sans enregistrer de chgmt
        Documents(sModele).Close SaveChanges:=wdDoNotSaveChanges
     
    'Ouvre la clé, supprime la valeur "SQLSecurityCheck" , ferme la clé (Retour à la normal)
        If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
            If RegDeleteValue(lngHandle, "SQLSecurityCheck") = 0 Then
                RegCloseKey (lngHandle)
            Else
                Call MsgBox("La suppression de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                         "Merci de contacter le service technique", vbCritical)
                RegCloseKey (lngHandle)
            End If
        Else
            Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                    "Merci de contacter le service technique", vbCritical)
        End If
    End Sub
    Je répète cela fonctionne très bien, il me faut juste savoir comment passer le nom de mon modèle en paramètre (soit la variable sFic_a_Charger).
    Merci de votre aide

  4. #4
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Si les paramètres viennent de ton appli externe, tu dois pouvoir les recupérer avec la fonction Command()
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Thierry,

    J'ai modifier ma macro, de elle passe à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub fusionner(ByVal sFic_a_Charger As String)
    pour le passage de paramètre.
    J'ai aussi mis en commentaire la déclaration de ma variable et mon modèle en dur dans ma macro.

    Dans "démarrer\executer..." de windows, pour tester, j'ai tapé la commande suivante :
    winword /mfusionner /cmd mon_modele.doc

    Word 2003 et le modèle s'ouvre mais la fusion ne se fait plus
    Et avec Word 2000 (et oui je jongle avec les versions d'office ), j'ai une écran Netmeeting qui s'ouvre :

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Au final
    Alors voilà ...

    Je me retrouve avec une version de macro VB Word qui fonctionne dans toutes les versions d'office :

    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
    Sub fusionner()
     
    End Sub
        docname = ActiveDocument.Name
        With ActiveDocument.MailMerge
            .destination = wdSendToNewDocument
            .MailAsAttachment = False
            .MailAddressFieldName = ""
            .MailSubject = ""
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
            End With
            .Execute Pause:=True
        End With
        ' fermeture[/color]
        Documents(docname).Close SaveChanges:=wdDoNotSaveChanges
    End Sub
    Mais avec deux appels depuis mon application, qui eux diffèrent selon la version d'office.
    - Run("winword " + path_modele + modele + ".doc /mfusionner") //ouvre le document et fusionne
    - Run("winword /mfusionner /cmd " + path_modele + modele + ".doc") // ouvre word, le document et fusionne

    La deuxième permet de contourner le message de sécurité sous Office 2003.
    Par contre sous office 2000, elle génère un écran de saisie NetMeeting.
    Comme à terme, la société va tourner sous Office 2003, mes utilisateurs vont y passer plus tôt, comme ça je n'ai plus qu'une macro et une ligne de commande.

    La première version de ma macro que je vous ai donné ne fusionne plus dès que j'utilise le commutateur /cmd paramètre.

    Edit
    Hello LaboClarins, j'ai foutu en l'air tes belles couleurs mais je pense qu'avec les balises code et /code, c'est plus lisible
    Balises ajoutées par ousk'

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'oubliais :

    MERCI

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Machine arrière toute !!
    J'avais la clef de registre à la valeur qui inhibe la sécurité qui trainait.
    Donc, plus rien ne fonctionne et je reviens sur ma première macro.
    Et je suis de nouveau confronter à ma fusion qui ne se fait plus avec le modèle en paramètre d'entré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
    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
    Const HKEY_CURRENT_USER = &H80000001
    Const REG_DWORD As Long = 4
    Const KEY_ALL_ACCESS = &HF003F
     
    'Fonction permettant d’ouvrir une clé existante de la base de registre
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpSubKey String Nom de la clé que vous souhaitez ouvrir.
    'ulOptions Long Paramètre inutilisé: Vaut 0
    'samDesired Long Droits que vous souhaitez utiliser pour cette clé.
    'phkResult Long Cette variable prendra le Handle de la clé que vous venez d'ouvrir.
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(si la fonction réussi.)
     
    Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
        (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
     
     
    'Fonction permettant de fermer une clé de la base de registre.
    'hKey Long Handle de la clé que vous souhaitez fermer
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(si la fonction réussi.)
     
    Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
     
    'Cette fonction permet de modifier les données d'une valeur et même de changer son type.
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpValueName String Nom de la valeur à modifier. Si cette valeur n'existe pas elle est alors créée.
    'Reserved Long Paramètre inutilisé: Vaut 0
    'dwType Long Constante définissant le type de valeur à créer ou modifier.
    'szData Long Variable contenant les données de la valeur à créer ou modifier.
    'cbData Long Vous devez ici mettre une variable qui contient le nombre de caractères que vous avez écrit + 1 (+ caractère de fin de chaîne)
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(Si la fonction réussie.)
     
    Public Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
        (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, szData As Long, ByVal cbData As Long) As Long
     
     
    'Fonction permettant de supprimer une valeur de la base de registre.
    'hKey Long Handle d'une clé déjà ouverte ou constante d'une clé principale.
    'lpValueName String Nom de la clé que vous souhaitez supprimer.
    'Valeur renvoyée: Long Renvoi 0 (ERROR_SUCCESS)
    '(Si la fonction réussie.)
     
    Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
        (ByVal hKey As Long, ByVal lpValueName As String) As Long
     
    Sub fusionner(ByVal sFic_a_Charger As String)
     
        Dim lngHandle As Long         'Manipulation de la bdr
        Dim sCheminCle As String      'Chemin dans la bdr de la clé à ouvrir et à fermer
     
        Dim sModele As String         'Nom du modèle
     
    '-------------------------------------------------------------------------------------------------
    'Remarques:
    'Un handle est une valeur de type Long qui définit un objet de l'environnement Windows.
    'Lorsque nous ouvrirons une clé, elle possèdera donc son propre handle qui est renvoyé par la fonction.
    'Ce handle nous servira lors de la manipulation de cette clé.
    '-------------------------------------------------------------------------------------------------
    'Détermine le chemin de la clé dans la bdr en fonction de la version d'Office.
        If Application.Version = "11.0" Then
            sCheminCle = "Software\Microsoft\Office\11.0\Word\Options"
        Else
            If Application.Version = "10.0" Then
                sCheminCle = "Software\Microsoft\Office\10.0\Word\Options"
            End If
        End If
     
    'Désactive le message d'alerte : "L'ouverture de ce document exécutera la commande SQL suivante...." => Office 2002 et 2003
    'Ouvre la clé, affecte lui la donnée "SQLSecurityCheck" dont la valeur est = 0, ferme la clé
        If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
            If RegSetValueExLong(lngHandle, "SQLSecurityCheck", 0&, REG_DWORD, 0, 4) = 0 Then
                RegCloseKey (lngHandle)
            Else
                Call MsgBox("L'écriture de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                         "Merci de contacter le service informatique", vbCritical)
                RegCloseKey (lngHandle)
            End If
        Else
            Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                    "Merci de contacter le service informatique", vbCritical)
        End If
     
     
    'N'affiche aucune alerte ou boîte de dialogue
        Application.DisplayAlerts = wdAlertsNone
    'Ouvre le modèle en lecture seule
        Documents.Open FileName:=sFic_a_Charger, ReadOnly:=True
    'Positionne-toi sur le modèle
        sModele = ActiveDocument.Name
        With ActiveDocument.MailMerge
            .Destination = wdSendToNewDocument 'Définition du résultat de la fusion comme nouveau document
            .MailAsAttachment = False
            .MailAddressFieldName = ""
            .MailSubject = ""
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
            End With
            .Execute Pause:=True 'Exécution de la fusion
        End With
    'Réaffiche toutes les alertes et boîtes de dialogue
    '    Application.DisplayAlerts = wdAlertsAll
    'Ferme le modèle sans enregistrer de chgmt
        Documents(sModele).Close SaveChanges:=wdDoNotSaveChanges
     
    'Ouvre la clé, supprime la valeur "SQLSecurityCheck" , ferme la clé (Retour à la normal)
        If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
            If RegDeleteValue(lngHandle, "SQLSecurityCheck") = 0 Then
                RegCloseKey (lngHandle)
            Else
                Call MsgBox("La suppression de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                         "Merci de contacter le service technique", vbCritical)
                RegCloseKey (lngHandle)
            End If
        Else
            Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                    "Merci de contacter le service technique", vbCritical)
        End If
    End Sub

Discussions similaires

  1. Passage de paramètres à une macro depuis la ligne de commande
    Par Atatorus dans le forum Général VBA
    Réponses: 4
    Dernier message: 05/10/2009, 10h22
  2. [PL/SQL] : Passage de paramètres à une fonction
    Par dcollart dans le forum Oracle
    Réponses: 5
    Dernier message: 13/07/2006, 10h17
  3. Problème de passage de paramètres à une procedure
    Par momo62 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 22/12/2005, 15h22
  4. [XSLT][Saxon]passage de paramètres à une template
    Par RB Greg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 12/05/2005, 16h29
  5. [TASM] Passage d'argument à une macro
    Par sorry60 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/04/2005, 18h22

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