VBA Excel : Trier des Shapes

Résolu/Fermé
tuxboy Messages postés 994 Date d'inscription lundi 23 juillet 2012 Statut Membre Dernière intervention 28 mai 2019 - 21 mai 2019 à 15:00
tuxboy Messages postés 994 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

1 réponse

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié le 21 mai 2019 à 17:11
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
21 mai 2019 à 18:44
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
tuxboy Messages postés 994 Date d'inscription lundi 23 juillet 2012 Statut Membre Dernière intervention 28 mai 2019 189
22 mai 2019 à 09:00
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
22 mai 2019 à 09:51
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
tuxboy Messages postés 994 Date d'inscription lundi 23 juillet 2012 Statut Membre Dernière intervention 28 mai 2019 189
22 mai 2019 à 11:48
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
22 mai 2019 à 13:53
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