Autres Séparer Numéro du texte dans 2 colonnes différentes

cp4

XLDnaute Barbatruc
Bonjour,:)

J'ai parcouru plein de discussions, mais j'avoue que je suis un peu perdu. Merci de me venir en aide pour un code VBA efficace.
J'ai récupéré une liste de chaînes TV/Radio (bouquet) en colonne A. Chaque cellule est constituée d'un numéro et du nom de la chaîne.
Je voudrais parcourir la colonne A pour mettre en colonne C le numéro et en colonne D le nom de la chaîne.
Le résultat escompté est sur la feuille1.
En vous remerciant par avance.

ps: je suis sous excel2007
 

Pièces jointes

  • Séparer numero et chaine.xlsm
    7.7 KB · Affichages: 23
Solution
En VBA le plus rapide est sans doute d'entrer les formules Excel dans les 2 colonnes C et D :
VB:
Sub Eclater1()
Application.ScreenUpdating = False
[C2].Resize(Rows.Count - 1, 2).Delete xlUp 'RAZ
With [A1].CurrentRegion
    If .Rows.Count = 1 Then Exit Sub
    With [C2].Resize(.Rows.Count - 1)
        .FormulaR1C1 = "=LEFT(RC1,FIND("" "",RC1)-1)"
        .Columns(2) = "=MID(RC1,LEN(RC[-1])+2,9^9)"
        .Resize(, 2).Borders.Weight = xlThin
    End With
End With
End Sub
Chez moi 0,19 seconde sur 60 000 lignes.

patricktoulon

XLDnaute Barbatruc
bonsoir le fil
VB:
Sub test()
    Dim I&, Chaine$
    For I = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        chaine = Cells(I, 1).Value
        If InStr(chaine, " ") > 0 Then'on prevois quand même le cas ou il n'y a pas d'espace
            Cells(I, "C").Resize(, 2) = Array(Trim(Mid(chaine, 1, InStr(1, chaine, " "))), Trim(Mid(chaine, InStr(1, chaine, " "))))
        Else
            Cells(I, "C") = chaine
        End If
    Next
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

???
Oui, mais n'avais-tu point déjà répondu...
Le découpage de la chaine se fait pour chaque espace :
.Cells(i, 3) = Split(.Cells(i, 1), " ")(0)
donc par exemple lorsque l'on découpe cette chaine :
cells(1,4) = "207 Science & Vie TV"
il y a 4 espaces
donc
207 : Split(.Cells(i, 1), " ")(0)
Science : Split(.Cells(i, 1), " ")(1)
& : Split(.Cells(i, 1), " ")(2)
Vie : Split(.Cells(i, 1), " ")(3)
TV : Split(.Cells(i, 1), " ")(4)
 

patricktoulon

XLDnaute Barbatruc
re
Laurent j'ajouterais que tu ne met aucune sécurité c'est le piège du "Split"

chaine = "Laurent 950"
msgbox split(chaine," ")(1)

chaine="Laurent950"
msgbox split(chaine," ")(1)

la méthode Instr gère éventuellement les lignes vides en lui même
tandis que le split(valeur," ") déclenchera une erreur des l'apel de l'item 0
Sub test3()
Chaine = ""
c = Split(Chaine, " ")
MsgBox c(0)
End Sub
 
Dernière édition:

laurent950

