Conversion csv > xls avec plusieurs séparateurs

Bonjour tout le monde,

J'extrais un fichier .csv d'une base de données et j'ai besoin de convertir le résultat qui m'est donné en deux colonnes.

Dans la première colonne je voudrai les références des produits (X5620 par exemple) et dans la deuxième la valeur numérique qui leur est attribuée. En temps normal la fonction "Convertir" d'excel permet tout à fait de répondre à mes besoins mais là un petit problème me gêne.

En effet il arrive qu'il s'agisse d'une combinaison de produits à laquelle on attribue une valeur, et les références de produits sont séparées par des virgules, c'est là que réside tout mon problème.

Lorsqu'il y a plusieurs références de produits je me retrouve donc avec XM562,S5621,28 par exemple et lorsque j'utilise "Convertir" le résultat apparaît sous 3 colonnes distinctes puisque le séparateur est la virgule.

Ma question est la suivante : Est-il possible de ne séparer du reste que la valeur numérique (28 dans l'exemple) qui se retrouverait en colonne 2 et d'avoir, en colonne 1 "XM562,S5621" ?

Merci beaucoup par avance pour l'aide que vous serez susceptible de m'apporter.

Je joins le fichier en .csv que je traite

47fichier-exemple.zip (30.56 Ko)

Les lignes qui posent problèmes sont situées aux alentours de 5-6000 me semble-t-il.

Bonjour,

Avec une petite macro qui replace la dernière , par un ; pour séparer dessus :

Sub convert()
    Dim datas, lig As Long, p As Long
    datas = Range([A1], [A1].End(xlDown)).Value
    For lig = 1 To UBound(datas)
        p = InStrRev(datas(lig, 1), ",")
        If p > 0 Then datas(lig, 1) = Left(datas(lig, 1), p - 1) & ";" & Mid(datas(lig, 1), p + 1)
    Next lig
    [A:A].NumberFormat = "@"
    [A1].Resize(UBound(datas), 1) = datas
    [A:A].TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, semicolon:=True
End Sub

eric

Bonjour le fil, bonjour le forum,

Une autre proposition avec le code ci-dessous :

Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim I As Integer 'déclare la variable I (Incrément)
Dim V As Integer 'déclare la variable V (nombre de Virgules)
Dim J As Byte 'déclare la variable J (incrément)
Dim A As String 'déclare la variable A (valeur colonne A)

Set O = Sheets("Fichier exemple") 'définit l'onglet O (à adapter)
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
Set PL = PL.Resize(PL.Rows.Count, 2) 'redéfinit la plage PL (en rajoutant une colonne)
TC = PL 'définit le tableau de cellules TC
For I = 1 To UBound(TC, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC
    V = UBound(Split(TC(I, 1), ",")) 'définit le nombre de virgules V dans la valeur ligne I colonne 1 de TC
    If V = 1 Then 'condition : si V est égale à 1
        'définit la valeur ligne I colonne 2 de TC (la partie après la virgule)
        'définit la valeur ligne I colonne 1 de TC (la partie avant la virgule)
        TC(I, 2) = Split(TC(I, 1), ",")(1): TC(I, 1) = Split(TC(I, 1), ",")(0)
    Else 'sinon
        'définit la valeur ligne I colonne 2 de TC (la partie après la dernière virgule)
        TC(I, 2) = Split(TC(I, 1), ",")(V)
        For J = 0 To V - 1 'boucle 2 : sur le nombre de virgules moins un
            'définit la variable A : si A est vide la partie avant la virgule J,
            'sinon, A suivi d'une virgule suivi de la partie avant la virgule J
            A = IIf(A = "", Split(TC(I, 1), ",")(J), A & "," & Split(TC(I, 1), ",")(J))
        Next J 'prochaine virgule de la boucle 2
        TC(I, 1) = A 'renvoie A dans la ligne I colonne 1 de TC
        A = "" 'réinitialise A
    End If 'fin de la condition
Next I 'prochaine ligne d ela boucle 1
'renvoie le tabelau TC dans la celllue C1
O.Range("C1").Resize(UBound(TC, 1), UBound(TC, 2)).Value = TC
With O.Columns("C:D") 'mise en forme des colonne C et D
    .AutoFit
    .HorizontalAlignment = xlLeft
End With
End Sub

Éric ! Pourquoi faire si simple quand on peut faire si compliqué...

Plus sérieusement, il y a un souci ligne 6967 que je ne comprends pas...

Ah oui, c'est marrant J'refais un coup tiens

Bon, on peut s'en débarrasser en mettant la colonne en texte avant mais ça n'explique pas comment il peut convertir

"458899,457887,469408,469394,477328"

en

4.58899457887469E+29

ma seule explication c'est qu'il devient presbyte avec l'age et ne voit plus les virgules, mais j'suis pas sûr.

Tu en as un autre en 7408

C'est fâcheux ça, va falloir s'en rappeler...

eric

edit: j'ai essayé avec différentes chaines avec un nombre aléatoire de virgules et de tailles de nombres.

En fait dès qu'il y a plus de 3 chiffres consécutifs après la 1ère virgule il ne la (les) voit plus et converti en numérique (en multipliant par 10^x, il les vire quoi). Quelque soit le séparateur décimal système ou excel.

Bonjour tout le monde,

Tout d'abord merci beaucoup pour vos réponses et désolé de ne réagir que si tard. Eric ta proposition me convient parfaitement ! Je n'ai même pas d'erreurs aux endroits que vous avez signalé !

Encore une fois merci, vous m'avez fait gagner un temps considérable !!

Bonjour,

Oui, c'est le code de Tautheme qui fait sa mauvaise tête à un endroit (le code, pas thautheme).

eric

Rechercher des sujets similaires à "conversion csv xls separateurs"