[Résolu] Diviser contenus cellules sur plusieurs lignes

Niko Las

XLDnaute Nouveau
Bonjour à tous, premier message ici, après une recherche infructueuse !

Dans le tableau en PJ je souhaite passer de l'onglet 'Départ' à l'onglet 'Arrivée'

Pour chaque article (colonne P onglet 'Départ' vers colonne A onglet 'Arrivée') :

- Recopier les données des colonnes F, G, H, I de l'onglet 'Départ' dans la colonne C de l'onglet 'Arrivée'.

MAIS :

En divisant le contenu de ces cellules pour que celles ci ne dépasse pas, disons 55 caractères (= séparer après la fin d'un mot et non en coupant au milieu de celui-ci?) OU séparer après chaque saut de ligne dans les cellules ?

Je ne sais pas si mes explications sont claires, si besoin, n'hésitez pas !

Merci d'avance !

Edit : PJ Supprimée, mise à jour dans des msgs plus récents
 
Dernière modification par un modérateur:

Modeste

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

Bonjour Niko Las et bienvenue,

Dans un cas comme celui-ci, il vaudrait mieux préciser le volume global à gérer (un premier essai donne 3645 lignes dans la feuille arrivée). Si le résultat dépasse 65000 lignes, il faudra déjà modifier la proposition. On part du principe qu'il n'y aura jamais plus de 1.048.576 lignes?

J'ai fait la "découpe au saut de ligne"

Supprimer le contenu de la feuille arrivée (sauf les titres de colonnes, coller les lignes ci-dessous dans un module standard ... et tester!?
VB:
Sub decoupage()
Set src = Sheets("départ")
tabLg = Array("FR", "EN", "DE", "NL")
Dim tablo()
For lig = 2 To src.Cells(Rows.Count, 1).End(xlUp).Row
    For col = 0 To 3
        temp = Split(src.Cells(lig, col + 6), Chr(10))
        For el = 0 To UBound(temp)
            ReDim Preserve tablo(2, x)
            tablo(0, x) = src.Cells(lig, 16)
            tablo(1, x) = tabLg(col)
            tablo(2, x) = temp(el)
            x = x + 1
        Next el
    Next col
Next lig
Sheets("Arrivée").[A2].Resize(x, 3) = Application.Transpose(tablo)
End Sub
 

Niko Las

XLDnaute Nouveau
Re : Diviser contenus cellules sur plusieurs lignes

Merci beaucoup ! Ca marche nickel.

Cela s'applique sur des tableaux qui ne dépasseront pas le million de lignes, donc pas de souci ?

Pourrais tu, si tu as le temps, m'expliquer un peu le fonctionnement pas à pas de la macro ? (je n'y connais rien..:/ et je ne voudrais pas juste appliquer bêtement mais progresser !)


Encore merci !

Niko
 

Niko Las

XLDnaute Nouveau
Re : Diviser contenus cellules sur plusieurs lignes

Me revoici, avec une nouvelle question :

- Est-il possible de créer une colonne à gauche, nommée "Chrono", qui contienne un numéro de chrono (1 à xx), permettant de ne pas perdre l'ordre des cellule si un filtre est utilisé.
 

Modeste

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

Re-bonjour,

Tu vas "plus vite que la musique" ;)

Commençons par le commencement: avant d'atteindre la limite des 1.000.000 de lignes dans une feuille, il y a une première "borne" à 65.000 éléments dans le tableau. Son dépassement rendrait impossible l'utilisation de Application.Transpose(tablo). Pour ces deux limites, elles concernent le tableau "résultant", je ne parle pas de la taille du tableau de départ! Pour 1 ligne dans ce dernier, tu en as parfois 48 "à la sortie".
Maintenant, si on risque de dépasser la capacité d'une feuille de calcul, je préviens tout de suite que je renonce :p
En fonction de ta réponse, il faudra peut-être modifier le code ... si c'est le cas, je préfère le savoir avant de t'expliquer :)

Pour ton "Chrono", s'il s'agit simplement de numéroter les lignes au fur et à mesure de leur création, c'est encore à ma portée :eek:
 

Niko Las

