Menu

VBA Excel : Trier des Shapes [Résolu]

Messages postés
1184
Date d'inscription
lundi 23 juillet 2012
Statut
Membre
Dernière intervention
28 mai 2019
- - Dernière réponse : tuxboy
Messages postés
1184
Date d'inscription
lundi 23 juillet 2012
Statut
Membre
Dernière intervention
28 mai 2019
- 22 mai 2019 à 16:09
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
Afficher la suite 

1 réponse

Messages postés
6117
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juin 2019
372
0
Merci
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



tuxboy
Messages postés
1184
Date d'inscription
lundi 23 juillet 2012
Statut
Membre
Dernière intervention
28 mai 2019
109 -
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.
cs_Le Pivert
Messages postés
6117
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juin 2019
372 -
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à
tuxboy
Messages postés
1184
Date d'inscription
lundi 23 juillet 2012
Statut
Membre
Dernière intervention
28 mai 2019
109 -
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
cs_Le Pivert
Messages postés
6117
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 juin 2019
372 -
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://www.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
tuxboy
Messages postés
1184
Date d'inscription
lundi 23 juillet 2012
Statut
Membre
Dernière intervention
28 mai 2019
109 -
Ok, encore un grand merci pour ton aide, je vais faire avec ça, le reste du sujet est ardu, concerne du "bin-packing"
Commenter la réponse de cs_Le Pivert