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 :

Problème de gestion de nom de groupes de Shapes [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut Problème de gestion de nom de groupes de Shapes
    Bonjour à tous,

    Je travaille sur une macro destinée à créer les schéma d'un ensemble de batch, avec leur dépendance. Je dois construire ce schéma à partir d'une liste d'objets et certaines de leur caractéristiques.
    Sous certaines conditions, je dois relier certains objets avec une flèche coudée constituée de 3 parties distinctes qui sont ensuite groupées (car cette forme n'existe pas dans Excel).

    Au sein d'un boucle, j'ai ceci :

    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
     
    'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
    With ActiveSheet.Shapes
        .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie1"
        .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie2"
        .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie3"
        With .Range(Array("FlechePartie1", "FlechePartie2", "FlechePartie3")).Group
            With .Line
                .Visible = msoTrue
                .Weight = 2
                .ForeColor.RGB = Couleur 'la couleur du trait est variabilisée.
                .Transparency = 0
            End With
            With .GroupItems(3).Line
                .EndArrowheadStyle = msoArrowheadOpen
            End With
        End With
    End With
    La macro fonctionne très bien pour la première occurence : mes traits sont créés, groupés, mis en forme, nickel.
    Elle se plante ensuite lors de la deuxième occurence : les traits sont créés, et l'erreur '1004' survient lors du groupement des 3 formes.

    De ce que j'en comprends, j'essaie de grouper la première forme qui est déjà groupée, d'où l'erreur.
    Comment se fait-il que la macro ne prenne pas les 3 formes nommées que l'on vient juste de créer pour les grouper?

    J'ai essayé de nommer explicitement le groupe pour ne pas subir la numérotation de l'index, sans succès.
    Même si j'arrive à nommer les groupes avec un numéro contrôlé via une variable (genre GrpNum), je n'arrive pas ensuite à les "appeler"pour appliquer les mises en forme.

    Pourriez-vous m'aider sur ce point?

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Bonjour,

    Personne n'est donc inspiré par cette question?

    Fenrys

  3. #3
    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
    bonjour
    testé ca fonctionne
    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
    Sub test()
    LignePredecesseur = 3
    LigneSchema = 6
    couleur = vbRed
    'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
    With ActiveSheet.Shapes
        .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie1"
        .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie2"
        .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie3"
        With .Range(Array("FlechePartie1", "FlechePartie2", "FlechePartie3")).Group
            With .Line
                .Visible = msoTrue
                .Weight = 2
                .ForeColor.RGB = couleur 'la couleur du trait est variabilisée.
                .Transparency = 0
            End With
            With .GroupItems(3).Line
                .EndArrowheadStyle = msoArrowheadOpen
            End With
        End With
    End With
    End Sub
    Nom : Capture.JPG
Affichages : 433
Taille : 16,6 Ko
    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

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Je viens de voir que 2 formes peuvent porter le même nom.
    Il doit avoir du mal à s'y retrouver. A la 2nde utilisation met FlechePartie4, FlechePartie5, FlechePartie6.
    Ou bien duplique Group1 si les longueurs des segments sont les mêmes.
    erric

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Bonjour,

    Merci pour vos retours.

    @Patrick : tu as raison, le code fonctionne parfaitement de manière unitaire. Comme le précisé eriiic, le pb se pose lorsque que l'on créé ces groupes de Shapes en boucle.

    Voici par ex le code modifié pour boucler :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub test()
     
    x = 0
    Boucle = 1
     
    For Boucle = 1 To 3
        LignePredecesseur = 3 + x
        LigneSchema = 6 + x
        couleur = vbRed
        'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
        With ActiveSheet.Shapes
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie1"
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie2"
            .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie3"
            With .Range(Array("FlechePartie1", "FlechePartie2", "FlechePartie3")).Group
                With .Line
                    .Visible = msoTrue
                    .Weight = 2
                    .ForeColor.RGB = couleur 'la couleur du trait est variabilisée.
                    .Transparency = 0
                End With
                With .GroupItems(3).Line
                    .EndArrowheadStyle = msoArrowheadOpen
                End With
            End With
        End With
     
        Boucle = Boucle + 1
        x = x + 4
    Next Boucle
     
    End Sub
    Le premier groupement se fait très bien, ensuite la macro créé bien les 3 shapes suivants mais ne peut pas les grouper, et elle ne peut donc appliquer la mise en forme.

    Mon problème est que je j'ai tenté de forcer le nom du Groupe créé, mais que je ne parviens pas ensuite à sélectionner le groupe pour lui appliquer la mise en forme.
    J'ai tenté ceci sans succès :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    x = 0
    Boucle = 1
     
    For Boucle = 1 To 3
        LignePredecesseur = 3 + x
        LigneSchema = 6 + x
        couleur = vbRed
        'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
        With ActiveSheet.Shapes
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie1"
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie2"
            .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie3"
        End With
     
        Set Objet = ActiveSheet.Shapes.Range(Array("FlechePartie1", "FlechePartie2", "FlechePartie3")).Group
        Objet.Name = "Groupe" & Boucle
        ActiveSheet.Shapes(Objet).Select
                With Objet.Line
                    .Visible = msoTrue
                    .Weight = 2
                    .ForeColor.RGB = couleur 'la couleur du trait est variabilisée.
                    .Transparency = 0
                End With
                With Objet.GroupItems(3).Line
                    .EndArrowheadStyle = msoArrowheadOpen
                End With
     
        Boucle = Boucle + 1
        x = x + 4
    Next Boucle
     
    End Sub
    Et je ne peux pas dupliquer le groupe car le segment vertical a une longueur variables avec mes données actuelles.

    Fenrys

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Je te proposais aussi de changer tes noms à chaque passage...
    Vu que tu peux avoir 10 FlechePartie1, à mon avis il se fait des noeuds au moment de grouper et prend le 1er qui est déjà groupé.
    eric

  7. #7
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Désolé eriiic, je n'avais pas vu ...

    En effet, ça corrige bien le problème avec ceci :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Sub test()
     
    x = 0
    Boucle = 1
     
    For Boucle = 1 To 3
        LignePredecesseur = 3 + x
        LigneSchema = 6 + x
        couleur = vbRed
        'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
        With ActiveSheet.Shapes
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie" & 1 + 3 * Boucle
            .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie" & 2 + 3 * Boucle
            .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie" & 3 + 3 * Boucle
            With .Range(Array("FlechePartie" & 1 + 3 * Boucle, "FlechePartie" & 2 + 3 * Boucle, "FlechePartie" & 3 + 3 * Boucle)).Group
                With .Line
                    .Visible = msoTrue
                    .Weight = 2
                    .ForeColor.RGB = couleur 'la couleur du trait est variabilisée.
                    .Transparency = 0
                End With
                With .GroupItems(3).Line
                    .EndArrowheadStyle = msoArrowheadOpen
                End With
            End With
        End With
     
        Boucle = Boucle + 1
        x = x + 4
    Next Boucle
     
    End Sub
    Merci beaucoup.

    Fenrys

  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
    re
    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
    24
    25
    Sub test()
        For i = 3 To 30 Step 5
     
            LignePredecesseur = i
            LigneSchema = i + 3
            couleur = vbRed
            'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
            With ActiveSheet.Shapes
                .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2).Name = "FlechePartie" & i
                .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie" & i + 1
                .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2).Name = "FlechePartie" & i + 2
                With .Range(Array("FlechePartie" & i, "FlechePartie" & i + 1, "FlechePartie" & i + 2)).Group
                    With .Line
                        .Visible = msoTrue
                        .Weight = 2
                        .ForeColor.RGB = couleur    'la couleur du trait est variabilisée.
                        .Transparency = 0
                    End With
                    With .GroupItems(3).Line
                        .EndArrowheadStyle = msoArrowheadOpen
                    End With
                End With
            End With
        Next
    End Sub
    resultat
    Nom : Capture.JPG
