Microsoft 365 Formes, groupe de formes, groupe de groupes, etc.

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

J'ai été amené à répondre à un membre de XLP (voir la discussion ici) qui demandait comment accéder aux formes de base composant un groupe dont on connait le nom. Les groupes peuvent être imbriqués.

Je pensais qu'avec le nom du groupe une simple boucle suffirait à le faire mais que non m'a répondu le questionneur. Alors j’ai un peu poussé plus loin.

En parcourant les formes d'une feuille, seul un niveau de groupe est accessible. Les autres niveaux semble-t-il restent hors de portée 😒.

Le seul moyen que j'ai trouvé pour accéder aux groupes du niveau suivant est de dissocier tous les groupes du niveau courant et de recommencer un parcours.

Mais dans ce cas, les groupes du niveau actuel disparaissent (pas leurs objets mais le groupe). Il faudrait donc ensuite les recréer mais on perd alors leurs noms par défaut initiaux.
Si on duplique la feuille, tous les noms des groupes sont modifiés. La seule méthode que j'ai trouvée qui conserve les noms est la duplication du classeur. Mais ça entraine un ralentissement.

En résumé, j'ai eu du mal à arriver à mes fins et ça ne me satisfait pas complètement.

Un autre point qui m'a donné du fil à retordre est le fait qu'Excel attribue un nom par défaut aux groupes qu'on crée via la le menu "grouper". Ce nom est francisé "Groupe 5" par exemple. Mais dans les propriétés des objets on trouve le nom par défaut "Group 5" qui est le nom américain (lanque que cause VBA). Alors si on cherche en VBA "Groupe 5" tel qu'affiché dans excel, on ne le trouve point! Il faut en fait chercher "Group 5".

Mais comme je sais que je suis un gars qui pond souvent des trucs alambiqués (et pourtant l’alambic c'est bien, non?), je voulais vous demander si vous aviez une méthode plus simple et/ou plus rapide ?

En général pour ce genre de chose, quelqu'un me sort un code simplissime, rapide, efficace et souvent évident 🤨.

D'avance, merci.

nota: je vous ai mis ma production dans un classeur entièrement commenté. C'est-ti pas une jolie attention ça 😜?
  • Tout le code pour la fonction est dans le module : ModuleShapeGroup
  • Un exemple de code pour utiliser la fonction est dans le module : Module1
  • en cellule P2 sélectionner un groupe, en cellule Q2 choisirsi on affiche ou non le groupe puis cliquer sur Hop!
 

Pièces jointes

  • mapomme- Formes et groupes- v2- comm.xlsm
    30.7 KB · Affichages: 6
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
j'arrive après la bataille moi 😁

bon alors deja pour lister les shapes et eventuellement l'arborescence de groupe imbriqué
la seule solution que je connaisse c'est comme (pour toute arborescence )passer par une fonction recursive
alors du coup je me suis lancé dans un petit truc toute simple
a ma grande surprises les groupe et subgroup sont bien reconnus mais excel considère que a partir du moment ou on groupe x sub groupes toutes les shapes (tout sub groupe confondu) sont enfant du groupe de groupe

et je dis cela malgré qu'avec la souris on peut bien voir qu' en les déplaçant les sougroupe restent soudés

donc parti de la même si j'arrive a me lister toutes les shapes et même si les groupes seul (sans sous groupe sont bien listés les arborescences de plus de un niveau sont compliquées

je continue mon investigation car sur 2007 j'ai le bon résultat pour l'arborescence complète
mais sur 2013 il considère le parent general des sous groupes comme le parent de toute les shapes dans le groupe tout niveau confondus
 

patricktoulon

XLDnaute Barbatruc
re
je confirme
sur 2013 et 2016 quand on regroupe de groupes toutes les shapes appartiennent a ce nouveau groupe

resultat que j'ai sur le fichier de @mapomme

il n'y a pas de groupe 10 , 11 etc.....

demo.gif

Straight Arrow Connector 55 --->enfant de Feuil1
---------
Straight Arrow Connector 57 --->enfant de Feuil1
---------
Straight Arrow Connector 59 --->enfant de Feuil1
---------
Straight Arrow Connector 61 --->enfant de Feuil1
---------
Rectangle : coins arrondis 15 --->enfant de Feuil1
---------
groupe : Group 14 ---> enfant de Feuil1
Parallélogramme 120 ---> enfant du Group 14
Parallelogram 17 ---> enfant du Group 14
Rectangle 33 ---> enfant du Group 14
Parallelogram 34 ---> enfant du Group 14
Diamond 50 ---> enfant du Group 14
Rectangle : avec coins rognés en diagonale 52 ---> enfant du Group 14
---------
Left Brace 1 --->enfant de Feuil1
---------
Left Brace 2 --->enfant de Feuil1
---------
Left Brace 3 --->enfant de Feuil1
---------
Drop Down 7 --->enfant de Feuil1
---------
VB:
Sub testlecturePat()
   Dim i As Long
   With ActiveSheet
        For i = 1 To .Shapes.Count
            you_ouh_les_shapesP .Shapes(i), .Name
        Next
    End With
End Sub
Function you_ouh_les_shapesP(shap, ByVal pname)
    Dim SubShap
    If shap.Type = msoGroup Then
        Debug.Print "groupe : " & shap.Name & " --->" & vbTab & vbTab & "enfant de  " & pname

        For Each SubShap In shap.GroupItems

            If SubShap.Type = msoGroup Then
                you_ouh_les_shapesP SubShap, shap.Name
            Else
                Debug.Print SubShap.Name & " --->" & vbTab & vbTab & "enfant du " & SubShap.ParentGroup.Name
            End If
        Next
    Else
        Debug.Print shap.Name; " --->enfant de " & pname

    End If
    Debug.Print "---------"

End Function
 

job75

XLDnaute Barbatruc
Bonsoir Patrick,

Une solution qui fonctionnera dans tous les cas de figure sera forcément assez compliquée.

En adaptant la macro à chaque cas particulier c'est normalement plus simple : ma macro du post #15 ne fait que 19 lignes.

A+
 

patricktoulon

XLDnaute Barbatruc
re
je sais pas ce que fait ta macro @job 75 mais effectivement sur 2013
quand je regroupe deux groupe je ne peux plus déplacer les sous groupe alors que sur 2007 je pouvais
et quand je dissocie les deux groupes se reforment
va comprendre charles

ps je viens de relire ton #post15
et oui mais là les noms de groupes sont explicites
donc ton principe c'est de dissocier au niveau supérieur
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @job75 :), @patricktoulon :)