XLDnaute Nouveau
Re : Diviser contenus cellules sur plusieurs lignes

Merci de ton implication :) !

Pour la limite, pas de souci, au pire, si ça devait se produire, je couperai mon tableau source en plusieurs morceaux et appliquerai la macro en plusieurs fois :).

Pour le chrono, c'est bien ça.
 

gosselien

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

Bonjour,
tu peux mettre un Call "Ajoutligne"
avant le "end sub" de la procédure de Modeste (que je salue)

Sub AjoutLigne()
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
[A1] = "Ordre"
Dim Last As Long
Last = [B65000].End(xlUp).Row
[A2] = 1: [A3] = 2
Range("A2:A3").AutoFill Destination:=Range("A2:A" & Last), Type:=xlFillSeries
End Sub
 

Niko Las

XLDnaute Nouveau
Re : Diviser contenus cellules sur plusieurs lignes

Merci Gosselien et Modeste !

J'ai pris vos infos, ainsi que les infos d'Excel lors de l'enregistrement d'une nouvelle macro, une fois compilé on arrive à ça :

Pour le code couleur :

  • Rouge : Je ne comprends rien.. :/ Ça marche, mais je voudrais arriver à comprendre pour le réexpliquer s'il faut, auriez vous quelques minutes ? :)
  • Vert : Ce que j'ai inséré moi même, en enregistrant des macros puis en copiant/collant dans la macro principale

Sub decoupage()
Set src = Sheets("SAP GLOB-0667")
tabLg = Array("FR", "EN", "DE", "NL")
Dim tablo()
For lig = 2 To src.Cells(Rows.Count, 1).End(xlUp).Row
For col = 0 To 3
temp = Split(src.Cells(lig, col + 6), Chr(10))
For el = 0 To UBound(temp)
ReDim Preserve tablo(2, x)
tablo(0, x) = src.Cells(lig, 16)
tablo(1, x) = tabLg(col)
tablo(2, x) = temp(el)
x = x + 1
Next el
Next col
Next lig

Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Select
Sheets(Sheets.Count).Name = "Finale"
Range("A1").Select
Sheets("Finale").Select
ActiveCell.FormulaR1C1 = "N°Article"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Langue"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Libellé"

Sheets("Finale").[A2].Resize(x, 3) = Application.Transpose(tablo)
Sheets("Finale").Activate
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
[A1] = "Chrono"
Dim Last As Long
Last = [B65000].End(xlUp).Row
[A2] = 1: [A3] = 2
Range("A2:A3").AutoFill Destination:=Range("A2:A" & Last), Type:=xlFillSeries
Range("A1:D1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 13434879
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Font.Bold = True
Range("A1:D1").Select
Selection.AutoFilter
Columns("A:D").Select
Columns("A:D").EntireColumn.AutoFit
Columns("A:C").Select
With Selection
.HorizontalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Range("A2").Select
ActiveWindow.FreezePanes = True

End Sub
 

Pièces jointes

  • Exemple 2.xlsm
    145.5 KB · Affichages: 56
  • Exemple 2.xlsm
    145.5 KB · Affichages: 48

gosselien

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

re,

je tente dans ce texte (on me corrigera si je me trompe ou si je suis imprécis)

' on mets la feuille SAPxxx dans un objet dont le nom est plus court et plus facile à manipuler
Set src = Sheets("SAP GLOB-0667")
' mise des langues dans une array pour y accéder plus tard
tabLg = Array("FR", "EN", "DE", "NL")


Dim tablo() ' tableau pour accéder plus rapidement aux données
For lig = 2 To src.Cells(Rows.Count, 1).End(xlUp).Row ' boucle de la ligne 2 à la dernière occupée
For col = 0 To 3 ' boucle sur les colonnes
temp = Split(src.Cells(lig, col + 6), Chr(10))
For el = 0 To UBound(temp) ' boucle du 1er element au max de données de "temp"
ReDim Preserve tablo(2, x) ' redimmensionner en gardant les anciens éléments de "tablo"
tablo(0, x) = src.Cells(lig, 16) ' corresponds à une ligne X qui s'incrémente avec le for lig= plus haut, colonne 16
tablo(1, x) = tabLg(col)
tablo(2, x) = temp(el)
x = x + 1 ' on incémente X + 1 step
Next el ' fin de boucle
Next col
Next lig
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Select
Sheets(Sheets.Count).Name = "Finale"
Range("A1").Select
Sheets("Finale").Select
ActiveCell.FormulaR1C1 = "N°Article"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Langue"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Libellé"
Sheets("Finale").[A2].Resize(x, 3) = Application.Transpose(tablo) ' on met en [A2] le contenu de "tablo"
Sheets("Finale").Activate
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove ' insertion d'une colonne avanr la colonne A
[A1] = "Chrono"
Dim Last As Long
Last = [B65000].End(xlUp).Row ' dernière ligne occupée en colone B (la A étant vide pour l'instant)
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

