Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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: 7
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour @mapomme

J'ai voulu testé ce bout de code
Code:
Sub Test()
Dim s1 As Shape, s2 As Shape, tmp
For Each s1 In ActiveSheet.Shapes
    If s1.Type = msoGroup Then
        For Each s2 In s1.GroupItems
        tmp = s1.GroupItems.Parent.Name & " | " & s2.Name
        Debug.Print tmp
        Next s2
    End If
Next s1
End Sub
Ca produit des choses bizarres, non ?
 

Staple1600

XLDnaute Barbatruc
Re

@mapomme
Sinon selon le besoin et pour les musophiles, j'ai un biais en réserve

C'est d'ailleurs ce biais qui m'a permis de voir que mon test VBA ne disait pas tout

PS: Je préfère le point de croix à la Croisade
(surtout par les temps qui courent)

@mapomme
kado bonus
Une certaine inclinaison pour les formes ? )
PS: On dit inclinaison ou inclination ?
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Chapeau bas l’agrafe . Aucun souvenir de cette conversation... Le chouchen n'a pas encore eu d'effet sur ton cerveau et ta mémoire fonctionne encore à 100%. Mais ça ne va pas durer ...

Tout ça ne répond pas à ma préoccupation du moment. A savoir disposer d'un nom de groupe même imbriqué dans un autre et lister toutes les formes de base de ce groupe.

PS:
PS: On dit inclinaison ou inclination ?

Personnellement, pour ce cas j'opte pour "inclination". L'inclinaison c'est la tendance naturelle d'un corps à pencher suite à l'ingestion d'une trop grande quantité de chouchen (enfin du côté de Roahzon).
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

@mapomme
Tout ça ne répond pas à ma préoccupation du moment. A savoir disposer d'un nom de groupe même imbriqué dans un autre et lister toutes les formes de base de ce groupe.
De ce qu'on lit sur le net, cela n'a pas l'air possible en VBA, non ? (sans faire de UnGroup puis Group)
C'est d'ailleurs en cherchant des infos sur le net que je suis tombé sur ton kado bonus

PS: Pas intéressé par le biais ou pas musophile ?
 

Staple1600

XLDnaute Barbatruc
Re


@mapomme
On s'est bien compris ?
Le biais en question c'est utiliser en lieu et place de VBA le volet de sélection.
(selon le besoin donc)
Ma flèche sur le Groupe 26 a été mise là au hasard.
Ce n'était pas dans le but d'inciter à faire du ménage.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Ma flèche sur le Groupe 26 a été mise là au hasard.
Ce n'était pas dans le but d'inciter à faire du ménage.
Oui mais c'est tout de même bien de supprimer l'inutile.
Toujours est-il que par VBA, ça ne semble pas simple de repérer les groupes imbriqués.
Le biais est pratique et rapide dans l'environnement Excel.
J'ai cherché pas mal sur gogole mais je n'ai rien trouvé de pertinent en VBA... ni en français ni en grand-breton.
 

Staple1600

XLDnaute Barbatruc
Re

@mapomme
J'ai cherché pas mal sur gogole mais je n'ai rien trouvé de pertinent en VBA... ni en français ni en grand-breton.
Moi itou
C'est pourquoi je me suis mis à caresser ma souris

La question c'est comment fait le volet de sélection pour afficher tous les objets en un clic ?

Dommage qu'on ne puisse pas manipuler ce volet de sélection en VBA.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
La question c'est comment fait le volet de sélection pour afficher tous les objets en un clic ?
Oui j'acquiesce. Une chose qui me manque encore plus concerne la fonction Recherche (Ctrl+F).

Cette recherche à la mimine permet de trouver toutes les occurrences de ce qu'on cherche et si on fait Ctrl+A dans la partie inférieure (zone liste des résultats) alors toutes les cellules trouvées sont sélectionnées.

En VBA ce serait tellement simple de tout mettre (directement) dans un range accessible ou bien de retourner un tableau avec la liste des adresses ou encore de sélectionner les cellules résultats. Mais je dis Grèce !

Au sujet de ma question, personne (à par toi qui m'a fait re-découvrir le volet sélection ) ne semble s'y intéresser. Je suis profondément dépité , sniff .
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour mapomme, JM, le forum,
Au sujet de ma question, personne (à par toi qui m'a fait re-découvrir le volet sélection ) ne semble s'y intéresser. Je suis profondément dépité , sniff .
Bon je m'y intéresse et ce n'est pas vraiment compliqué.

Il suffit de dégrouper puis regrouper avec la bonne syntaxe, affecter cette macro au bouton :
VB:
Sub TEST1()
Dim vis As Boolean
With Sheets("Feuil1")
    vis = LCase(.[Q2]) = "oui"
    Select Case .[P2]
        Case "groupe 14"
            .Shapes("Group 14").Visible = vis
        Case "groupe 13"
            .Shapes("Group 14").Ungroup
            .Shapes("Group 13").Visible = vis
            With .Shapes.Range(Array("Groupe 12", "Groupe 13"))
                .Group
                .Name = "Groupe 14"
            End With
        Case "groupe 12"
            .Shapes("Group 14").Ungroup
            .Shapes("Group 12").Visible = vis
            With .Shapes.Range(Array("Group 12", "Group 13"))
                .Group
                .Name = "Groupe 14"
            End With
        Case "groupe 11"
            .Shapes("Group 14").Ungroup
            .Shapes("Group 12").Ungroup
            .Shapes("Group 11").Visible = vis
            With .Shapes.Range(Array("Group 10", "Group 11"))
                .Group
                .Name = "Groupe 12"
            End With
            With .Shapes.Range(Array("Group 12", "Group 13"))
                .Group
                .Name = "Groupe 14"
            End With
        Case "groupe 10"
            .Shapes("Group 14").Ungroup
            .Shapes("Group 12").Ungroup
            .Shapes("Group 10").Visible = vis
            With .Shapes.Range(Array("Group 10", "Group 11"))
                .Group
                .Name = "Groupe 12"
            End With
            With .Shapes.Range(Array("Group 12", "Group 13"))
                .Group
                .Name = "Groupe 14"
            End With
    End Select
End With
End Sub
A+
 

Pièces jointes

  • mapomme- Formes et groupes- v2- comm.xlsm
    30.2 KB · Affichages: 4

job75

XLDnaute Barbatruc
On peut simplifier la macro mais c'est moins parlant :
VB:
Sub TEST1()
With Sheets("Feuil1")
    If .[P2] <> "groupe 14" Then .Shapes("Group 14").Ungroup
    If .[P2] = "groupe 10" Or .[P2] = "groupe 11" Then .Shapes("Group 12").Ungroup
    .Shapes(.[P2]).Visible = LCase(.[Q2]) = "oui"
    If .[P2] = "groupe 10" Or .[P2] = "groupe 11" Then
        With .Shapes.Range(Array("Group 10", "Group 11"))
            .Group
            .Name = "Groupe 12"
        End With
    End If
    If .[P2] <> "groupe 14" Then
        With .Shapes.Range(Array("Group 12", "Group 13"))
            .Group
            .Name = "Groupe 14"
        End With
    End If
End With
End Sub
 

Pièces jointes

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

Discussions similaires

Réponses
31
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…