IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Ajouter une forme à un groupe de formes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut Ajouter une forme à un groupe de formes
    Je développe en VBA un programme de dessin assez particulier dans lequel on est amené à déplacer simultanément, avec la souris, plusieurs formes représentant des objets.

    Je n'ai aucun problème pour grouper les formes (avec la méthode "Group"), mais je voudrais savoir s'il est possible d'ajouter une ou plusieurs formes dans un groupe sans défaire ce groupe (par la méthode "Ungroup") et sans créer un nouveau groupe contenant le premier et les nouvelles formes.

    Défaire le groupe m'obligerait à mémoriser les formes qu'il contient pour les réintégrer dans le nouveau et cela me semble compliqué.
    Grouper les nouvelles formes avec le premier groupe créerait des "sous-groupes" qu'il me semble impossible à atteindre pour connaître et modifier leur propriétés (par la méthode "GroupItems").

    Quelqu'un aurait-il une solution à me proposer ou, si ce que je demande est impossible, une méthode rapide pour contourner le problème.

    D'avance, merci

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    L'objet GroupShapes renvoyé par la méthode GroupItems semble protégé en écriture.
    Il ne dispose pas d'une méthode Add...

    Une solution serait de créer une procédure VBA qui dégroupe, puis regroupe en ajoutant la forme voulue.
    Cordialement

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Voici une fonction qui réalise cela. Problème, elle sélectionne, et donc modifie l'interface utilisateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Function AddShapeInGroup(Group As Shape, NewShape As Shape)
        Dim c As New Collection
        Dim s As Shape
        Dim i As Long
     
        For Each s In Group.GroupItems
            c.Add s
        Next
        c.Add NewShape
        Group.Ungroup
        c(1).Select
        For i = 2 To c.Count
            c(i).Select False
        Next
        Selection.ShapeRange.Group
    End Function
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    On peut grouper une ou n formee à un groupe : cela crée un groupe de niveau supérieur donc à utiliser avec parcimonie...

  5. #5
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour Pierre,

    Ci-dessous une légère modification du code que vous proposez, sans l'utilisation de la sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function AddShapeInGroup(Group As Shape, NewShape As Shape)
        Dim aStr() As String
        Dim s As Shape
        Dim i As Long
        ReDim aStr(Group.GroupItems.Count)
        For Each s In Group.GroupItems
            aStr(i) = s.Name
            i = i + 1
        Next
        aStr(i) = NewShape.Name
        Group.Ungroup
        NewShape.Parent.Shapes.Range(aStr).Group
    End Function

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Bonjour Pierre,

    Ci-dessous une légère modification du code que vous proposez, sans l'utilisation de la sélection :[...]
    Je ne peux que plussoyer.

    Ce n'est jamais le top que ce genre de macro modifie l'interface, mais je n'ai pas pensé au tableau pour remplir le shape.range... (juste une chose, la ligne Dim astr() as String n'est pas nécessaire...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Nous essayons tous d'éviter l'utilisation des sélections. Patrick a eu la même idée, au même moment

    Dans ce cas particulier, l'enregistreur de macros induit quelque peu en erreur car il utilise un ShapeRange qui n'est utilisable qu'avec la sélection.
    Je m'interroge sur la raison de ce comportement de VBA...

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    sans sélectionner il te faut mémoriser dans une variable tableau

    exemple j'ajoute 5 Shape que je nomme et group en mémorisant leur nom dans une variable tableau

    ensuite je dégroupe et j'ajoute une Shape et je regroupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub test()
        Dim i#, mongroupe, shap As Shape
        ReDim tablo_shapes(5)
        'source msdn expression. AddShape( Type , Left , Top , Width , Height )
        For i = 0 To 4
            Set shap = ActiveSheet.Shapes.AddShape(i + 1, 10 + (50 * i), 50, 100, 100)
            shap.Name = "img" & i: tablo_shapes(i) = shap.Name
        Next
        Set mongroupe = ActiveSheet.Shapes.Range(tablo_shapes)
        mongroupe.Group
        mongroupe.Name = "toto"
        ' etape 2 ajout d'une shape supplémentaire au groupe dynamiquement
     
        ReDim Preserve tablo_shapes(0 To UBound(tablo_shapes) + 1)    'on ajoute un item a la variable tableau
     
        mongroupe.Ungroup ' on degroupe
        Set shap = ActiveSheet.Shapes.AddShape(55 + 1, 10 + (50 * i), 50, 100, 100)
        shap.Name = "img" & UBound(tablo_shapes): tablo_shapes(UBound(tablo_shapes)) = shap.Name
        Set mongroupe = ActiveSheet.Shapes.Range(tablo_shapes)
        mongroupe.Group
        mongroupe.Name = "Newtoto"
     
    End Sub
    avec la variable tableau tu peux faire les groupes que tu veux
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    En effet, l'idée est la même chez Patrick et chez toi.

    Je préfère cependant ta solution qui découle de la mienne car elle illustre l'idée qu'il faut sortir ce traitement spécifique du code en créant une procédure/fonction dont c'est l'unique rôle. On pourrait utiliser un argument de type Array pour envoyer plusieurs formes sur un groupe déjà existant au lieu d'envoyer un seul shape comme dans notre exemple.

    Ce découpage du code a de nombreux avantages comme: des tests facilités, une réutilisation accrue grâce à un couplage faible voire inexistant entre ce traitemetn particulier et le reste du code, des variables locales réduites plutôt qu'une litanie de variables dans un code spaghetti, etc.

    Dans tous les cas, je préfère de loin des codes isolés dans des fonctions qui reçoivent des arguments que du code tout en un
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui en effet ma présentation est dans une sub , j'aurais pu présenter la même chose en séparant la concaténation dans le tableau dans une fonction

    le but premier était 2 choses

    1. montrer comment ne pas sélectionner
    2. avoir un tableau de nom de shapes (on en fait ce que l'on en veut et comme on veut après )car par le nom on peut remonter toute les propriétés y compris le groupe name
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Merci à tous ceux qui m'ont aidé à résoudre mon problème.

    Mais je suis nouveau au club et je ne comprends pas comment terminer ma première discussion...

    Dans "Aide aux nouveau arrivants", je lis :

    5. Problème résolu▲
    Quand votre problème est résolu, pensez à l'indiquer en mettant le tag "resolu" dans le titre. Pour cela, il suffit de cliquer sur le bouton en bas à gauche.
    Cela évitera aux autres de continuer à chercher et cela permettra à quelqu'un ayant le même problème de gagner du temps dans ses recherches.
    Si vous abandonnez un sujet, vous pouvez également mettre le tag delestage en cliquant sur le bouton "Délestage"

    Quelqu'un peut-il me dire où je peux trouver ces boutons ?

    D'avance merci ...

  12. #12
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut Ajouter une forme à un groupe de formes
    J'aimerais revenir sur le problème que j'ai posé le 31 aout dernier.

    Encore merci à tous ceux qui y ont répondu. Leurs idées m'ont permis d'avancer dans mon travail.

    Cependant, j'ai fermé trop vite la discussion car dans la première réponse de Pierre Fauconnier et dans ses échanges avec Ben_L et Patricktoulon, il était question d'interface et de sélection, et je n'ai pas compris ce qu'il voulaient dire et pourquoi cela posait un problème dans la première solution (de Pierre Fauconnier).

    Aujourd'hui, en retravaillant le sujet je suis tombé sur une solution plus simple que toutes celles qui ont été proposées. Mais en repensant à ce que j'ai écrit ci-dessus, j'ai bien peur que vous allez me la rejeter car je joue sur la sélection des formes. Pouvez-vous m'expliquer en quoi cela pose problème ?

    Voici ma solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function AddShapeInGroup(Group As Shape, NewShape As Shape)
    Dim GrName As String
    Group.Ungroup.Select
    NewShape.Select False
    With Selection.ShapeRange.Group: .Name = GrName: End With
    End Function
    Vous remarquerez que cette solution a en plus l'avantage d'attribuer au nouveau groupe le nom du groupe initial.

    Si ce n'est pas abuser, j'aimerais aussi que l'on m'explique la dernière instruction de la solution de Ben_L :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewShape.Parent.Shapes.Range(aStr).Group
    En fait, c'est le propriété (ou méthode ?) "Parent" que je ne comprend pas. Pouvez-vous m'éclairer là dessus ?

    D'avance, merci

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir question 1
    le selection oui/non pourquoi
    en premier lieu cela t'oblige a travailler sur le sheets ou se trouvent les shapes
    il y donc activation du sheets
    + la section multiple
    = risque de surcharge mémoire


    question 2 "parent "
    la réponse est simple

    pour identifié ou manipuler une shape il te faut son nom ou son index + la ,ou elle se trouve(le quel sheets)

    pour cela le sheets n'est pas injecté en argument dans ta fonction il te faut alors remonter jusqu'à lui
    ta ligne
    NewShape.Parent.Shapes.Range(aStr).Group

    traduction
    le parent du shape . la collection de shape(nom de ce group).group

    et donc sheet(xxxx). colection de shape(yyyy).group

    autrement dis dans ce cas present newshape .parent c'est l'object worksheet


    newshape.parent.name te donnera le nom du sheet ou elle se trouve
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Merci Patricktoulon,

    Je suis sur un autre truc urgent.
    Dés que possible, je regarde en détail ta réponse qui me semble très utile.

    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VI-2010] Proprité de forme à un groupe de forme
    Par dvclemen dans le forum Visio
    Réponses: 0
    Dernier message: 15/01/2015, 11h03
  2. Réponses: 2
    Dernier message: 20/09/2010, 12h13
  3. AJouter un champs hidden dans un form puis soumettre me form
    Par Attrox dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/03/2009, 09h27
  4. Réponses: 7
    Dernier message: 12/06/2006, 13h32
  5. Prob d'ajout d'une prop d'element de form ss FireFox
    Par drizztoli dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/10/2005, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo