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 :

Grouper les formes à l'intérieur d'une zône de la feuille


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut Grouper les formes à l'intérieur d'une zône de la feuille
    Bonjour,
    je voudrais sélectionner à partir d'un macro toutes les formes présentes sur une zone de la feuille et la renommer à partir d'une variable.
    Ceci se fait manuellement avec Excel 2007 par l'onglet "accueil - rechercher et sélectionner - sélectionner les objets"
    Malheureusement l'enregistreur de macro ne fonctionne pas pour ce genre d'action et mes recherches sur le forum sont infructueuses.
    Pourriez-vous m'aider s'il vous plait ?
    D'avance merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ça devrait ressemble à quelque chose comme ça pour grouper les formes de ta plage

    regarde si ainsi c'est déjà ok

    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
    Sub Grouper()
    Dim Forme As Shape
    Dim Plage As Range
    Dim ListeForme() As Variant
    Dim Existant As Boolean
     
    With Sheets("Feuil1")
        Set Plage = .Range("A1", "Z20")
     
        For Each Forme In .Shapes
            If Forme.Left >= Plage.Left _
            And Forme.Left < Plage.Left + Plage.Width _
            And Forme.Top + Forme.Height >= Plage.Top _
            And Forme.Top < Plage.Top + Plage.Height Then
                If Not Existant Then
                    ListeForme = Array(Forme.Name)
                    Existant = True
                Else
                    ReDim Preserve ListeForme(UBound(ListeForme) + 1)
                    ListeForme(UBound(ListeForme)) = Forme.Name
                End If
            End If
        Next Forme
     
        If Existant Then
            .Shapes.Range(ListeForme).Group
        Else
            MsgBox "Aucune forme sur la plage : " & Plage.Address
        End If
    End With
     
    End Sub

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut
    Merci pour ta réponse joe,
    j'en déduis donc qu'il faut en passer par l'analyse de la position de toutes les formes de la feuille.
    Je pensais pouvoir déterminer une zone et grouper directement toutes les formes s'y trouvant.
    En tous cas j'ai la possibilité de le faire et c'est le principal.
    MERCI TOUT PLEIN !!

    Et pour renommer le groupe ainsi créé avec une variable, comment faut-il faire s'il te plait ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    c'est la première fois de ma vie que je manipule des Groupes (et des formes qui ne sont pas des graphiques) j'en sais rien

    je regarde tout à l'heure si je trouve quelque chose

    d'ailleurs, ma méthode de détection des formes n'est peut être pas la plus efficace, sait-on jamais

    mais dans la mesure où les formes ne sont pas "dans" les cellules, mais "au dessus" des cellules, je ne voyais pas d'autre solution ... vu que même manuellement on ne peut pas le faire (si tu sélectionnes une plage avec ta souris ou ton clavier, ça ne sélectionne pas les formes

    Voilà la suite

    la variable LesFormes contient ton groupe de formes

    par exemple : LesFormes.Height = 200 va modifier la hauteur de chaque forme (ils feront 200 points)

    j'en ai profité pour ajouter deux choses :

    - gestion du cas où une seule forme/groupe de forme est dans la plage : avertissement et arrêt de la macro car impossible de grouper une seule forme
    - la partie qui vérifie si la forme est positionnée dans la plage est maintenant une fonction indépendante : tu peux facilement l'utiliser dans plusieurs procédures sans avoir à remettre cette quadruple conditionnelle qui surcharge l'écriture du code

    amuses-toi bien

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Sub Grouper()
    Dim Forme As Shape
    Dim LesFormes As ShapeRange
    Dim Plage As Range
    Dim ListeForme() As Variant
    Dim Existant As Boolean
     
    With ThisWorkbook.Worksheets("Feuil1")
        Set Plage = .Range("A1", "Z120")
     
        For Each Forme In .Shapes
            If FormeInPlage(Forme, Plage) Then
                If Not Existant Then
                    ListeForme = Array(Forme.Name)
                    Existant = True
                Else
                    ReDim Preserve ListeForme(UBound(ListeForme) + 1)
                    ListeForme(UBound(ListeForme)) = Forme.Name
                End If
            End If
        Next Forme
     
        If Not Existant Then
            MsgBox "Aucune forme sur la plage : " & Plage.Address
            Exit Sub
        ElseIf UBound(ListeForme) = 0 Then
            MsgBox "Impossible de grouper, une seule forme (ou groupe de formes) détectées"
            Exit Sub
        Else
            .Shapes.Range(ListeForme).Group.Select
            Set LesFormes = Selection.ShapeRange
        End If
    End With
     
    End Sub
     
    Function FormeInPlage(Forme As Shape, Plage As Range) As Boolean
     
    If Forme.Left >= Plage.Left _
    And Forme.Left < Plage.Left + Plage.Width _
    And Forme.Top + Forme.Height >= Plage.Top _
    And Forme.Top < Plage.Top + Plage.Height Then
        FormeInPlage = True
    End If
     
    End Function

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut
    Merci Joe
    Je réponds tout d'abord à ton deuxième post.
    Comme je le disais dans mon premier post il est possible de sélectionner un ensemble de cellules sous 2007 sous l'onglet "accueil" puis tout au bout à droite l'onglet "Rechercher et sélectionner" et enfin "sélectionner les objets".
    En tous cas pour quelqu'un qui n'a jamais manipulé les formes, Bravo !
    Je crois avoir tout ce qu'il me faut pour mettre au point ma macro.
    Je te tiens au courant ...
    Et merci encore !

    Eh bien ça fonctionne !
    Le seul changement effectué est pour nommer la macro avec une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim nom_groupe As String
    .Shapes.Range(ListeForme).Group.Select
            Selection.Name = nom_groupe
    Merci !

  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
    Bonjour,

    Pour repérer toutes les formes d'une plage tu peux boucler sur les shapes et regarder la propriété .topLeftCell (ou .topLeftCell.address)
    eric

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

Discussions similaires

  1. [XL-2007] Convertir les formes en image avec une macro
    Par amapacha dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/09/2014, 16h41
  2. Placer tous les liens à l'intérieur d'une div
    Par d10g3n dans le forum jQuery
    Réponses: 1
    Dernier message: 13/01/2010, 17h17
  3. extraire les nombres à l'intérieur d'une cellule
    Par soipx dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/06/2009, 18h23
  4. Réponses: 1
    Dernier message: 02/05/2008, 02h19
  5. Gérer les guillemeets à l'intérieur d'une chaîne
    Par LAGARDETTE dans le forum ASP
    Réponses: 5
    Dernier message: 27/06/2006, 22h08

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