Re²,
Salut gosselien,

Puisqu'il y a déjà un petit compteur qui permet de redimensionner le tableau au fur et à mesure, autant l'utiliser pour numéroter ses abattis ... ou les lignes créées, c'est au choix :eek: (et puis tout sera dans une seule et même procédure)

J'ai commenté le code dans le fichier joint et ai ajouté la colonne Chrono

À la fin du code, j'ai ajouté ce qu'on peut utiliser en lieu et place du Transpose évoqué précédemment. Ce code-ci sera donc fonctionnel avec un résultat supérieur à 65000 (testé avec 2850 lignes au départ > plus de 100.000 lignes au final).

Tu verras à l'usage ... et tu nous diras!?

[Edit:] je ne vois qu'à l'instant le dernier message. J'avais bien noté la demande d'explications (la preuve, elles arrivent!) ... donc, un peu de patience, cher lecteur ... on est bénévoles, après tout!
Par ailleurs, utiliser l'enregistreur pour commencer c'est très bien, mais après il faut "élaguer" un peu ... beaucoup.
Vois avec le code du fichier joint si tu comprends et si tout est fait comme tu l'imaginais.

[Re-Edit:] je vois aussi le dernier message de gosselien ... moi, je n'arrive pas à vous suivre!
 

Pièces jointes

  • Split (Niko Las).xlsm
    37.5 KB · Affichages: 49
Dernière édition:

Niko Las

XLDnaute Nouveau
Re : Diviser contenus cellules sur plusieurs lignes

Un grand merci à vous deux pour le temps que vous avez pris à me répondre !

En tant que novice++ des macros, il y a quelque chose que je ne comprends pas :

' mise des langues dans une array pour y accéder plus tard
tabLg = Array("FR", "EN", "DE", "NL")

Comment Excel fait pour savoir que vous parlez des colonnes F, G, H et I ? Car elles s'appellent "TOTAL_design_long_FR" et non pas "FR" ?

C'est peut être tout bête, mais je suis un peu perdu :)
 
Dernière modification par un modérateur:

gosselien

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

re,
je me permet (à la place ou en plus de Modeste)
tablg s'incrémente de 1 à 4 - puisque 4 éléments dans l'array) donc
tablo(2,x) = tablg(col) égale 1 puis 2 puis 3 puis 4 donc FR-EN-DE-NL

donc tabl0(1) = "FR" au 1er passage et ainsi de suite
 

Modeste

XLDnaute Barbatruc
Re : Diviser contenus cellules sur plusieurs lignes

je me permet (à la place ou en plus de Modeste)
Je dirais même plus, comme Dupont (ou alors était-ce Dupond?): "à la pluce ou en plas de gosselien" ...

tabLg s'incrémente de 0 à 3 (pour la même raison que celle évoquée par le susnommé) ;)
Excel ne "sait" donc pas qu'on fait référence à ces colonnes en particulier.
Par contre, quand, dans le code, on écrit src.Cells(lig, col + 6),... on fait bien référence à la colonne 6 (soit la colonne F) au premier passage dans la boucle, puisque col vaut 0. Au second passage, col valant 1, on "pointe" vers la 7e colonne (de la feuille de calcul) et ainsi de suite
 

Discussions similaires

Réponses
8
Affichages
494
Réponses
7
Affichages
575

Statistiques des forums

Discussions
312 451
Messages
2 088 517
Membres
103 873
dernier inscrit
Sabin