Rassembler le contenu de plusieurs lignes en une [Fermé]

Signaler
-
 Superpat -
Bonjour,

Je dois corriger un tableau Excel créé par quelqu'un qui s'y connaissait encore moins que moi. Comme le texte d'une des colonnes était trop long pour être visible sur une seule ligne, cette personne l'a poursuivi sur la ligne en dessous. Donc, chaque enregistrement s'étalant sur plusieurs lignes, il m'est impossible de modifier le tri des données selon mes besoins.

Mon tableau couvrant plus de 4000 lignes, j'ai essayé de créer une macro en appuyant sur le bouton « Enregistrer une macro ». Mais je n'ai réussi qu'à effacer de l'information. Quelqu'un peut-il me suggérer une macro ?

La colonne A contenant un numéro séquentiel par enregistrement, et la colonne E contenant le texte à rassembler, voilà ce que la macro devrait faire :

1. Rechercher la première cellule vide dans la colonne A
2. Déplacer le curseur jusqu'à la colonne E
3. Couper le texte qui s'y trouve
4. Déplacer le curseur jusqu'à la cellule au-dessus
5. Coller le contenu du presse-papier à la suite du texte qui s'y trouve déjà sans rien effacer
6. Ramener le curseur jusqu'à la cellule en-dessous (qui maintenant est vide)
7. Supprimer la ligne
8. Recommencer l'opération jusqu'à la fin du tableau.



6 réponses

Messages postés
9
Date d'inscription
jeudi 27 juin 2013
Statut
Membre
Dernière intervention
28 juin 2013
1
Difficile de dire sans le tableau, mais il me semble qu'il y a plus simple qu'une macro.

il existe une formule pour regrouper plusieurs contenu de cellule c'est la fonction concatener ...
essaie dans ta colonne F un truc du type :
=concatener(B1;C1.D1)

tu regardes ce que ça donne et tu appliques cette fonction a ce que tu veux
J'ai rien contre l'idée de "concatener" -- je vois ce mot pour la première fois --, mais mon tableau a plus de 4000 lignes.
Messages postés
9
Date d'inscription
jeudi 27 juin 2013
Statut
Membre
Dernière intervention
28 juin 2013
1
Je ne pense pas que ce soit un problème. Une fois que la première ligne est correcte, il suffit de faire un copier coller pour faire les 4000 lignes .... ensuite si le résultat est satisfaisant, il faut refaire un copier coller en valeur ... comme cela la fonction disparait et restera le contenu du concatener (si les cellules sont vides, ça ne bloque pas le concatenage)
Messages postés
95
Date d'inscription
mardi 13 décembre 2011
Statut
Membre
Dernière intervention
8 janvier 2019
2
BBonjour,
On doit pouvoir se passer de macro par concatener puis trier.
Je répond d'abord à quelqu'un et je reviens vers vous
A+
Messages postés
95
Date d'inscription
mardi 13 décembre 2011
Statut
Membre
Dernière intervention
8 janvier 2019
2
Concaténer c'est assembler plusieurs partie en une seule.
Pour toi, c'est exactement ce que tu veux faire avec tes lignes.
Exemle
A1 ="Toto va à"
A2="la pêche au gros"
Si en B1 tu tapes =A1&A2, cela donne "Toto va àla pêche au gros"
Il faut donc ajouter un espace entre la fin de A1 et le début de A2.
Au final, tu dois taper en B1 = A1&" "&A2.
A présent, pour les 4000 lignes.
Dans une colonne libre, tu vas taper la formule en regard de ta première ligne. Rien en dessous. Puis tu sélectionne ces 2 lignes et tu tires jusqu'en bas.
Dans cette colonne, tu auras alors une ligne avec la concanétaion, et une ligne vierge. Tu fais simplement un tri pour ne garder en tête de tableau que les lignes non vide.
Tu pourras alors nettoyer ton fichier des colonnes initiales
C'est clir?
A+
Messages postés
95
Date d'inscription
mardi 13 décembre 2011
Statut
Membre
Dernière intervention
8 janvier 2019
2
Attention!
J'ai supposé que tu avais TOUJOURS 2 lignes et seulement 2 lignes à assembler, et cela pour chaque N° séquentiel de ta colonne A.
Si ce n'est pas le cas: Des fois un ligne, d'autres 2, voire 3, alors, il n'y a plus que la macro...
Dis-nous.
Messages postés
9
Date d'inscription
jeudi 27 juin 2013
Statut
Membre
Dernière intervention
28 juin 2013
1
sauf si dans la première colonne il y a par exemple une info qui ne concerne qu'un seul enregistrement

exemple A1 = "toto" puis B1 ="va à", B2 = "la pêche au gros"
puis A3 = "tata puis B3, B4 et B5 en rapport avec A3 ...

