XL 2016 Ordonner une cellule ou un pavé de cellules contenant des chr(10)

Webperegrino

XLDnaute Impliqué
Supporter XLD
Bonjour le Forum,

1 - Une synthèse de ce qui suit :
La macro Sub OrdonneCellule() :
  • Fonctionne bien quand je travaille la mise en ordre du contenu d’une cellule
  • Fait « des siennes » pour le traitement de tout le pavé de cellules.
2 - Plus d’explications que ci-avant :
Voici des commandes Vba, en version utilisée Excel 2016, que j’ai réalisées pour tenter d’ordonner par ordre croissant le contenu des cellules d’un pavé situé dans la feuille PANORAMIQUE.

Pour le moment, après y avoir fait un des deux choix d’analyse en cellule [D28], l’appui sur le bouton « Ordonner… » dans feuille PANORAMIQUE devrait procéder à l’analyse de la ou des cellules pour au final trouver les éléments qui y figurent, rangés dans l’ordre alpha croissant.
Pour l’exemple les cellules suivantes, mal ordonnées intérieurement, doivent être traitées :
  • [G33] (col7… lig23)
  • [BM29] (col65)
  • [BO31] (col67)
  • [BS35] (col71)
Cela fonctionne quand je traite sur une cellule seulement (choix dans Panoramique![D28]).

Mais, toujours en cellule Panoramique ![D28] , lorsque je fais le choix «TOUT LE PAVÉ DE PANORAMIQUE » mes lignes Vba ne font pas bien le ménage.
Pourriez-vous trouver où j’ai fauté, dans la construction des lignes de codes ?
Pour l’instant, la parade de mes macros passe par le traitement des trois colonnes [A], [E] et [H].
Ces colonnes :
  • reçoivent le déport de Panoramique,
  • procèdent à la « dé-concaténation »,
  • réalisent le traitement d’ordonnancement croissant et sans doublon,
  • engagent une « Re-concaténation » avec tous les chr(10) nécessaires,
  • effectuent un report du résultat final en lieu et place dans la feuille PANORAMIQUE.
L’idéal serait que je puisse :
  • faire exécuter tout cela dans la colonne [A] de la feuille « Cible » (Variante n°1)
  • Ou encore mieux, en Variante n° 2, et là ce serait merveilleux pour moi, ne pas avoir besoin de cette feuille intermédiaire « Cible). La réalisation de l’analyse se ferait directement dans la feuille PANORAMIQUE par unité de cellule ou de tout le pavé [G7 :BU36]… tout cela « en sous-marin par codes Vba » et, avec contrat majeur : sans utiliser de cellules dans PANORAMIQUE par ailleurs déjà bien occupées et non montrées dans cet extrait ; elles ont un autre usage.
3 - Si vous avez une idée de conception rectificative de VBa pour ce fichier mis à votre disposition, cela m’intéresse ...
Avec des tbl() probablement que je ne sais pas concevoir car trop compliqué pour moi, à mon niveau d’instruction Excel-vba.

Au plaisir de vous lire,
Cordialement,
Webperegrino
 

Pièces jointes

  • ORDONNATEUR DE CELLULES.xlsm
    75.2 KB · Affichages: 5
Solution
Bonjour,

Mais, toujours en cellule Panoramique ![D28] , lorsque je fais le choix «TOUT LE PAVÉ DE PANORAMIQUE » mes lignes Vba ne font pas bien le ménage.
Pourriez-vous trouver où j’ai fauté, dans la construction des lignes de codes ?
Tu as oublié de réactiver la feuille "Cible" avant de faire le Select de sa cellule A1.


VB:
Sub OrdonneCellule()
'Dim i, Cell, nbrl
'************************************
'1- aller choisir dans Feuil!"PANORAMIQUE" la cellule ou le pavé à analyser (selon choix de D28, D29 et D30
'************************************

    Set PAN = Sheets("PANORAMIQUE")
    Set Cib = Sheets("Cible")

    If PAN.[D28] = "TOUT LE PAVÉ DE PANORAMIQUE" Then
        PAN.[D29] = 28
        PAN.[D30] = 7
        coldeb = 7...

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Mais, toujours en cellule Panoramique ![D28] , lorsque je fais le choix «TOUT LE PAVÉ DE PANORAMIQUE » mes lignes Vba ne font pas bien le ménage.
Pourriez-vous trouver où j’ai fauté, dans la construction des lignes de codes ?
Tu as oublié de réactiver la feuille "Cible" avant de faire le Select de sa cellule A1.