Affichages : 413
Taille : 50,7 Ko
    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
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Re Patrick,

    Ca revient à ce qu'il a mis non?
    Ou je ne vois pas qq chose...
    eric

  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
    oui a peu pres j'avais pas bien lu sa reponse

    maintenant on peu rester dans l'inconu et ne pas avoir besoins de connaitre le nom des shapes
    il suffit de procéder legerement différement
    comm ceci et la tu n'a plus de probleme d'incrementation pour le nom des shapes d'ailleurs je ne les nomme pas
    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
    24
    25
    Sub test()
        For i = 3 To 30 Step 5
                LignePredecesseur = i
            LigneSchema = i + 3
            couleur = vbRed
            'NB : le numéro des lignes est variabilisé du fait de l'utilisation dans une boucle
            With ActiveSheet.Shapes
                Set ligne1 = .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2, Range("I" & LignePredecesseur).Left, Range("I" & LignePredecesseur).Top + Range("I" & LignePredecesseur).Height / 2)
                Set ligne2 = .AddConnector(msoConnectorStraight, Range("H" & LignePredecesseur).Left, Range("H" & LignePredecesseur).Top + Range("H" & LigneSchema).Height / 2, Range("H" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2)
                Set ligne3 = .AddConnector(msoConnectorStraight, Range("H" & LigneSchema).Left, Range("H" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2, Range("I" & LigneSchema).Left, Range("I" & LigneSchema).Top + Range("I" & LigneSchema).Height / 2)
     
                With .Range(Array(ligne1.Name, ligne2.Name, ligne3.Name)).Group
                    With .Line
                        .Visible = msoTrue
                        .Weight = 2
                        .ForeColor.RGB = couleur    'la couleur du trait est variabilisée.
                        .Transparency = 0
                    End With
                    With .GroupItems(3).Line
                        .EndArrowheadStyle = msoArrowheadOpen
                    End With
                End With
            End With
        Next
    End Sub
    voila
    par contre on pourrais tres bien donner des noms aux groupe si 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

  11. #11
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Bonjour Patrick,

    Ca marche très bien comme ça en effet. Il n'est même pas nécessaire de nommer les groupes (enfin, dans le cadre de mon besoin).

    Merci à tous les deux.

    Fenrys

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/08/2015, 11h40
  2. Réponses: 1
    Dernier message: 14/02/2014, 10h09
  3. [W2003]problème de gestion de stratégie de groupe
    Par m_jaz3 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 27/03/2007, 20h35
  4. [CR9] [CRXI] Problème de mise en forme sur un nom de groupe
    Par Maltus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/09/2006, 11h32
  5. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 16h35

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