XL 2016 Séparation colonne avec condition

Divinity Taxoun

XLDnaute Nouveau
Bonjour à tous,

Je viens vous concernant une problématique que je rencontre dans le cadre du travail...

J'ai un export Eplan (Logiciel DAO) avec des milliers de lignes que je souhaite éclater pour chaque "," (virgule) présent dans la cellule.
Exemple :

Colonne A :
AZER,TY,DOMINGO,ZE
donnera :
AZER (Colonne B)
TY (Colonne C)
DOMINGO (Colonne D)
ZE (Colonne E)

J'ai réussi cette opération grâce à des recherches et une adaptation à mon problème :
1603986768430.png


Mon nouveau problème ? Je ne souhaite pas séparer les valeurs comprises entre guillemet ""
Exemple :
1,6,194,1,SE.A9F74301,0,1 A9F74301,A9F74301,"en_US@Miniature circuit breaker iC60N, 3P, 1A, C;de_DE@Leitungsschutzschalter iC60N, 3P, 1A, C;fr_FR@Disjoncteurs iC60N, 3P, 1A, C;",SE,SE,A9F74301,,,,,,0.375,54,85,78.5,$(MD_MACROS)\Schneider Electric\ACTI9\IC60\SE_ACTI9_IC60_3POLE_3D.ema,0,,0,0,15,15,0,0,,SE.ACTI9_IC60_3POLE,,

Je n'arrive pas à rajouter la condition (Si la cellule contient des guillemets, alors tu ne sépares pas son contenu, sinon tu sépares tout).

Je ne sais pas si je suis très claire. J'ai vraiment besoin d'aide car je galère...
Si vous avez des pistes pour m'aider, je suis preneur :)

Merci pour votre lecture !
Et bonne journée :)

Antoine
 
Solution
Bonjour,

Si tu n'y arrives pas, essaie :

VB:
Sub test1()
  Dim C As Range, Item As Variant, I As Long, X As Variant, Teste As Boolean
  For Each C In Range("A1", Cells(Rows.Count, 1).End(xlUp))
    I = 1
    Teste = False
    C.Replace """", """|"
    For Each Item In Split(C, """")
      If Teste = True Then
        Item = Right(Item, Len(Item) - 1)
        Teste = False
      End If
      If Left(Item, 1) <> "|" Then
        For Each X In Split(Item, ",")
          I = I + 1
          Cells(C.Row, I) = X
        Next X
      Else
        I = I + 1
        Cells(C.Row, I) = Right(Item, Len(Item) - 1)
        Teste = True
      End If
    Next Item
    C.Replace "|", ""
  Next C
End Sub

Daniel

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Testez :
Code:
    If Asc(Left(Cells(i + 1, 1), 1)) <> 34 Then ' 34 est le code de "
        MesMorceaux = Split(Cells(i + 1, 1), Separateur)
        Cells(i + 1, 2).Resize(1, UBound(MesMorceaux) + 1).Value = MesMorceaux
    End If
J'ai préféré utilisé le code de " plutôt que le caractère car c'est toujours un peu pointilleux d'utiliser """.
En fait je prends le code du premier caractère à gauche. S'il est différent de " alors on split.
 

danielco

XLDnaute Accro
Bonjour,
Essaie :
VB:
Sub test1()
  Dim C As Range, Item As Variant, I As Long, X As Variant
  For Each C In Range("A1", Cells(Rows.Count, 1).End(xlUp))
    I = 1
    Tabl = Split(C, """")
    C.Replace """", """|"
    For Each Item In Split(C, """")
      If Left(Item, 1) <> "|" Then
        For Each X In Split(Item, ",")
          I = I + 1
          Cells(C.Row, I) = X
        Next X
      Else
        I = I + 1
        Cells(C.Row, I) = Item
      End If
    Next Item
    C.Replace "|", ""
  Next C
End Sub
Note que le texte ne doit pas contenir de pipes (|). Si c'était le cas, il faudrait modifier la macro.

Cordialement.

Daniel
 

Divinity Taxoun

XLDnaute Nouveau
Bonjour, merci pour vos réponses à tous les deux :)

Sylvanu, dans votre cas, la première ligne de code m'entraine un blocage "Argument ou appel de procédure incorrecte". Je l'ai pourtant bien intégré dans ma macro...

Danielco, merci pour votre retour également !
Le code fonctionne à merveille sauf sur le texte après les guillemets
Exemple :
Azer,ty"18,25,30"Help,me,please
La partie en gras n'aura aucune décomposition .

Je vais tenter d'affiner le code par moi même et éviter de vous déranger plus :)
Merci pour toute l'aide apportée !
 

danielco

XLDnaute Accro
Bonjour,

Si tu n'y arrives pas, essaie :

VB:
Sub test1()
  Dim C As Range, Item As Variant, I As Long, X As Variant, Teste As Boolean
  For Each C In Range("A1", Cells(Rows.Count, 1).End(xlUp))
    I = 1
    Teste = False
    C.Replace """", """|"
    For Each Item In Split(C, """")
      If Teste = True Then
        Item = Right(Item, Len(Item) - 1)
        Teste = False
      End If
      If Left(Item, 1) <> "|" Then
        For Each X In Split(Item, ",")
          I = I + 1
          Cells(C.Row, I) = X
        Next X
      Else
        I = I + 1
        Cells(C.Row, I) = Right(Item, Len(Item) - 1)
        Teste = True
      End If
    Next Item
    C.Replace "|", ""
  Next C
End Sub

Daniel
 

Statistiques des forums

Discussions
312 299
Messages
2 086 989
Membres
103 420
dernier inscrit
abdel665