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 while until EOF et .csv : problème


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut Boucle while until EOF et .csv : problème
    Bonjour,

    Comme l'indique le titre du sujet, j'ai un soucis avec la fonction EOF sur les fichiers csv.

    Voici le besoin : je dois, à partir d'une macro excel, pouvoir exploiter des CDR (Call Detail Record). Ma macro sert donc à les récuperer depuis le serveur et ensuite les ouvrir puis faire le tri.
    Je bloque entre l'étape d'ouverture du fichier et remplissage.

    Pour faire ce remplissage (je n'ai pas encore fait un quelconque tri, je cherche juste à remplir une feuille excel avec le fichier csv), je me sers d'une boucle qui bouclera tant que je ne suis pas en fin de fichier.

    Problème : cette boucle s’arrête dès la fin de la première ligne.

    Voici la fonction assurant l'ouverture du fichier et son remplissage

    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
     
    Private Function fillSheet(path As String)
        Dim ws As Worksheet
     
        path = Mid(path, 2, Len(path) - 2) 'Je retire les " en debut et fin de chaine
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "Test"
        Open path For Input As #1
        row_number = 0
        Do Until EOF(1)
            Line Input #1, linefromfile
     
            lineitems = Split(linefromfile, ";")
     
            ActiveCell.Offset(row_number, 0).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
            ActiveCell.Offset(row_number, 1).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
            ActiveCell.Offset(row_number, 2).Value = Mid(lineitems(2), 2, Len(lineitems(2)) - 2) 'Je retire les " en debut et fin de chaine
     
            row_number = row_number + 1
        Loop
     
        Close #1
    End Function
    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Okay j'ai compris.

    En gros, les lignes ne sont pas séparés par des retour à la ligne mais par des espaces...
    Hmm...

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,
    les champ texte sont encadrés pars des double cote ["]
    "Champ1";"Champ2"
    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
    Private Function fillSheet(path As String)
        Dim ws As Worksheet
     
        path = Mid(path, 2, Len(path) - 2) 'Je retire les " en debut et fin de chaine
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "Test"
        Open path For Input As #1
        row_number = 0
         While EOF(1) = False
            Line Input #1, linefromfile
     
            lineitems = Split(Replace(linefromfile, Chr(34), ""), ";") 'je remplace le double cote par du vide! et je split
            ActiveSheet.Range(ActiveCell.Offset(row_number, 0), ActiveCell.Offset(row_number, UBound(lineitems) - 1)) = lineitems 'maintenant je peut affecter la totalité du tableau en une passe! 
    '        ActiveCell.Offset(row_number, 0).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
    '        ActiveCell.Offset(row_number, 1).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
    '        ActiveCell.Offset(row_number, 2).Value = Mid(lineitems(2), 2, Len(lineitems(2)) - 2) 'Je retire les " en debut et fin de chaine
     
            row_number = row_number + 1
        Wend
     
        Close #1
    End Function

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Merci pour la réponse.

    Le soucis ne vient pas des champs texts en eux même, mais de la facon dont sont délimités les lignes de mon fichier csv.

    Je croyais au début que ces lignes étaient délimitées par des espaces mais finalement ce n'est pas le cas. Elle sont délimités par ...autre chose (c'est forcement autre chose vu que lorsque j'execute manuellement le fichier avec excel, celui ci repositionne bien tout).
    J'essaie maintenant de remplacer ce... truc par des \n (nouvelle ligne).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     lineitems = Replace(lineitems, Chr(13), Chr(10)) 'dans l'hypothese que ce soit un retour charriot

  5. #5
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Pourquoi ne te simplifies-tu pas la vie en faisant un simple Workbooks.Open qui ouvrira ton fichier CSV en tant que classeur Excel ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Invité
    Invité(e)
    Par défaut
    ça n'est jamais de retour chariot des tabulation ??

    Bonjour,
    donne un exemple de CSV!
    si il faut que tu bidonne les données utilise Notepad++ car Notepad va replacer les tabulations par des espaces! Notepad++ est gratuit!
    Dernière modification par AlainTech ; 02/10/2014 à 22h02. Motif: Fusion de 2 messages

  7. #7
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Je viens de faire le test et il me semble que NotePad conserve les tab.
    Tu ne confondrais pas avec l'éditeur VBA ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Invité
    Invité(e)
    Par défaut
    alors j'ai rien dit; possible que j'ai confondu !
    merci
    Dernière modification par AlainTech ; 02/10/2014 à 22h02. Motif: Suppression de la citation inutile

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par Menhir Voir le message
    Pourquoi ne te simplifies-tu pas la vie en faisant un simple Workbooks.Open qui ouvrira ton fichier CSV en tant que classeur Excel ?
    Je compte trier les informations présentes dans le fichier csv : tout ne m'est pas utile.
    Je suppose que c'est plus rapide à faire en récupérant directement les colonnes voulues qu'en supprimant après avoir ouvert le classeur. (surtout que des colonnes, j'en ai un paquet... alors qu'il n'y en a au final peu qui m'interessent vraiment)

    Voici un exemple de fichier (c'est long), je n'ai pris que les deux premières lignes

    "RECORDID";"STARTUNIXTIME";"DATETIMEEND";"HOLDDURATION";"NBHOLD";"RINGDURATION";"TALKDURATION";"CONFDURATION";"CALLINITIATOR";"CALLERNUMBER";"CALLEREXTERNALNUMBER";"DIALEDNUMBER";"CALLEDNUMBER";"CALLEDEXTERNALNUMBER";"CALLERNAME";"CALLERDEVICENAME";"CALLEDNAME";"CALLEDDEVICENAME";"IPBXNAME";"COMMUNITYNAME";"AAASESSIONID";"CALLTYPE";"TERMINATIONCAUSE";"DIAGNOSTIC";"CDRSTATUS";"ACCOUNTCODE";"DEPARTMENT";"SITE";"CALLID";"BILLINGACCOUNTCUSTOM1";"BILLINGACCOUNTCUSTOM2";"REDIRECTIONCAUSE";"REDIRECTTIMESTAMP";"NEXTRECORDID";"CALLERTYPE";"CALLEDTYPE";"CALLFLOWID";"OWNERADMTIVEDOMAINID";"CREATETIMESTAMP";"DATETIMEENDGMT";"JOKERFIELD";"ISSUERIP";"SIPCALLID1";"SIPCALLID2";"CALLTAG";"CALLRECORDINGNAME";"FAXPAGES";"EXTERNALCALLID";"CALLTYPEFORBILLING"
    "CDF";"1411*****";"2014-09-28 11:40:56";"0";"0";"2";"2";"0";"0627*****";"0627*****";"0627*****";"+33172*****";"200";"01721*****";"33627*****";"[GATEWAY].GwOpenVoice";"";"[csip-snom-821].000*******-master-1";"TC1";"CDFE";"";"E_Incoming";"SRC_DSC";"";"N";"";"Default";"";"CId[493756]";"CFDE";"CFDE";"CFAL";"141189*****7";"CDFE.1411******21.virt.8524.[200]";"EXTERNAL_NUMBER";"STATION";"CDFE.141189******9.conn.493758.[062******0]";"0.9.";"1411897******";"";"";"172.******:50**";"543d9dc*********23b9352402502@94.********";"";"";"";"0";"";"EC"

    Comme vous pouvez le constater, entre "CALLTYPEFORBILLING" et "CDF", il y a un caractere spécial qui est n'est pas consideré, dans ma macro, comme un changement de ligne (du coup, au lieu d'avoir un plusieurs lignes de 49 colonnes, il considère que j'en ai une seule avec 2000+ colonnes)

  10. #10
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Karshick Voir le message
    Je suppose que c'est plus rapide à faire en récupérant directement les colonnes voulues qu'en supprimant après avoir ouvert le classeur.
    Il me semblait pourtant plus simple de supprimer une colonne dans un tableau Excel (Columns("D").Delete) que dans un CSV récupéré champ par champ.
    D'autant plus que l'import Excel sait gérér les guillemets pour les textes.

    Mais je ne connais pas précisément ton problème, donc je me trompe peut-être.
    Cela dit, ça ne coute pas cher d'essayer puisque ça ne prend qu'une ligne de code (attention, si ton délimiteur est un ";", tu seras obligé de l'indiquer à VBA qui utilise "," comme séparateur par défaut des CSV (méthode anglo-saxonne), alors qu'Excel prend bien le ";" (méthode française) ).
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Je sais pas trop...

    A terme (c'est pas pour tout de suite, tout de suite ), j'aimerais pouvoir faire en sorte d'ouvrir une feuille excel par client (avec le détail de leurs appels) histoire de pouvoir faire la facturation plus efficacement.

  12. #12
    Invité
    Invité(e)
    Par défaut
    test ça
    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
    Sub test()
    strFilename = "C:\RepTest" 'Repertoire du fichier
    Set cnx = CreateObject("ADODB.Connection") 'Création de l'objet connexion
    ConnectionString = _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilename & _
                ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False" 'définition de la connexion
    cnx.Open ConnectionString 'ouverture de la connexion
    Sql = "Select frm.[RECORDID],frm.[STARTUNIXTIME],frm.[DATETIMEEND],frm.[HOLDDURATION],frm.[NBHOLD] from test.csv as frm " 'sélection des champs du fichier (Retenir que certaine colonnes!)
    Sql = Sql & "where frm.[RECORDID] not in('toto','titi') " 'exclusion de valeurs
    Sql = Sql & "order by  frm.[RECORDID] ;" 'Faire un trie alphabétique!
    Set rs = CreateObject("Adodb.recordset") 'création d'un objet pour le résultat de la requête
    rs.Open Sql, cnx 'exécution de la requête
    ActiveCell.CopyFromRecordset rs 'envoyer le résultat dans Excel!
    rs.Close
    cnx.Close
    Set rs = Nothing
    Set cnx = Nothing
    End Sub

  13. #13
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    pour quelqu'un maitrisant la lecture d'un fichier texte (moins d'une heure est nécessaire pour boucler le projet !),
    mieux vaut effectivement le traiter en mémoire.

    Sinon, je suis de l'avis de Loïc, mieux vaut ne pas perdre de temps, laisser Excel charger la totalité du fichier
    puis supprimer les colonnes inutiles et, via l'Enregistreur de macros, une base de code est livrée sur un plateau !

    Utiliser un éditeur de fichier capable d'afficher en hexadécimal / décimal les caractères est un plus
    afin de vérifier la structure du fichier, séparateurs et caractères spéciaux …

    Pour rappel, un fichier csv a pour séparateur soit la virgule soit le point-virgule …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Bon, j'ai comparé avec un autre fichier CSV (avec celui la, ca fonctionne bien u_u") et grace à notepad++ et son affichage des symbols , j'ai constater que sur l'un (celui qui marche), j'ai CR LF comme symbol en fin de ligne alors que sur l'autre je n'ai que LF.

    Du coup j'essaie de remplacer les LF par des CR LF

    Edit : je n'avais pas vu les deux messages précedents.
    Je vais tester la solution de rdurupt, merci

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Rebonjour,

    J'essaye d'utiliser la solution proposée par rdurupt mais je bloque sur une erreur : "Aucune valeur donnée pour un ou plusieurs des paramètres requis (erreur d’exécution '-2147217904(80040e10)'" qui apparait ligne 11
    Voici le code de la fonction (que j'ai un peu adaptée à mes besoins)

    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
     
    Private Function fillSheet(path As String) 'path est sous la forme "c:\user\directory\cdr_yyyymmdd.csv"
    Set cnx = CreateObject("ADODB.Connection") 'Création de l'objet connexion
    ConnectionString = _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Left(path, Len(path) - 16) & _
                ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False" 'définition de la connexion
    cnx.Open ConnectionString 'ouverture de la connexion
    Sql = "Select frm.[RECORDID],frm.[STARTUNIXTIME],frm.[DATETIMEEND],frm.[HOLDDURATION],frm.[NBHOLD] from " & Right(path, 16) & " as frm " 'sélection des champs du fichier (Retenir que certaine colonnes!)
    Sql = Sql & "order by  frm.[RECORDID] ;" 'Faire un trie alphabétique!
    Set rs = CreateObject("Adodb.recordset") 'création d'un objet pour le résultat de la requête
    rs.Open Sql, cnx 'exécution de la requête
    ActiveCell.CopyFromRecordset rs 'envoyer le résultat dans Excel!
    rs.Close
    cnx.Close
    Set rs = Nothing
    Set cnx = Nothing
    End Function
    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(path, Len(path) - 16)
    et ? Car dans le premier cas, je veux récuperer le chemin d'accès du repertoire du fichier concerné (et le fichier, avec l'extension fait au total 16 caractères. Dans le deuxieme cas, je ne veux récuperer que le fichier (avec son extension).

    Je pense que cette erreur provient de l'underscore présent dans le nom du fichier (j'ai essayé de l'échappé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "cdr[_]" & Right(path, 12)
    mais ca n'a pas fonctionné.
    Edit : cela ne provient pas de l'underscore...

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    grmbl...

    J'ai testé avec une simple requête "select * from file.csv" et j'ai ainsi pu remarquer qu'il considère que je n'ai qu'une seule colonne dans mon csv (il ne me sort que la colonne RECORDID)
    J'en comprends donc que le FMT=Delimited(; ) n'est pas pris en compte

  17. #17
    Invité
    Invité(e)
    Par défaut
    quand je test sur un win Xp ça marche???
    Dernière modification par AlainTech ; 02/10/2014 à 22h06. Motif: Suppression de la citation inutile

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Je suis sous win8 et bah... ca marche pas

    Ca ne prends que la première colonne, ce qui est assez problématique.

    Juste au cas ou, voici la partie sql (dès fois que j'ai fait une connerie )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set cnx = CreateObject("ADODB.Connection") 'Création de l'objet connexion
        ConnectionString = _
                        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Left(path, Len(path) - 16) & _
                        ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False" 'définition de la connexion
        cnx.Open ConnectionString 'ouverture de la connexion
        Sql = "Select * from cdr_20140928.csv; "
        Set rs = CreateObject("Adodb.recordset") 'création d'un objet pour le résultat de la requête
        rs.Open Sql, cnx 'exécution de la requête

  19. #19
    Invité
    Invité(e)
    Par défaut
    non c'est bon; moi aussi je patauge; je donnes des idées et je me débine pas cool; en tous cas je cherches car ça m’intéresse également!

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Points : 173
    Points
    173
    Par défaut
    Trouvé !

    J'ai du rajouter une fonction me permettant de créer un fichier schema.ini.

    Voici la fonction en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub CreateSchema(path As String)
     
    Open Left(path, Len(path) - 16) & "schema.ini" For Output As #1
     
    Print #1, "[" & Right(path, 16) & "]"
    Print #1, "ColNameHeader = True" 'En choisissant False, le Titre des colonnes (RECORDID par exemple) seront consideré comme étant de simples données. Vous ne pourrez pas faire de test via les requêtes sql dessus donc.
    Print #1, "CharacterSet = ANSI"
    Print #1, "Format=Delimited(;)"
     
    Close #1
     
    End Sub
    Je sais pas trop pourquoi, mais grâce à ce fichier, il récupère bien toutes les colonnes.
    Me reste plus qu'à faire le tri

    Bon, en revanche ca doit pas être la solution la plus pertinente, ni la plus optimisée qui soit.

Discussions similaires

  1. Interompre boucle while not EOF(F)
    Par sp2308 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2009, 23h28
  2. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  5. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00

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