la on doit toujours pouvoir s'en sortir sans macro mais ce sera plus complexe .... 8(
Messages postés
95
Date d'inscription
mardi 13 décembre 2011
Statut
Membre
Dernière intervention
8 janvier 2019
2
Oui, bien sûr Littlegreg, comme je l'ai dit dans mon commentaire.
Si on a le genre de panachage que tu dis, sur 4000 lignes, on passe évidemment par macro.
Attendons la réponse de Cheval bleu...
Désolé, je crois qu'on m'a mal compris.

Voici à quoi ressemble mon tableau

A1=Premier numéro séquentiel
B1=Code
C1=Date
D1=Date
E1=Le texte commence, se poursuit sur la cellule E2 et se termine sur E3.
A4=Second numéro séquentiel
etc.

Les Cellules A2, B2, C2, D2, A3, B3, C3 et D3 ont été laissées en blanc.
Mon but est de rassembler le texte des cellules E1, E2 et E3. Une fois fait, je supprime les ligne 2 et 3. Et mon second numéro séquentiel s'affiche maintenant à la ligne deux.

Les textes de la colonne E peuvent s'étaler sur une à cinq lignes. Il n'y a pas de constance.
Messages postés
1978
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
28 septembre 2020
816
Bonsoir à tous,

Si tes données sont parfois sur une lignes, parfois sur 2 tu peux utiliser une formule conditionnelle qui teste si la cellule colonne A, ligne du dessous, est vide.

Si la colonne F est libre et que tes données commencent en ligne 1, met en F1 la formule : =SI(A2="";E1&CAR(10)&E2;SI(A1="";"";E1)) et tire vers le bas sur tes 4000 lignes.
Remarque : j'ai mis un CAR(10) au lieu d'un espace pour forcer un retour à la ligne dans la cellule. Tu auras ainsi la même apparence qu'actuellement. Si ça ne te convient pas, tu le remplaces par un espace entre guillemets