VB:
Sub OrdonneCellule()
'Dim i, Cell, nbrl
'************************************
'1- aller choisir dans Feuil!"PANORAMIQUE" la cellule ou le pavé à analyser (selon choix de D28, D29 et D30
'************************************

    Set PAN = Sheets("PANORAMIQUE")
    Set Cib = Sheets("Cible")

    If PAN.[D28] = "TOUT LE PAVÉ DE PANORAMIQUE" Then
        PAN.[D29] = 28
        PAN.[D30] = 7
        coldeb = 7
        colfin = 73
        ligdeb = 28
        ligfin = 36
    End If

    If PAN.[D28] = "UNE CELLULE de PANORAMIQUE" Then
        coldeb = PAN.[D30]
        colfin = PAN.[D30]
        ligdeb = PAN.[D29]
        ligfin = PAN.[D29]
    End If

'    Rows("1:1").Rows.AutoFit

    Application.ScreenUpdating = False
'    Application.EnableEvents = False

    Cib.Select
    Cib.[A1].Select

    For col = coldeb To colfin

        PAN.[D30] = col

        For lig = ligdeb To ligfin

            PAN.[D29] = lig
            Cib.[A1:A200,B2:B4,E1:E200,H1:H200].ClearContents

            ' 1- Qu'y a-t-il dans la cellule ? Pas de calcul si la cellule est vide ou a un seul élément
            If PAN.Cells(lig, col) <> "" Then
                If PAN.Cells(31, 4) > 1 Then
                    PAN.Cells(lig, col).Copy
                    Cib.[A1].PasteSpecial Paste:=xlPasteValues

                    ' 2- Nombre de "retours chariot" nb_RC !
' **********************************
                    nb_RC = 0
' **********************************
                    For i = 1 To Len(Cib.Range("A1"))
                        If Mid(Cib.Range("A1"), i, 1) = Chr(10) Then nb_RC = nb_RC + 1
                    Next i
                    Cib.[B2] = nb_RC
                    Cib.[B3] = nb_RC + 1

                    ' 3- Éclatement des éléments, ligne par ligne en Cible![A1]
                    ' Nombre d'éléments = Finalrow
                    ' qui est aussi le n° de la dernière ligne occupée

' **********************************
                    Cib.Activate
' **********************************
                    Cib.[A1].Select
                    SplitCells
                    Finalrow = Cib.Cells(Rows.Count, 1).End(3).Row
                    Cib.[B4] = Finalrow

                    ' 4- Tranfert du résultat en colonne E
                    Cib.Range("A1:A" & Finalrow).Copy Destination:=Cib.Range("E1")
                    Cib.[D4] = "Avant TRI : Occupation [Colonne C]..." & vbLf & "jusqu 'à ligne " & Cib.Cells(Rows.Count, 5).End(3).Row

                    ' 5- Tri croissant en colonne E, sans doublons
                    Call Trie
                    Cib.[D6] = "Après TRI : Occupation [Colonne C]..." & vbLf & "jusqu 'à ligne " & Cib.Cells(Rows.Count, 5).End(3).Row

                    ' 6- Report [H1] de la concaténation de la colonne E
                    Cib.Cells(1, 8) = Cib.Cells(1, 5)
                    For lg = 2 To Cib.Cells(Rows.Count, 5).End(3).Row
                        Cib.Cells(1, 8) = Cib.Cells(1, 8) & Chr(10) & Cib.Cells(lg, 5)
                    Next lg

                    ' 7- [H1] concaténée déportée en Feuille PANORAMIQUE en lieu et place, avec les retours calèche
                    Cib.[H1].Copy
                    PAN.Cells(lig, col).PasteSpecial Paste:=xlPasteValues
                    Application.Goto Cib.[A1], Scroll:=True

                    ' 8- Vidage du presse-papier & sortie d'analyse
                    On Error Resume Next
