VBA Excel : Trier des Shapes

Résolu
tuxboy Messages postés 1083 Statut Membre -  
tuxboy Messages postés 1083 Statut Membre -
Bonjour à tous,

Je souhaite trier toutes les Shapes d'une feuille de la plus petite à la plus grande en les repositionnant depuis le haut à gauche

Document joint :
https://www.cjoint.com/c/IEvm2uFPust

éventuellement en s'appuyant sur ce tri :
https://wellsr.com/vba/2018/excel/vba-quicksort-macro-to-sort-arrays-fast/#Example

Avec mes remerciements pour toute l'aide que vous m'apporterez.

Configuration: debian 6.05

1 réponse

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    voici un exemple à télécharger:

    https://www.cjoint.com/c/IEvo1IVMR5Q

    corriger l'ordre des macros comme ceci:

    Private Sub CommandButton1_Click()
    boucleshape
    LireTexteShapes
    Trishape
    Resultat
    End Sub


    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Pour effacer le texte dans les shapes et sur la feuille

      Sub effacer()
      For Each s In ActiveSheet.Shapes
       ActiveSheet.Shapes(s.Name).TextFrame.Characters.Text = ""
       Range("A10:C13").ClearContents
         Next s
       End Sub


      Tu peux ajouter des shapes en adaptant le code :-)

      Voilà

      @+ Le Pivert
      0
    2. tuxboy Messages postés 1083 Statut Membre 190
       
      Salut cs_Le Pivert et merci pour ta réponse qui m'a appris beaucoup.

      J'ai dupliqué chaque Shape, et modifié la procédure Resultat en conséquence.
      Sub Resultat()
      
      Dim posx As Integer
      Dim posy As Integer
      
      posx = [B2].Left
      posy = [B2].Top
      
      For Each s In ActiveSheet.Shapes
       ActiveSheet.Shapes(s.Name).Top = posy
       ActiveSheet.Shapes(s.Name).Left = posx
       posx = posx + ActiveSheet.Shapes(s.Name).Width
      Next s
       
       
      End Sub
      


      La collection Shape n'est pas triée.
      0
    3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      C'est normal qu'elle ne soit pas triée!

      Le tri n'est pas fait ,tu te contentes de faire une boucle sur les shapes!

      Le tri est fait sur la plage Range("A10:C13") et sur les surfaces qui sont sur la plage: Range("B10:B13")

      Je crois que tu n'as pas compris le processus!

      On inscrit les surfaces de chaque shape
      On les met sur la plage: Range("B10:B13")
      On fait le tri sur la plage Range("A10:C13")
      Il suffit de se servir de ces données ensuite pour positionner les shapes

      Voilà
      0
    4. tuxboy Messages postés 1083 Statut Membre 190
       
      Effectivement, ce code :

      Sub Resultat()
      Dim posx As Integer
      Dim posy As Integer
      
      posx = [D2].Left
      posy = [D2].Top
      
      i = 9
      For Each s In ActiveSheet.Shapes
       i = i + 1
       ActiveSheet.Shapes(Cells(i, 1)).Left = posx
       ActiveSheet.Shapes(Cells(i, 1)).Top = posy
       posx = posx + ActiveSheet.Shapes(Cells(i, 1)).Width
      Next s
       
      
      End Sub


      fonctionne parfaitement, mais je souhaitais initialement trier la collection de Shapes directement sans passer par un affichage des données. Est-ce possible ?

      Ce tri est un extrait d'une problématique plus large. Je te présente ce classeur pour y faire suite, où j'ai introduit un passage à la ligne en cas de dépassement d'une marge fixée ici en [T2].left

      https://www.cjoint.com/c/IEwjTOKnd0t


      La question est de savoir si on peut optimiser le tri pour minimiser la hauteur totale ?
      Merci tout plein
      0
    5. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      trier la collection de Shapes directement sans passer par un affichage des données.

      Pour faire le tri il faut la surface des shapes

      Tu peux toujours effacer:

      https://forums.commentcamarche.net/forum/affich-36034442-vba-excel-trier-des-shapes#2

      la question est de savoir si on peut optimiser le tri pour minimiser la hauteur totale ?

      je ne vois pas, les shapes se touchent
      0