VBA Excel : Trier des Shapes

Résolu
tuxboy Messages postés 995 Date d'inscription   Statut Membre Dernière intervention   -  
tuxboy Messages postés 995 Date d'inscription   Statut Membre Dernière intervention   -
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 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
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 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
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 995 Date d'inscription   Statut Membre Dernière intervention   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
cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
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 995 Date d'inscription   Statut Membre Dernière intervention   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
cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
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