' **********************************
                    Application.CommandBars("clipboard").Controls(4).Execute
' **********************************
                    Application.Goto PAN.[A1], Scroll:=True
                End If
            End If

        Next lig

    Next col

    Application.EnableEvents = True

End Sub
 
Dernière édition:

Webperegrino

XLDnaute Impliqué
Supporter XLD
Le Forum,

Bonjour TooFatBoy,
C'est parfait : vos lignes rectificatives ont rétabli le bon fonctionnement général. Merci TooFatBoy.

En réalité, la feuille PANORAMIQUE est disponible à partir des colonnes DZ (130), et suivantes.

C'est dans cette zone que je vais transférer l'analyse en modifiant la codification pour cela.
Ainsi :
- n'aurai-je pas l'obligation de créer cette feuille Cible en 80ième feuille (!)... dans ma vraie application qui doit recevoir ces lignes de codes,
- gagnerai-je du temps de rotation de la macro qui, tout en étant rapide prend tout de même un moment pour analyser tout le pavé. Mais l'essentiel est que cela fonctionne maintenant : c'est génial.

Merci TooFatBoy, d'avoir trouvé le bug et merci pour cette aide si précieuse.
Cordialement,
Webperegrino
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Le Forum,
TooFatBoy,
Merci pour l'inf.
Je me suis aperçu que la cellule [D31] restait paresseuse lors du travail de la macro, avec sa formule intégrée.
Dans la partie 1°) j'ai placé le comptage du nombre de retours à la ligne de chaque cellule avant son transfert dans la Feuille Cib pour "analyse-déstructuration-reconstritution-et retour en Feuille Panoramique en lieu et place", en ajoutant ce qui est plus loin...
VB:
nb_RC = 0
For i = 1 to Len(Cells(lig,col))
   If MID(Cells(lig,col),i,1) = Chr(10) Then nb_RC = nb_RC + 1
Next i

Plus loin si nb_RC>1 alors on fait le transfert de la cellule dans Feuille Cible, sinon on passe à la cellule suivante...
Si bien que plus bas, en Feuille cible on sait déjà combien de retours à la ligne, et on n'a plus besoin de refaire le comptage les 5 lignes un peu plus bas sont ainsi neutralisées et inutiles pour le travail, avant le
VB:
CiB.Activate
..., que je conserve bien sûr.
Meric
Cordialement,
Webperegrino
 
Dernière édition:

Webperegrino

XLDnaute Impliqué
Supporter XLD
Le Forum,
Bonjour,
Je viens vous partager mes dernières simplifications dans les calculs que je demandais en #1.
Grâce aux excellents spécialistes ci-avant nommés, j'ai réussi à tout comprendre et à procéder de façon plus logique.
Si certains d'entre vous y trouvaient une utilisation personnelle, j'en serais ravi ; de mon côté, j'ai appris avec quelques nouvelles lignes de codes placées dans cette application.
Cordialement,
Webperegrino

Nota :
J'ai volontairement mis du désordre dans les cellules G33, BL35, BM29, BO31 et BS35.
Si vous demandez "TOUT LE PAVÉ DE PANORAMIQUE" en cellule de la Feuille "Cible", avant de cliquer sur le Bouton bleu clair, vous constaterez le côté redoutable de la macro sur ces cellules.
Tout le pavé sera analysé et remis en ordre cellule après cellule !

Dans mon application réelle 603 cellules sont analysée en 370s (0,6s/cellule).
Plus rapide, c'est peut-être possible, mais ceci me convient parfaitement pour le moment, je ne participe pas aux Jeux Olympiques d'Excel-Downloads 2024 non plus !!!.
 

Pièces jointes

  • VersionDu24_ORDONNATEUR DE CELLULES_TooFatBoy_1.xlsm
    147 KB · Affichages: 2

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 654
dernier inscrit
SADIKA