Tu sélectionnes ensuite la plage de cellules F1:F4000 pour faire un copier/collage spécial "valeur" (ça, c'est pour éliminer les formules)
Tu sélectionnes ensuite ta plage de données A1:F4000 (là, je suppose que tu n'as pas de données en dehors de cette plage) et tu fais un tri sur la colonne F en 1ère clé et sur ta colonne index actuelle en 2ème clé.
Cela suppose que tu as une clé de tri dans tes données (une référence, un identifiant, un n° de facture, un je ne sais quoi qui te convient). Généralement, c'est ce qui est en colonne A.

Une fois le tri fait, toutes les lignes avec une cellule vide en colonne A seront en fin de tes données (ou en début selon l'ordre de ton tri).
Tu sélectionnes alors cette zone de données après avoir vérifié quand même que tu n'as pas de données qui traînent dans les colonnes B à D (on ne sait jamais) et tu supprimes les lignes correspondantes.

Pour terminer, ta colonne E ne te sers plus (vérifies qu'il n'y a pas de données en dessous de tes 4000 lignes!!!). Tu peux la supprimer et tu te retrouves avec une colonne E qui n'a plus qu'une cellule par enregistrement.

Naturellement tu fais une sauvegarde de tes données avant de travailler dessus.

Au cas où tu n'aurais pas de clé de tri actuellement, je te conseille d'en créer une fictive qui va de 1 à 4000 dans une colonne que tu insères avant le colonne A (elle deviendra ta nouvelle colonne A et tout ce que j'ai écrit est à décaler d'une colonne).
Cela te permettra, quand tu auras fini, de refaire un tri sur ta zone de données A1:G4000 avec la colonne A en 1ère clé.
Enfin, tu supprimes ta colonne A qui ne te sert plus.

Si tu n'as pas abandonné la lecture de ce post, et que tu le mets en oeuvre jusque là, tu auras certainement besoin de remettre en forme ta zone au niveau alignement et hauteur de ligne.
On verra ça plus tard.

Corrdialement.

PS : si tu ne te sens pas à l'aise avec ce que je viens de te proposer, ne touche à rien !!!
Si ta feuille Excel interagit avec d'autres feuilles ou nourrit d'autres systèmes, ne touche à rien.
Messages postés
1978
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
28 septembre 2020
816
hé oui, ma proposition ne tenait que pour maximum 2 lignes.
Combien as-tu de lignes au maxi à regrouper? 3?

Tu n'as pas besoin de macro pour faire ça. Sauf bien sûr si c'est pour voir comment ça marche.
Par exemple, pour gérer 4 lignes, essaye :

=SI(A1="";"";SI(A2="";E1&CAR(10)&E2&SI(A3="";CAR(10)&E3&SI(A4="";CAR(10)&E4;"");"");E1))

cordialement
La plupart du temps, mon texte a une à trois lignes, mais ce nombre peut monter jusqu'à 10. (Beaucoup de personnes différentes ont écrit ces lignes)
Je vais essayé ta formule, mais sa complexité m'effraie un peu. Peur de faire une erreur.

D'ailleurs, tout à l'heure ta formule commençait avec =SI(A2 et maintenant c'est =SI(A1. Dois-je additionner 1 partout?

En tout cas, je vais l'essayer et je t'en reparle demain. J'ai terminé le boulot.
Finalement, je n'ai pas pu attendre et j'ai essayé ta formule. Le résultat est étonnant. Elle me convient parfaitement.

Pourrais-tu la compléter jusqu'à dix lignes s'il te plaît? J'ai un peu trop de mal à en comprendre la logique pour le faire moi-même.

Merci beaucoup. Ton aide est très appréciée.
Messages postés
1978
Date d'inscription
mercredi 27 juillet 2005
Statut
Membre
Dernière intervention
28 septembre 2020
816
oui, j'ai changé la logique de la formule.
Tu n'as qu'à faire un copier/coller dans excel en cellule F1.

Mais si tu veux une formule qui va jusqu'à concaténer 11 lignes, toujours en F1 :

=SI(A1="";"";STXT(E1&CAR(10)&E2&CAR(10)&E3&CAR(10)&E4&CAR(10)&E5&CAR(10)&E6&CAR(10)&E7&CAR(10)&E8&CAR(10)&E9&CAR(10)&E10&CAR(10)&E11;1;SOMME(NBCAR(DECALER(E1;0;0;MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-LIGNES($A$1:A1);1)))+MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-1-LIGNES($A$1:A1)))

Là, c'est un peu plus délicat car c'est une formule matricielle qu'il faut valider par un CTRL+MAJ+ENTER, ce qui fera apparaître des accolades autour de la formule dans la zone d'édition.

Ca paraît compliqué mais en décomposant le tout, les parties deviennent compréhensibles.

La logique, ici, c'est de concaténer tout de suite les 11 cellules de la colonne E à partir de la ligne en cours avec des CAR(10) intercalés (E1&CAR(10)&E2&CAR(10)&E3&CAR(10)&E4&CAR(10)&E5&CAR(10)&E6&CAR(10)&E7&CAR(10)&E8&CAR(10)&E9&CAR(10)&E10&CAR(10)&E11) et ce pour chaque cellule, colonne F, contenant la formule.
Cette chaîne de caractères ne sera utilisée que lorsque la colonne A est non vide (c'est le rôle du SI(A1="";""; du début).

A partir de cette chaîne, j'utilise un STXT() qui extrait une sous-chaîne de ces 11 concaténations.
La sous-chaîne à extraire a besoin d'un nombre de caractères (la longueur) qui provient d'un double calcul :

Le premier identifie le nombre de cellules vides sous la cellule A de la ligne considérée. Il s'agit de MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-LIGNES($A$1:A1)

Le deuxième calcule le nombre de caractères des cellules de la colonne E correspondant à celles de A vides sous la cellule en cours de traitement et y compris cette dernière. Il s'agit de :
SOMME(NBCAR(DECALER(E1;0;0;MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-LIGNES($A$1:A1);1)))+MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-1-LIGNES($A$1:A1))

Il y a une fonction un peu inhabituelle ici : DECALER(E1;0;0;MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-LIGNES($A$1:A1);1) qui permet d'identifier la zone de la colonne E correspondant à celle de la colonne A.

Pour comprendre la fin de la formule : +MIN(SI(A2:$A$4001<>"";LIGNE(A2:$A$4001);9^9))-1-LIGNES($A$1:A1)), il suffit de se souvenir que j'ai ajouté des CAR(10) entre chaque valeur concaténée. Cette partie ajoute le nombre de ces caractères à la longueur de la chaîne à extraire grace au STXT() du début.

Les formules matricielles sont assez lourdes en terme de traitement. Donc, si ton PC est un peu lent, commence par recopier une centaine de cellules d'abord pour voir les temps de réponse.

Au fait, mis à part le CTRL+MAJ+ENTER qui permet de valider une formule matricielle, il est possible de réaliser les copier/coller normalement, ou avec le curseur en croix, comme pour une cellule classique.

Tu remarqueras que la dernière cellule sortira en erreur du fait qu'il n'y a que des cellules vides dessous.
Pour remédier à ce souci, il suffira d'ajouter un caractère sous la dernière cellule en colonne A, le temps du traitement, puis l'effacer après le copier/collage spécial "valeur" qui fige les calculs.

Pour que ce soit plus parlant, tu pourras mettre les morceaux de formules en G1,H1,I1,J1 pour voir ce qu'elles retournent comme valeur.
Il faudra, là aussi, valider ces morceaux de formule par CTRL+MAJ+ENTER, sinon c'est le #valeur assuré.

Cordialement
Merci, merci, merci.
C'est plus que je n'en demandais.
Messages postés
95
Date d'inscription
mardi 13 décembre 2011
Statut
Membre
Dernière intervention
8 janvier 2019
2
Donc, macro!