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

séparation de texte dans plusieurs cellules

S

seb

Guest
salut tout le monde,

j'ai un texte dans une cellule, je desirerais le couper et le dispatcher dans plusieurs cellules.

Dans le fichier joint, j'ai mis mon texte de depart et ce à quoi j'aimerais arriver.
le seul repere qui sera commun aux texte à dispatcher sera une virgule situe un caractere avant la fin de chaque texte. De plus chaque texte peut comporté des espaces (ce serait trop facile sinon !!)

ex:
cellule1=texte 1,x texte 2,x texte 3,x

but rechercher:
cellule1=texte 1,x
cellule2=texte 2,x
cellule3=texte 3,x

Biensur je souhaiterais que le tout soit fait dans une macro pour rendre ces "bidouilles" invisibles

merci d'avance à ceux qui vont me répondre
 

Pièces jointes

  • exemple.zip
    1.4 KB · Affichages: 68
  • exemple.zip
    1.4 KB · Affichages: 73
  • exemple.zip
    1.4 KB · Affichages: 68
S

sousou

Guest
Un bout de code qui décompose une phrase de la cellule active à ta manière
à adapter dans une macro


Sub test()
phrase = ActiveCell
nbc = Len(ActiveCell)
For n = 1 To nbc

cesure = Mid(ActiveCell, n, 1)
k1 = k1 + cesure
If cesure = "," Then
mot = k1 + Mid(ActiveCell, n + 1, 1)
MsgBox mot
k1 = ""
n = n + 1
End If
Next
End Sub
 
C

C@thy

Guest
Bonjour Seb et Sousou,

pour moi la meilleure macro consiste à ne pas en écrire (pb de changement de version, de lancement de la macro, de niveau de sécurité),
donc je fais tout simplement :

données convertir
cocher délimité
cliquer sur suivant
cocher séparateur espace
cliquer sur terminer.

par formule tu peux aussi faire :

=GAUCHE(B1;CHERCHE(" ";D1)-1) pour le 1er, mais il faut alors 3 formules!!!

C@thy
 
C

C@thy

Guest
seb, sousou,

le données convertir ne va pas marcher car il y a des espaces avant le ,x

donc formules :

imaginons cellule 1 5mon premier texte1,x mon deuxieme texte2,x mon troisieme texte3,x) en D12.

En D13 : =GAUCHE(D12;CHERCHE(",";D12)+1)

En E13 : =DROITE(GAUCHE(D12;CHERCHE(",";D12)+2+NBCAR(D13));NBCAR(D13)+2)

En F13: =DROITE(D12;NBCAR(D12)-NBCAR(D13)-1-NBCAR(E12))

C@thy
 
S

sousou

Guest
D'accord C@thy, mais j'ai compris que Seb ne voulait pas de formule.
D'autre part la solution macro fonctionne quelques soit la longueur de la phrase avec + ou - de trois réponses.
 
S

seb

Guest
re-slt,
merci pour ces infos.
je vais tester la macro.... désolé C@thy....
en fait c'est pour incorporer cette commande dans une macro déja existante donc ca ne genera pas trop.... une de plus ou de moins....
par contre(merci C@thy), il vrai que je risque d'avoir des problemes en fonction des versions d'Excel que je vais utiliser... je n'y avais pas pensé...
je teste et vous tiens au courant...

merci en tous cas à tous les deux
 
C

C@thy

Guest
Tiens, Seb, j'ai modifié pour que ça s'écrive dans les cellules adjacentes au lieu d'afficher un message

Sub test()

Dim phrase, cesure, k1, mot As Variant
Dim nbc, n, d As Integer
d = 1
phrase = ActiveCell
nbc = Len(ActiveCell)

For n = 1 To nbc
cesure = Mid(ActiveCell, n, 1)
k1 = k1 + cesure
If cesure = "," Then
mot = k1 + Mid(ActiveCell, n + 1, 1)
'MsgBo
ActiveCell.Offset(0, d).Value = mot
d = d + 1
k1 = ""
n = n + 1
End If
Next
End Sub

C@thy
 
L

LaurentTBT

Guest
Bonjour à tous,

Il me semble avoir vu il y a peu sur le forum l'existence d'une fonction VBA qui scinde justement une chaîne de caractères en fonction d'un caractère particulie, que je n'ai personnellement jamais utilisé. Je n'ai pas accès à Excel sur ce poste, et je ne peux pas en dire plus pour le moment. Peut-être était-ce SPLIT, ou quelque chose comme ça.

JE regarde ça ce soir, à moins que d'autres forumeurs voient de quoi je veux parler.

Bonne journée.

Laurent.
 
S

seb

Guest
houla..........
merci beaucoup C@thy.........
grâce à toi mais aussi à notre ami sousous........
je n'ai plus de probleme, enfin si, mais plus celui-là !
cool