Merci à tous les deux de vous être intéressés à ma question 👌.

@job75 :
Tes solutions fonctionnent bien si on connait l'arborescence. Mais sur un ensemble inconnu de shapes, groupes, groupes de groupes, je ne vois pas comment l'adapter.

C'est pourquoi, j'avais converti le problème :
En entrée on a une feuille et un nom de groupe et en sortie on a une collection avec les formes de base du groupe. Pour l'instant, une solution simple était de dupliquer le classeur et de travailler sur la feuille et de dégrouper successivement chaque groupe d'un niveau jusqu'à trouver le groupe recherché.

@patricktoulon :
re
je sais pas ce que fait ta macro @job 75 mais effectivement sur 2013
quand je regroupe deux groupe je ne peux plus déplacer les sous groupe alors que sur 2007 je pouvais
et quand je dissocie les deux groupes se reforment
va comprendre charles

ps je viens de relire ton #post15
et oui mais là les noms de groupes sont explicites
donc ton principe c'est de dissocier au niveau supérieur

Et en plus tu m'apprends que ça dépend des versions d'Excel :mad:. Je ne pense pas que ma solution soit liée à une version mais comme je n'ai plus que O365, c'est invérifiable.
 

patricktoulon

XLDnaute Barbatruc
re
quel est l’intérêt @mapomme car si je ne me trompe pas une des shapes que tu aurais éventuellement pu sélectionner et ou cibler en dégroupant regroupant etc.. pour la recherche ne sera plus accessible a partir du membre activesheet.shapes(le nom)
donc je répète quel est l'intérêt
a part faire quelque chose avec ou dessus pendant que c'est dégroupé je vois pas ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @job75 :) ,
Pourquoi inconnu ? Il suffit de savoir lire et d'appliquer la commande "Dissocier".

J'ai un gros coup de "mou" :(. Il suffit de savoir lire. Mais lire quoi et où ?

En attendant, voici une macro qui pour la feuille Feuil1 liste toutes les formes et tous les groupes ainsi que les formes qui composent chacun des groupes.
 

Pièces jointes

  • mapomme- Lister formes et groupes (et composants)- v1.xlsm
    38.5 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
ben effectivement @job75 a raison
il faut
lister les shapes niveau feuille
boucler sur ces shapes et
si group degrouper
boucler sur shapes niveau feuille
recupérer les nouveau
si group degrouper
et ainsi de suite jusque dernier niveau de chaque shapes de niveau feuille de départ
 

mapomme

XLDnaute Barbatruc
Supporter XLD
il faut
lister les shapes niveau feuille
boucler sur ces shapes et
si group degrouper
boucler sur shapes niveau feuille
recupérer les nouveau
si group degrouper
et ainsi de suite jusque dernier niveau de chaque shapes de niveau feuille de départ

C'est bien ce que je fais depuis le début non ?

Sauf que j'agis sur une copie car si jamais la macro plante alors l'état des groupes a une forte chance d'être incohérent.
 

Aeggie78

XLDnaute Nouveau
Bonjour,

Dans Office 365, il est possible d'accéder aux sous-objets d'un groupe de formes sans dé-grouper.

Quand on parcourt une collection de forme, il faut tester le type par :
if myShape.Type = msoGroup 'Nb: MsoShapeType : msoGroup = 6

Pour explorer un groupe de formes déjà sélectionné, voici un bout de code

Sub Test_GroupObject()
If TypeName(Selection) <> "GroupObject" Then Exit Sub

Dim myShape As Shape
Set myShape = Selection.ShapeRange(1)
MsgBox "myShape.Type = " & myShape.Type

Dim mygroupshapes As GroupShapes
Set mygroupshapes = myShape.GroupItems
If mygroupshapes.Count <= 0 Then Exit Sub

Dim mySubShape As Shape
msg = "Liste des " & mygroupshapes.Count & " objets à l'intérieur du groupe """ & myShape.Name & """ :"
For Each mySubShape In mygroupshapes
msg = msg & vbLf & mySubShape.ID & " : " & mySubShape.Name
Next
MsgBox msg
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 235
Membres
103 497
dernier inscrit
JP9231