Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Conversion des données séparées par ; en ligne

  • Initiateur de la discussion Initiateur de la discussion shmider
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

shmider

XLDnaute Occasionnel
Bonjour tou le monde;

Voilà je souhaiterai mettre en ligne (la conversion par excel permet de le mettre en colonne) des données séparées par ;

En effet, dans l'option excel>données>convertir on peut mettre ces données en colonne.

Cf. fichier joint pour exemple.

Merci de votre aide et bonne journée à toutes et tous !!!
 

Pièces jointes

Re : Conversion des données séparées par ; en ligne

Bonjour,

Cela doit être faisable par formules.
Je suppose aussi que D18 doit être 16-sept (et non 17-sept).

Si tu ne reçois pas proposition par macros, je regarde pour te trouver une solution par formules.
 
Re : Conversion des données séparées par ; en ligne

bonjour shminder, hoerwind,

voici une macro qui a l'air de fonctionner, du mois pour cet exemple (2 valeurs par cellule) :
Code:
Sub test()
Dim i As Integer, j As Integer, strMem As String, lineAdded As Boolean, tabStr() As String
With ThisWorkbook.Sheets("test")
    For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
        lineAdded = False
        For j = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column
            strMem = .Cells(i, j).Text
            If InStr(strMem, ";") > 0 Then
                If Not lineAdded Then .Rows(i + 1).Insert: lineAdded = True
                tabStr = Split(strMem, ";")
                .Cells(i, j) = tabStr(LBound(tabStr))
                If lineAdded Then .Cells(i + 1, j) = tabStr(UBound(tabStr))
            Else
                If lineAdded Then .Cells(i + 1, j) = strMem
            End If
        Next j
    Next i
End With
End Sub

a+
 
Re : Conversion des données séparées par ; en ligne

Re-Bonjour,

En fait lorsque j'utilise la macro dans mon fichier voilà ce que j'obtient.






 

Pièces jointes

Re : Conversion des données séparées par ; en ligne

re bonjour shminder, hoerwind,