d'ici peu, je vais mettre en ligne une version commentée pour que d'autres utilisateurs puissent s'en inspirer...........

merci encore à tous
 
S

seb

Guest
voici la réponse en version commentée (plus exploitable -peut etre- pour les personnes non habituée)
un grand merci à C@thy et sousou pour leurs reponses collectives

Sub decoup_text()

mot_a_couper = ActiveCell

'recherche du nombre de caracteres de la cellule
nb_caractere = Len(mot_a_couper)

'scrutation des caracteres 1 par 1
For n = 1 To nb_caractere

'observation du caratere n
caract_n = Mid(mot_a_couper, n, 1)
'stocke les caracteres 1 à 1
stock = stock + caract_n
'repérage d'une virgule
If caract_n = "," Then
'on sauve stock et le caractere suivant
mot = stock + Mid(mot_a_couper, n + 1, 1)
'on ecrit le resultat dans [cellule de départ avec un offset(décalage) de 0 ligne et d colonnes]
ActiveCell.Offset(0, d).Value = mot
'on incrémente l'index de colonne de la cellule cible
d = d + 1
'effacement du stockage
stock = ""
'on decale pour echapper le caractere après la virgule
n = n + 1

End If

Next n 'on reboucle

End Sub
 
@

@+Thierry

Guest
Bonjour Laurent, C@thy, Seb, Sousou, le Forum,

Pour Laurent il s'agit effectivement de la Fonction Split, qui, pour moi est ultra pratique. Ceci, bien que Ti, (cf :Lien supprimé) n'ait pas l'air de l'apprécier.

Son désavantage, premièrement c'est de n'exister qu'à partir d'Excel 2000, donc inutile d'aller plus loin si vous avez Excel 97, et deuxièmement c'est de constituer une Array Variant, mais avec les ressources des PCs d'aujourd'hui je pense pas qu'il y ait un problème majeur.

Un exemple d'utilisation dans ce contexte précis :

Sub SplitDemo()
Dim Container As Variant
Dim i As Byte
Dim Phrase As String

Phrase = ActiveCell

Container = Split(Phrase, Chr(44)) '<<< Chr(44) pour ",")

For i = 0 To UBound(Container)
ActiveCell.Offset(0, i + 1) = Container(i)
Next

End Sub


Par contre pour C@thy, en tant que développeur, je ne suis pas tout à fait d'accord avec toi, bien qu'à chaque changement de Version de Windows ou d'Excel il me faut faut consacrer un certain temps d'apprentissage, une macro bien rédigée, bien optimisée et bien pensée ne dégénère pas en problème et n'en constitue généralement jamais dans le sens "version descendante".

Au niveau de la construction de code, je m'en vais te "gronder" car écrire ceci :
Dim phrase, cesure, k1, mot As Variant
Dim nbc, n, d As Integer

Signifie que Seule "d" est Integer, toutes les autres variables sont Variant (alors que seules 2 le sont)

Non en VBA il faut déclarer comme ceci :
Dim K1, Mot '<<<< (Sous entendu As Variant par défaut)
Dim Phrase As String, Cesure As String
Dim nbc As Byte, n As Byte, d As Byte

Dans les tous les cas, bien entendu chager Byte pour Integer si la chaine de caractères à traiter dépasse 255 caractères...


Bon Après Midi
@+Thierry
 
C

C@thy

Guest
Merci Laurent et Thierry, c'est super ce split!!!

Eh oui, Thierry, j'ai du mal sur les définitions de variables, tu as parfaitement raison, phrase et cesure sont du type string.
J'ai en effet mis integer s'il y a plus de 255 caractères dans la chaîne.

Biz

C@thy
 
@

@+Thierry

Guest
Re Bonjour, ce n'est que re-moi !

Ah je n'avais pas saisi qu'il fallait écraser la valeur initiliale de la cellule de départ. (donc le + 1 est de trop)

Donc qu'à cela ne tienne voici la version corrigée avec commentaires

Option Explicit 'Option pour OBLIGATION de Déclaration de Variable
Sub SplitDemo()
Dim Container As Variant 'Déclaration de Variable
Dim i As Byte 'Déclaration de Variable (Changer pour Integer si Insuffisant)
Dim Phrase As String 'Déclaration de Variable

Phrase = ActiveCell 'Initialisation de Variable

'Construction de l'Array "Container" avec un item à chaque ","
Container = Split(Phrase, Chr(44)) ''Chr(44) = Virgule


For i = 0 To UBound(Container) 'Boucle sur le contenu de l'Arrray
ActiveCell.Offset(0, i) = Container(i) 'Ecriture sur les cellules en s'appuyant sur le même index "i"
Next

End Sub


Bon Aprèm
@+Thierry
 

Discussions similaires

Réponses
36
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…