XLDnaute Accro
Re,
J'ai tous commenté !
VB:
Sub test()
    Dim t() As Variant, i As Integer, j As Integer
    ' Redimension du tableau 2 D
    ' Ligne du tableau de la premiére à la derniére avec
    ' 1 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 1).End(xlUp).Row, 1).Row - 1
    ' les colones / juste 2 colonne avec
    ' 1 To 2
    ReDim t(1 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 1).End(xlUp).Row, 1).Row - 1, 1 To 2)
    ' For Boucle sur toutes les lignes du tableau
    For i = LBound(t, 1) To UBound(t, 1)
    ' Découpe la chaine de caractaire de la cellule A2
    ' Stocke dans la case du tableau / Ligne (1 = i) colonne 2 pour t(i, 2)
    t(i, 2) = Split(ActiveSheet.Cells(i + 1, 1), " ")
        ' donc la case t(i, 2) contient le tableau split
        ' récupération de la premiére case se tableau = 1 (de la cellule A1 / "1 TF1")
        ' la valeur 1 se trouve dans un tableau qui lui même est dans un tableau
        ' t(i, 2) = cette case contient un tableau de 2 case / Case 0 = 1 et Case 1 = TF1
        ' Donc le tableau initial t à la case = t(i,1) qui est vide
        ' Ont stocke la valeur 1 dans cette case
        ' t(i,1) = 1 est est donc comme deviné le tableau de split dans la case du tableau ligne 1 colonne 2
        ' Voila la premiere case de notre tableau est remplis
        ' t(i,1) = "elle contient la valeur 1 à présent)
        t(i, 1) = t(i, 2)(0)
        ' Condition si le tableau générer avec le split contient plus de 2 cases !
            If UBound(t(i, 2)) > 2 Then
                ' Se cas est particulier car la chaine contient plusieurs espace est génére plusieur découpage
                ' exemple pour la cellule A4 soit la chaine "207 Science & Vie TV"
                ' le split va générer 5 case réspectivement / Case 0 puis 1 et 2 et 3 et 4 et 5
                ' Se tableau est ranger dans la case du tableau t soit ligne i = 3 de la colonne 2
                ' ********** L'astuce pour évité la boucle *********************
                ' t(i,3) précedement rempli contient 207
                ' donc je fait le découpage avec la chaine 207 qui est équivalent a t(i,3)
                ' le découpage de se tableau est obtenu avec 2 case donc avec se fameux découpage
                ' Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))
                ' Alors la case 0 de se tableau serat donc vide car avant 207 (Il n'y a rien) C'est le pivot
                ' est case 1 de l'autre coté de 207 il y a la chaine restante
                ' Donc je choisi la case 1 ont
                ' pour le reste de la chaine soit Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))(1)
                t(i, 2) = Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))(1)
                ' t(i, 2) = "voila la case du tableau t ligne " colone 2 contient la chaine "Science & Vie TV"
                ' donc idem j'écrase le tableau générer précedement avec le split qui a remplis cette case
                ' par la nouvelle valeur (chaine de caractaire décrite si dessus)
            Else
            ' Le tableau générer par le split cotient 2 case / La case 0 (pour une valeur) et la case 1 (pour une autres valeur)
            ' Alors dans cette case vu plus haut de se fameux tableau générer par le split qui est stocké dans la case
            ' du tableau t de la ligne i = 1 et de sa colone 2 pour t(i, 2)
            ' Donc la valeur de la case du tableau générer par le split qui a deux cases il est simple de récupérer la
            ' valeur de la deuxieme case soit la case 1 qui contient TF1
            ' J'écrase le tableau de split et je remplace par la la valeur de la case 2 du split / ont deviné la case 1
            ' t(i, 2)  = "Voila à présent la case de se tableau t donc ligne i = 1 de la colonne 1 contient a présent TF1"
                t(i, 2) = t(i, 2)(1)
            End If
    Next i
    ' Comme le tableau est remplis il ne reste plus cas le coller sur la feuille avec cette fonction
    ' choix de la cellule ou sera coller le tableau ici ActiveSheet.Cells(2, 3)  = Cellule C2
    ' Resize(UBound(t, 1), UBound(t, 2)
    ' Resize definit la taille reserver dans la feuille pour coller le resultat de la variable tableau t
    ' UBound(t, 1) = Nombre de ligne 1 à 3
    ' UBound(t, 2) = Nombre de colonne 1 à 2
    ' t = c'est l'ensemble de tous le tableau a coller dans la feuille avec cette instruction décrite ci-dessus
    ActiveSheet.Cells(2, 3).Resize(UBound(t, 1), UBound(t, 2)) = t
End Sub
1582828843540.png
 

job75

XLDnaute Barbatruc
En VBA le plus rapide est sans doute d'entrer les formules Excel dans les 2 colonnes C et D :
VB:
Sub Eclater1()
Application.ScreenUpdating = False
[C2].Resize(Rows.Count - 1, 2).Delete xlUp 'RAZ
With [A1].CurrentRegion
    If .Rows.Count = 1 Then Exit Sub
    With [C2].Resize(.Rows.Count - 1)
        .FormulaR1C1 = "=LEFT(RC1,FIND("" "",RC1)-1)"
        .Columns(2) = "=MID(RC1,LEN(RC[-1])+2,9^9)"
        .Resize(, 2).Borders.Weight = xlThin
    End With
End With
End Sub
Chez moi 0,19 seconde sur 60 000 lignes.
 

cp4

XLDnaute Barbatruc
Là, les gars vous m'avez noyé. D'autant plus que je viens juste de rentrer chez moi crevéo_O.
Il va me falloir du temps pour répondre à chacun de vous. Je ne m'attendais pas à ce déluge:cool::cool::cool:.
Merci beaucoup. ça me touche vraiment.
A+;)
 

cp4