en fait, il me faudrait quelques précision pour l'adapter à ton fichier final,
sur le fichier de ton premier post, il y avait de données conccaténées dur les colonnes A et/ou B :
- quelles sont ces colonnes sur ton fichier final ? (A et B j'imagine)
- est-ce qu'il n'y a que ces colonnes ?
- est-ce qu'il peut y avoir plus de 2 données concaténées ?

a+
 
Re : Conversion des données séparées par ; en ligne

Re-Bonjour mromain ,

Penses tu que le code que tu ma transmis un peu en haut peut il etre adopter à mon fichier final dans le cas ou je rajoute des lignes et des colonnes? et il normal que la macro ne marche pas avec mon fichier lorsque j'utilise ?

@+
 
Re : Conversion des données séparées par ; en ligne


re bonjour shminder, hoerwind,

as-tu lu mon post de 14h13 ?

a+
 
Re : Conversion des données séparées par ; en ligne

Désolé j'avais pas mis F5 !!

voilà mon fichier avec toutes les données concaténées.

en ce moment j'essai d'adopter ton code.

RQ: j'ai en tout 860 lignes en fait.

@+ mromain😉



re bonjour shminder, hoerwind,

as-tu lu mon post de 14h13 ?

a+
 

Pièces jointes

Re : Conversion des données séparées par ; en ligne

re bonjour shminder, hoerwind,

si tu as "S09 900427;S09 900671" en colonne A et "167036;167037" en colonne B, est-ce qu'au final il te faut les 4 combinaisons ou 2 lignes :
"S09 900427" en A et "167036" en B
et
"S09 900671" en A et "167037" en B

en considérant que tu veux les 4 combinaisons, essaye cette macro :
Code:
Sub convertir()
Dim i As Integer, j As Integer, k As Integer, decalage As Integer, strMem As String, lineAdded As Boolean, tabColA() As String, tabColB() As String
With ThisWorkbook.Sheets("Feuil1")
    For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
        tabColA = Split(.Range("A" & i).Text, ";")
        tabColB = Split(.Range("B" & i).Text, ";")
        For j = 1 To (UBound(tabColA) - LBound(tabColA) + 1) * (UBound(tabColB) - LBound(tabColB) + 1) - 1
            .Rows(i + 1).Insert
            .Rows(i).Copy .Rows(i + 1)
        Next j
        decalage = 0
        For j = LBound(tabColA) To UBound(tabColA)
            For k = LBound(tabColB) To UBound(tabColB)
                .Range("A" & i).Offset(decalage, 0).Value = tabColA(j)
                .Range("B" & i).Offset(decalage, 0).Value = tabColB(k)
                decalage = decalage + 1
            Next k
        Next j
    Next i
End With
End Sub
a+
 

Pièces jointes

Dernière édition:
Re : Conversion des données séparées par ; en ligne

re re re bonjour,


tu peux rajouter
Code:
Application.ScreenUpdating = False
en début de macro, et
Code:
Application.ScreenUpdating = True
en fin de macro.

elle ira beaucoup plus vite.

a+
 
Re : Conversion des données séparées par ; en ligne

Salut,

Oui tout à fait, ça serai l'idéal pour moi.

Je teste la macro et je te tien au courant. Merci à vous et à toute à l'heure. 😉


 
Re : Conversion des données séparées par ; en ligne

Re-Bonjour^5 mromain, 😉

Je viens de tester la macro ça l'air de marché, sauf qu'en colonne AL et AM les données restent concaténées !!

est ce que tu pourrais me dire comment faire pour modifier la macro de façon de rémédier ce problème?

En fait, j'aimerai apprendre comment modifer cette macro de façon à ce que je puisse l'adopter à d'autres fichiers...

@+ et MERCIIIII Beaucoupppp 😉
 
Re : Conversion des données séparées par ; en ligne

re-bonjour,

voici la macro modifiée.
je l'ai commentée au maximum pour que tu puisse rajouter des colonnes à "splitter"

Code:
Sub convertir()
Dim i As Integer, j As Integer, decalage As Integer, strMem As String, lineAdded As Boolean

'déclarer autant de tableau que de colonne contenant des valeurs concaténées
Dim tabColA() As String, tabColB() As String, tabColAL() As String, tabColAM() As String
'déclarer autant de variable que de colonne contenant des valeurs concaténées
Dim iA As Integer, iB As Integer, iAL As Integer, iAM As Integer


'masquer l'affichage
Application.ScreenUpdating = False

With ThisWorkbook.Sheets("Feuil1")

    'ce "For" permet de boucler sur ligne de la feuille "Feuil1" (de 13 à 2 dans cet exemple)
    For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
    
        'récupérer dans les tableaux "tabColX" les items de la colonne "X" de la ligne i
        '(c'est ici qu'on sépare les items séparés par un ";")
        tabColA = Split(.Range("A" & i).Text, ";")
        tabColB = Split(.Range("B" & i).Text, ";")
        tabColAL = Split(.Range("A" & i).Text, ";")
        tabColAM = Split(.Range("A" & i).Text, ";")
        
        'INSERER LES NOUVELLES LIGNES
        'cette bouclepermet de calculer le nombre de ligne à insérer en fonction des différentes combinaisons
        For j = 1 To _
            (UBound(tabColA) - LBound(tabColA) + 1) * _
            (UBound(tabColB) - LBound(tabColB) + 1) * _
            (UBound(tabColAL) - LBound(tabColAL) + 1) * _
            (UBound(tabColAM) - LBound(tabColAM) + 1) - 1
            'insérer une ligne après la ligne i
            .Rows(i + 1).Insert
            'copier les valeur de la ligne i (dans la ligne insérée)
            .Rows(i).Copy .Rows(i + 1)
        Next j
        
        'MODIFIER LES COLONNES "A COMBINAISON"
        'initialiser la variable "decalage"
        decalage = 0
        'boucler sur chaque combinaison posible
        For iA = LBound(tabColA) To UBound(tabColA)
            For iB = LBound(tabColB) To UBound(tabColB)
                For iAL = LBound(tabColA) To UBound(tabColA)
                    For iAM = LBound(tabColB) To UBound(tabColB)
                        'inscrire les différentes combinaisons sur la ligne    "i" + "decalage"
                        .Range("A" & i).Offset(decalage, 0).Value = tabColA(iA)
                        .Range("B" & i).Offset(decalage, 0).Value = tabColB(iB)
                        .Range("AL" & i).Offset(decalage, 0).Value = tabColAL(iB)
                        .Range("AM" & i).Offset(decalage, 0).Value = tabColAM(iB)
                        'incrémenter la variable "decalage"
                        decalage = decalage + 1
                    Next iAM
                Next iAL
            Next iB
        Next iA
        
    'passer à l'autre ligne (de la feuille ("Feuil1")
    Next i
End With

'raffraichir l'affichage
Application.ScreenUpdating = True

End Sub

a+
 
Re : Conversion des données séparées par ; en ligne

Re bonjour,

J'ai testé en essayant d'adopter la macro à mon fichier, et j'obtient (cf. .xls joint).

Cependant, j'ai deux soucis, le premier reside dans le fais qu'il y a des données qui restent concaténées (cf. cellule AL6). Le second, réside dans une erreur de compilation (la boucle for n'étant pas initialisée) !! pourtant j'ai bien fermé par le next !!!

@+ et merci encore 😉
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…