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 :

Formatage fichier csv:virgule comme séparateur et séparateur des milliers (Montants)


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut Formatage fichier csv:virgule comme séparateur et séparateur des milliers (Montants)
    Bonjour à tous,

    Je travaille actuellement sur un fichier excel donnant les résultats d'un traitement batch en format CSV,qu'il faut que je puisse lire et formater dans un format précis.

    Le problème est que le séparateur est une virgule, utilisée aussi dans les montants au format: #,### ...

    Pour mieux comprendre, voici un lien vers le fichier sur lequel je bosse:
    Fichier - Formatage batch

    La première feuille regroupe les données sources.
    Les données sont séparées par la virgule. Les montants sont entre guillemets.

    La deuxième feuille donne le format attendu en sortie. Les lignes sont regroupées par batch ID (ex: FT104) et on a toujours Currency:AED Input By:bsui04 Authorized By: bsui03 en 1ère ligne.

    J'ai trouvé sur le forum des moulinettes pour parcourir le fichier mais le problème majeur se situe au niveau du séparateur utilisé aussi pour le séparateur des milliers dans les montants...

    Quelqu'un pourrait-il m'aider?
    Merci d'avance!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    La seule solution que je vois, c'est pour chaque ligne de "scanner" chaque caractère, de remplacer les virgules par des points-virgule chaque fois qu'il en trouve une, sauf dans la partie comprise entre les guillemets.
    Exemple (à adapter) :

    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
     
        i = 1 ' i pointe la ligne en cours dans le classeur excel
     
        Open chemin & nomFich For Input As #1 'on ouvre le fichier CSV
     
        Do While Not EOF(1) 'on boucle dessus jusqu'à sa fin
     
            varGuillemets = False
            maChaine = ""
     
            Line Input #1, maLigne
     
            'recopie des caractères dans une autre variable, avec transformation de la virgule en point-virgule
            For a = 1 To Len(maLigne) 'on "scanne" tous les caractères de la ligne :
     
                If Mid(maLigne, a, 1) = Chr(34) Then 'si le caractère est un guillemet (code ascii 34) :
     
                    If varGuillemets = False Then varGuillemets = True 'si on entre dans les guillemets
                    Else: varGuillemets = False 'si on sort des guillemets
     
                    maChaine = maChaine & Chr(34)
     
                ElseIf Mid(maLigne, a, 1) = "," Then 'si le caractère est une virgule :
     
                    If varGuillemets = False Then 'la virgule n'est pas entre les guillemets
                        maChaine = maChaine & ";" 'on remplace la virgule par un point-virgule
                    Else ' la virgule est entre les guillemets
                        maChaine = maChaine & "," 'dans ce cas on laisse la virgule
                    End If
     
                Else 'autres caractères :
     
                    maChaine = maChaine & Mid(maLigne, a, 1)
     
                End If
     
            Next a
     
            'on splite en x champs selon les ";" et on met dans un tableau
            tabString = Split(maChaine, ";")
     
            For a = 0 To UBound(tabString)
                Cells(i, a + 1) = tabString(a)
            Next a
            i = i + 1
        Loop
     
        Close #1
    (pas testé )

  3. #3
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    tu peux aussi modifier les délimiteurs en lisant ton fichier .CSV en un bloc, comme expliqué ici

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par Godzestla Voir le message
    tu peux aussi modifier les délimiteurs [...]
    Mais comment fais-tu ça ? Je ne vois pas ce point dans le fil en question.
    Ce serait l'idéal, c'est sûr.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup Neupont pour ton idée et pour ton code.
    Je vais le tester pour mon fichier de suite

    Par contre, Godzestla, je ne suis pas sûr d'avoir compris l'idée de lecture d'un bloc. J'ai lu le sujet auquel tu renvoies mais je n'ai pas saisi. Comment ferais-tu?

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    Tu peux aussi modifier l'extension en ".txt", ce qui te permettra de choisir la virgule en séparateur et tes montants étant entre guillemets ne seront pas affectés.

    Ca ne devrait pas non plus endommager ton fichier.

  7. #7
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Citation Envoyé par neupont Voir le message
    Mais comment fais-tu ça ? Je ne vois pas ce point dans le fil en question.
    Ce serait l'idéal, c'est sûr.
    Bonjour,

    l'explication de ce fil est relative à la lecture du fichier en 1 bloc, pas à la modif des délimiteurs.
    Désolé pour l'ambiguité de ma réponse.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Bonjour et merci à tous pour vos réponses!

    Finalement j'ai adapté le code que Neupont m'a donné:

    Outil pour le formatage
    La Source en CSV à formater

    par contre le problème subsiste avec les montants.
    A chaque virgule les montants, les chaines de caractères sont séparées...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Eh oui bien sûr : sur ton csv il s'avère que chaque ligne commence par des guillemets, ce qui fausse évidemment la logique du traitement...
    Bon je regarde ça...

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Oui en effet lorsqu'on ouvre le fichier depuis le lien cjoint.com
    on a, par exemple:

    "FT104,National Bank of Abu Dhabi,""19,000,659.72"",bsui04,26/11/2008,BSUI/,Completed"

    Alors que si j'ouvre le fichier depuis mon pc j'obtiens pour la même ligne:
    FT104,National Bank of Abu Dhabi,"19,000,659.72",bsui04,26/11/2008,BSUI/,Completed
    Je ne comprends pas ce qu'il se passe lors du transfert sur cjoint...

    Je pense qu'il vaut mieux partir sur la deuxième forme (La feuille où il y a les données s'appelle source dans l'outil)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par jeo13 Voir le message
    Alors que si j'ouvre le fichier depuis mon pc j'obtiens pour la même ligne:
    Depuis ton PC, tu l'ouvres avec Excel ou avec le notepad (bloc notes) ?
    Ouvre-le avec le notepad pour être sûr de la présence ou non des guillemets, c'est primordial d'être sûr dans ton cas.

  12. #12
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Le fichier .csv je l'avais ouvert avec Excel.

    Avec Notepad, oui il y a bien les guillemets:

    "FT104,National Bank of Abu Dhabi,""19,000,659.72"",bsui04,26/11/2008,BSUI/,Completed"

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par jeo13 Voir le message
    Avec Notepad, oui il y a bien les guillemets:
    OK, donc c'est qu'ils y sont.
    Ceci a l'air de marcher chez moi, j'ai fait une adaptation rapide :

    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
        Open fichier For Input As #1
     
        Do While Not EOF(1) 'on boucle dessus jusqu'à sa fin
     
            varGuillemets = False
            maChaine = ""
     
            Line Input #1, maLigne
     
            'on remplace les doubles guillemets par un "!" qui servira à repérer le champ au format nombres
            maLigne = Replace(maLigne, Chr(34) & Chr(34), "!", , , vbTextCompare)
     
            'on supprime les guillemets restants
            maLigne = Replace(maLigne, Chr(34), "", , , vbTextCompare)
     
            'recopie des caractères dans une autre variable, avec transformation de la virgule en point-virgule
            For a = 1 To Len(maLigne) 'on "scanne" tous les caractères de la ligne :
     
                If Mid(maLigne, a, 1) = "!" Then 'si le caractère est un point d'exclamation
     
                    If varGuillemets = False Then
                        varGuillemets = True 'si on entre dans les "!"
                    Else
                        varGuillemets = False 'si on sort des "!"
                    End If
     
                    'maChaine = maChaine & Chr(34)
     
                ElseIf Mid(maLigne, a, 1) = "," Then 'si le caractère est une virgule :
     
                    If varGuillemets = False Then 'la virgule n'est pas entre les guillemets
                        maChaine = maChaine & ";" 'on remplace la virgule par un point-virgule
                    Else ' la virgule est entre les guillemets
                        maChaine = maChaine & "," 'dans ce cas on laisse la virgule
                    End If
     
                Else 'autres caractères :
     
                    maChaine = maChaine & Mid(maLigne, a, 1)
     
                End If
     
            Next a
     
            'on splite en x champs selon les ";" et on met dans un tableau
            tabString = Split(maChaine, ";")
     
            For a = 0 To UBound(tabString)
                Cells(i, a + 1) = tabString(a)
            Next a
            i = i + 1
        Loop
     
        Close #1
    Ceci dit, chez moi Excel vire les virgules en colonne C pour changer le séparateur de milliers. Si tu veux absolument garder les virgules comme séparateur de milliers, il faut changer le format de la colonne C soit en texte (auquel cas il ne touche pas à ce qu'on lui envoit), soit en un format numérique spécifique où le séparateur de milliers est spécifié comme étant la virgule.

  14. #14
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Yes merci beaucoup c'est parfait!
    ça ira comme ça, je te remercie beaucoup pour ton aide!

    En espérant que ça puisse servir à d'autres personnes dans le même cas aussi

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2013, 18h25
  2. Réponses: 18
    Dernier message: 24/06/2011, 15h13
  3. [VBA-E] Création Fichier csv (séparateur Virgule)
    Par dev_php51 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/07/2008, 11h39
  4. Importer un fichier csv (séparateur virgule) dans un classeur excel 2003
    Par Valérie32 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/06/2008, 21h44
  5. Import fichier csv dans access (séparateur décimal = virgule)
    Par Averroes dans le forum Modélisation
    Réponses: 16
    Dernier message: 16/09/2007, 11h25

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