XLDnaute Barbatruc
Re,
J'ai tous commenté !
VB:
Sub test()
    Dim t() As Variant, i As Integer, j As Integer
    ' Redimension du tableau 2 D
    ' Ligne du tableau de la premiére à la derniére avec
    ' 1 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 1).End(xlUp).Row, 1).Row - 1
    ' les colones / juste 2 colonne avec
    ' 1 To 2
    ReDim t(1 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 1).End(xlUp).Row, 1).Row - 1, 1 To 2)
    ' For Boucle sur toutes les lignes du tableau
    For i = LBound(t, 1) To UBound(t, 1)
    ' Découpe la chaine de caractaire de la cellule A2
    ' Stocke dans la case du tableau / Ligne (1 = i) colonne 2 pour t(i, 2)
    t(i, 2) = Split(ActiveSheet.Cells(i + 1, 1), " ")
        ' donc la case t(i, 2) contient le tableau split
        ' récupération de la premiére case se tableau = 1 (de la cellule A1 / "1 TF1")
        ' la valeur 1 se trouve dans un tableau qui lui même est dans un tableau
        ' t(i, 2) = cette case contient un tableau de 2 case / Case 0 = 1 et Case 1 = TF1
        ' Donc le tableau initial t à la case = t(i,1) qui est vide
        ' Ont stocke la valeur 1 dans cette case
        ' t(i,1) = 1 est est donc comme deviné le tableau de split dans la case du tableau ligne 1 colonne 2
        ' Voila la premiere case de notre tableau est remplis
        ' t(i,1) = "elle contient la valeur 1 à présent)
        t(i, 1) = t(i, 2)(0)
        ' Condition si le tableau générer avec le split contient plus de 2 cases !
            If UBound(t(i, 2)) > 2 Then
                ' Se cas est particulier car la chaine contient plusieurs espace est génére plusieur découpage
                ' exemple pour la cellule A4 soit la chaine "207 Science & Vie TV"
                ' le split va générer 5 case réspectivement / Case 0 puis 1 et 2 et 3 et 4 et 5
                ' Se tableau est ranger dans la case du tableau t soit ligne i = 3 de la colonne 2
                ' ********** L'astuce pour évité la boucle *********************
                ' t(i,3) précedement rempli contient 207
                ' donc je fait le découpage avec la chaine 207 qui est équivalent a t(i,3)
                ' le découpage de se tableau est obtenu avec 2 case donc avec se fameux découpage
                ' Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))
                ' Alors la case 0 de se tableau serat donc vide car avant 207 (Il n'y a rien) C'est le pivot
                ' est case 1 de l'autre coté de 207 il y a la chaine restante
                ' Donc je choisi la case 1 ont
                ' pour le reste de la chaine soit Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))(1)
                t(i, 2) = Split(ActiveSheet.Cells(i + 1, 1), t(i, 1))(1)
                ' t(i, 2) = "voila la case du tableau t ligne " colone 2 contient la chaine "Science & Vie TV"
                ' donc idem j'écrase le tableau générer précedement avec le split qui a remplis cette case
                ' par la nouvelle valeur (chaine de caractaire décrite si dessus)
            Else
            ' Le tableau générer par le split cotient 2 case / La case 0 (pour une valeur) et la case 1 (pour une autres valeur)
            ' Alors dans cette case vu plus haut de se fameux tableau générer par le split qui est stocké dans la case
            ' du tableau t de la ligne i = 1 et de sa colone 2 pour t(i, 2)
            ' Donc la valeur de la case du tableau générer par le split qui a deux cases il est simple de récupérer la
            ' valeur de la deuxieme case soit la case 1 qui contient TF1
            ' J'écrase le tableau de split et je remplace par la la valeur de la case 2 du split / ont deviné la case 1
            ' t(i, 2)  = "Voila à présent la case de se tableau t donc ligne i = 1 de la colonne 1 contient a présent TF1"
                t(i, 2) = t(i, 2)(1)
            End If
    Next i
    ' Comme le tableau est remplis il ne reste plus cas le coller sur la feuille avec cette fonction
    ' choix de la cellule ou sera coller le tableau ici ActiveSheet.Cells(2, 3)  = Cellule C2
    ' Resize(UBound(t, 1), UBound(t, 2)
    ' Resize definit la taille reserver dans la feuille pour coller le resultat de la variable tableau t
    ' UBound(t, 1) = Nombre de ligne 1 à 3
    ' UBound(t, 2) = Nombre de colonne 1 à 2
    ' t = c'est l'ensemble de tous le tableau a coller dans la feuille avec cette instruction décrite ci-dessus
    ActiveSheet.Cells(2, 3).Resize(UBound(t, 1), UBound(t, 2)) = t
