Fonction conversion de données / séparateur

Bonjour à tous,

J'ai un fichier xls comportant plusieurs données dans une même cellule.

Chaque information comporte un séparateur de type $ suivi d'une lettre. Exemple : $a [texte] ; $b [texte] ; $c [texte]

J'utilise donc la fonction "convertir" en utilisant le séparateur "$"

Mon but : Chaque $ avec sa lettre doit aller dans une colonne précise ($a en colonne A; $b en colonne B etc.)

Mon problème : Si un $b manque, excel va donc déplacer le $c dans la colonne B, au lieu de mettre l’information en C.

Voir mon fichier en PJ pour plus de clarté.

Merci d'avance pour votre aide !

Et bonne fin de journée à tous.

32conversion.xlsx (9.87 Ko)

Bonjour,

à tester,

Sub test()
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    v = Split(Cells(i, 1), "$")
    For j = LBound(v) To UBound(v)
        If Left(v(j), 1) <> "" Then
            x = Cells(1, Left(v(j), 1)).Column + 1
            Cells(i, x) = v(j)
        End If
    Next j
Next i
End Sub

Bonjour,

Merci pour le retour.

Je suis désolé mais je ne maitrise pas ce format.

N'y a t-il pas une solution plus simple ?

Bonjour,

J'ai mis la macro sur le module1 du fichier

et ajouter un bouton pour exécuter cette macro.

voir l'explication sur le fichier.

113mguen-conversion.xlsm (75.95 Ko)

Merci pour votre temps.

Cela fonctionne en effet très bien. Dans ce fichier.

J'essaie de transposer les informations dans une autre fichier où les colonnes ne sont pas placées au même endroit que l'exemple, où le nombre de [$] est plus important. Je tente donc un décryptage du code VBA, sans grand succès, afin de pouvoir l'adapter dans un autre cas.

Pouvez-vous m'indiquer une relecture des lignes afin de pouvoir transposer le code sur un autre fichier ? Que veut dire "for i" et "for j" ?

Désolé de vous embêter, c'était l'objet de ma première remarque sur ma non-connaissance de VBA et le désir de passer par une solution n'utilisant pas VBA.

Sub test()

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

v = Split(Cells(i, 1), "$")

For j = LBound(v) To UBound(v)

If Left(v(j), 1) <> "" Then

x = Cells(1, Left(v(j), 1)).Column + 1

Cells(i, x) = v(j)

End If

Next j

Next i

End Sub

Pour reprendre mon exemple, n'y a t-il pas une formule (n'utilisant pas VBA) qui permet de :

copier tous les caractères après $a et AVANT $b dans la colonne A;

copier tous les caractères après $b et AVANT $c dans la colonne B;

etc.

Mon exemple est toujours ces informations, contenues dans une unique cellule :

$a Paris $b Guérin $c 2018

Merci et bonne fin de journée.

re,

voilà, dit moi si il a une modification à faire,

Sub test()
'boucle de la ligne 1 à la dernière ligne renseignée de la colonne A
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row

    'séparer la chaine de caratère en segment par le caractère $
    'la variable v représente le tableau des segments
    v = Split(Cells(i, 1), "$")

    'boucle sur le tableau v
    For j = LBound(v) To UBound(v)

      ' v(j) contient le texte du segment
      'test si le premier caractère est différent d'une chaine vide
      'ici on pourrais faire une modification si les colonnes vont au delà de "Z"
        If Left(v(j), 1) <> "" Then

            'x sera égal au numéro de la colonne
            x = Cells(1, Left(v(j), 1)).Column + 1

            'on mets la valeur du segment dans la cellule
            Cells(i, x) = v(j)
        End If
    Next j
Next i
End Sub

Merci beaucoup.

Déjà, pour reprendre l'exemple de ton premier message, comprenant la macro, c'était

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row (les infos à séparer étaient en colonne A)

Dans ton dernier message, tu m'indiques : "'boucle de la ligne 1 à la dernière ligne renseignée de la colonne A

For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row"

Mon fichier actuel comporte les éléments à séparer en colonne B, j'ai donc changé par :

For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row

Avant d'aller plus loin, c'est bon ou pas ?