End Sub
Regarde la pièce jointe 1056600
Étant donné que tu es le premier à avoir répondu à mon post, tu es prioritaire.
Toute ma gratitude pour tes commentaires, c'est plus que parfait.:cool:
Encore merci. Bonne soirée.
 

laurent950

XLDnaute Accro
Bonjour,
ne pas Oublié Staple1600, Job75, Patricktoulon, jmfmarques.

Ils sont vraiment bien plus fort que moi et eux sont des vrais expert. peux être suivre leurs modéle et leurs codes... Pour ma part j'apprend comme vous et j'ai commenter pour vous faire partager mes petites connaissances.

Alors un grand merci aussi a Staple1600, Job75, Patricktoulon, jmfmarques.
 
Dernière édition:

cp4

XLDnaute Barbatruc
Pourquoi donc utiliser VBA pour si peu ?
Mais bon . regarde alors ce que ferait ceci :
VB:
For Each c In Columns(1).SpecialCells(xlConstants).Cells
  pos = InStr(c, " ")
  c(1, 2).Value = Left(c.Value, pos - 1)
  c(1, 3).Value = Mid(c.Value, pos + 1)
Next
qui permet d'éviter la fonction split (plus lourde)


27 BLABLA TOTO
27​
BLABLA TOTO
3 EUROPE 1
3​
EUROPE 1
18 RPP NOTICIAS
18​
RPP NOTICIAS
Re,
Merci beaucoup pour ton code qui fonctionne très bien.
Avec moi, c'est toujours d'une pierre 2 coups (résoudre un problème et apprendre un peu plus le VBA). Je suis un curieux;)
Encore merci. Bonne soirée.
 

cp4

XLDnaute Barbatruc
Bonjour cp4, laurent950, jmfmarques,

En VBA l'entrée de données une par une dans chaque cellule peut prendre beaucoup de temps.

Il est préférable d'utiliser des tableaux VBA ou une macro comme celle-ci :
VB:
Sub Eclater()
Application.ScreenUpdating = False
[C2].Resize(Rows.Count - 1, 2).Delete xlUp 'RAZ
With [A1].CurrentRegion
    If .Rows.Count = 1 Then Exit Sub
    .Offset(1).Resize(.Rows.Count - 1).Copy [C2]
End With
With [C1].CurrentRegion
    .Columns(1).NumberFormat = "@" 'format Texte nécessaire s'il peut y avoir des zéros non significatifs
    .Columns(1).Replace " *", "", xlPart
    .Columns(2) = "=MID(RC1,LEN(RC[-1])+2,9^9)"
    .Columns(2) = .Columns(2).Value 'supprime les formules
    .Columns(2).Borders.Weight = xlThin
End With
End Sub
A+
Mon cher Job75;),
A chaque fois que je lis tes interventions, je suis bluffé et c'est tant mieux pour moi car je découvre des choses nouvelles.
Je te prie de bien vouloir m'expliquer les 2 lignes de codes ci-dessous
VB:
.Columns(1).Replace " *", "", xlPart
.Columns(2) = "=MID(RC1,LEN(RC[-1])+2,9^9)"
J'utilise Excel 2007 son aide n'est pas très fourni. En te remerciant par avance.

Bonne soirée.
 

job75

XLDnaute Barbatruc
Je te prie de bien vouloir m'expliquer les 2 lignes de codes ci-dessous
VB:
.Columns(1).Replace " *", "", xlPart
.Columns(2) = "=MID(RC1,LEN(RC[-1])+2,9^9)"
Avec la 1ère ligne de code on enlève en colonne C le 1er espace et ce qui suit dans chaque cellule.

Avec la 2ème ligne de code on entre une formule en colonne D.

Pour la voir exécuter la macro de mon post #22, nettement plus rapide.
 

cp4

XLDnaute Barbatruc
Avec la 1ère ligne de code on enlève en colonne C le 1er espace et ce qui suit dans chaque cellule.

Avec la 2ème ligne de code on entre une formule en colonne D.

Pour la voir exécuter la macro de mon post #22, nettement plus rapide.
Bonjour Job75:),

Merci pour tes explications. En effet, le code du post#22 est plus rapide.
J'ai bien compris qu'on insère une formule en colonne D. Je n'ai pas compris le 9^9 à la fin de la formule. Est-ce bien 9 à puissance 9? si c'est le cas pourquoi? Désolé, si je n'ai pas tout compris car mon niveau est bien en-deça que certains pensent. Je découvre et m'améliore petit à petit à mon rythme.

Encore merci pour ta patience et le partage de tes connaissances.:cool:
 

Discussions similaires

Statistiques des forums

Discussions
312 330
Messages
2 087 347
Membres
103 526
dernier inscrit
HEC