re,

voilà, dit moi si il a une modification à faire,

Sub test()
'boucle de la ligne 1 à la dernière ligne renseignée de la colonne A
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row

    'séparer la chaine de caratère en segment par le caractère $
    'la variable v représente le tableau des segments
    v = Split(Cells(i, 1), "$")

    'boucle sur le tableau v
    For j = LBound(v) To UBound(v)

      ' v(j) contient le texte du segment
      'test si le premier caractère est différent d'une chaine vide
      'ici on pourrais faire une modification si les colonnes vont au delà de "Z"
        If Left(v(j), 1) <> "" Then

            'x sera égal au numéro de la colonne
            x = Cells(1, Left(v(j), 1)).Column + 1

            'on mets la valeur du segment dans la cellule
            Cells(i, x) = v(j)
        End If
    Next j
Next i
End Sub

Mon fichier actuel comporte les éléments à séparer en colonne B, j'ai donc changé par :

For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row

Avant d'aller plus loin, c'est bon ou pas ?

c'est bon !

alors après ça, si le texte en cellule B1 est $a blabla $b blabla

dans quel colonne veux-tu mettre ces 2 segments ?

Ouf ! c'est déjà ça

Pour l'instant quand je lance le code, une erreur apparaît :

sans titre

Pour répondre à ta question :

Si le texte en B1 est $a blabla $b blabla etc. alors je souhaite mettre $a en C1 ; $b en D1 $c en E1 etc.

Tout en souhaitant que si par exemple le $b est inexistant, ne pas mettre le $c a sa place.

J'espère être compréhensible.

Encore merci.

Pour répondre à ta question :

Si le texte en B1 est $a blabla $b blabla etc. alors je souhaite mettre $a en C1 ; $b en D1 $c en E1 etc.

Tout en souhaitant que si par exemple le $b est inexistant, ne pas mettre le $c a sa place.

il faudrait remplacer la ligne

 x = Cells(1, Left(v(j), 1)).Column + 1

par celle-ci

 x = Cells(1, Left(v(j), 1)).Column + 2

bonjour

une tentative par formule (mais c'est chaud)

20mguen.xlsx (9.96 Ko)

fonction matricielle

cordialement

re,

voici une modification si les colonnes vont au delà de "Z"

Bonjour,

Un grand merci pour vos réponses. Ce forum est vraiment formidable.

tulipe_4 ta technique marche, bien que très longue en effet.

i20100 merci pour la mise à jour. La commande s'effectue convenablement, il y a juste une erreur de générée si une cellule de ma colonne B ne contient rien, symbolisé par la valeur [-]

Erreur d'exécution "13" :

Incompatibilité de type

Je suis bien sûr tenté de faire un rechercher/remplacer, mais le problème est qu'il va également l'appliquer sur les noms de ville comme par exemple Saint-Brieuc, qui deviendra alors Saint Brieuc.

Une idée ?

Encore merci et bonne fin de journée

re,

correction

j'ai ajouté une condition Application.CountIf(Cells(i, "B"), "*$*") > 0

à tester,

Sub test()
'boucle de la ligne 1 à la dernière ligne renseignée de la colonne A
For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
 If Application.CountIf(Cells(i, "B"), "*$*") > 0 Then
    'séparer la chaine de caratère en segment par le caractère $
    'la variable v représente le tableau des segments
    v = Split(Cells(i, "B"), "$")

    'boucle sur le tableau v
    For j = LBound(v) To UBound(v)

      ' v(j) contient le texte du segment
      'test si le premier caractère est différent d'une chaine vide
      'ici on pourrais faire une modification si les colonnes vont au delà de "Z"
        If Left(v(j), 1) <> "" Then

            'x sera égal au numéro de la colonne après B
            col = Split(v(j), " ")(0)
            x = Cells(1, col).Column + 2

            'on mets la valeur du segment dans la cellule
            Cells(i, x) = v(j)
        End If
    Next j
 End If
Next i
End Sub

Merci beaucoup pour votre temps et patience !

Ca fonctionne parfaitement.

Je note le sujet en résolue.

Rechercher des sujets similaires à "fonction conversion donnees separateur"