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 :

Selection d'objet dans une forme libre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 2
    Par défaut Selection d'objet dans une forme libre
    Bonjour,

    Ayant une légère connaissance en VB, je cherche à faire une macro qui me sélectionne l'ensemble des objets (msoShapeOval) à l'intérieur d'une forme libre sélectionné.

    Exemple:
    select des objets "nom des villes" dans la forme libre qui serait la France et pas les objets des pays voisins.

    Le but final étant d'attribué des couleurs conditionnelles aux msoShapeOval à l'intérieur de leurs forme libre.

    Merci d'avance pour vos conseils.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tous ces objets sont des Shape.
    https://docs.microsoft.com/fr-fr/off...pi/excel.shape

    Pour une Shape, les propriétés Top et Left permettent de connaitre respectivement les limites haute et gauche de la forme.
    En leur additionnant les propriétés Height et Width, on peut connaitre les limites basse et droite.
    Tout ça délimite donc la Shape.

    Dans ta macro, tu commences par délimiter ta forme libre en conservant ses limites dans des variables.
    Ensuite, tu fais une boucle For Each sur la collection Shapes et tu testes les limites de chacune pour savoir si elles sont à l'intérieur de la limite de ta forme libre.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2019
    Messages : 2
    Par défaut
    Bonjour,

    On pourrait commencer ainsi :

    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
    Sub selall()
    Set myDocument = Worksheets(1)
    myDocument.Shapes.SelectAll
     
    Set france = Selection.ShapeRange
     
    For Each ville In france
    'Debug.Print ville.Name
      If Left(ville.Name, 4) = "Oval" Then
        ville.Fill.ForeColor.RGB = RGB(255, 100, 0)
      End If
    Next
    [A1].Select
     
    End Sub

  4. #4
    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
    menhir pas si simple

    c'est un soucis que j'avais laisser tomber a l'époque n'ayant rien trouvé

    sélectionne l'ensemble des objets (msoShapeOval)
    le problème est que le typemso est en écriture pas en lecture

    je dis ca a ma connaissance bien sur

    si c'est effectivement le cas car je n'ai toujours rien trouvé , il te faut repérer les shapes (OVALE) soit par leur nom,couleur,etc....
    sinon apres c'est facile avec shape.range
    une petite fonction qui va 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
    Sub test()
        Dim maselectionShape(), maformelibre As Shape
        Set maformelibre = ActiveSheet.Shapes("carré")
        maselectionShape = AllShapesInOne(maformelibre)
        Set collectShapesOval = ActiveSheet.Shapes.Range(maselectionShape)
        'tu fait ce que tu veux apres avec ("collectShapesOval")
        'exemple je les selectionne toutes
        collectShapesOval.Select
    End Sub
    '
    Function AllShapesInOne(shp As Shape)
    'on recherche les msoShapeOval
        Dim tablo(), x As Boolean, oval As Shape
        For Each oval In shp.Parent.Shapes
            x = oval.Left > shp.Left And oval.Top > shp.Top And oval.Width < shp.Width And oval.Height < shp.Height
            If x = True Then
                '(If condition msoShapeOval Then)
                i = i + 1: ReDim Preserve tablo(1 To i): tablo(i) = oval.Name
                'MsgBox oval.MsoShapename 'marche pas existe pas
                'MsgBox oval.MsoShapeType 'marche pas en lecture
                'MsgBox oval.typeMso    'marche pas existe pas
                'etc..etc...
                '(End If)
            End If
        Next
        AllShapesInOne = tablo
    End Function
    Nom : demo2.gif
Affichages : 847
Taille : 236,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

  5. #5
    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
    pour le coup j'ai trouvé
    c'est pas msoAutoShapeType en lecture mais AutoShapeType

    du coup la voila complète
    seules les msoShapeOval seront selectionnées
    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
     
     
    Sub test()
        Dim maselectionShape(), maformelibre As Shape
        Set maformelibre = ActiveSheet.Shapes("carré")
        maselectionShape = AllShapesInOne(maformelibre, msoShapeOval)
        Set collectShapesOval = ActiveSheet.Shapes.Range(maselectionShape)
        'tu fait ce que tu veux apres avec ("collectShapesOval")
        'exemple je les selectionne toutes
        collectShapesOval.Select
    End Sub
    '
    '
    Function AllShapesInOne(shp As Shape, typeMsoAuto As MsoAutoShapeType)
    'on recherche les msoShapeOval
        Dim tablo(), x As Boolean, shap As Shape
        For Each shap In shp.Parent.Shapes
            x = shap.Left > shp.Left And shap.Top > shp.Top And shap.Width < shp.Width And shap.Height < shp.Height
            If x = True Then
                If x And shap.AutoShapeType = typeMsoAuto Then i = i + 1: ReDim Preserve tablo(1 To i): tablo(i) = shap.Name
                 End If
        Next
        AllShapesInOne = tablo
    End Function
    je vais la garder celle la
    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

  6. #6
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 2
    Par défaut
    Merci,

    C'est une bonne base pour moi, je vais modifié pour

    - les formes libre à la sélection car trop de nominatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set maformelibre = ActiveSheet.Shapes(selection.Name)
    - vider le tablo car sélection de tous les objets précédent lors d'une autre exécution

Discussions similaires

  1. Liste des objets dans une Forms
    Par yasstunisien dans le forum Forms
    Réponses: 1
    Dernier message: 15/09/2011, 14h51
  2. Réponses: 8
    Dernier message: 26/05/2010, 10h25
  3. Ordre d'empilement de forms ou d'objets dans une form
    Par j.p.mignot dans le forum Langage
    Réponses: 1
    Dernier message: 04/02/2008, 15h15
  4. Problème création d'un objet dans une Form
    Par helico2 dans le forum C++/CLI
    Réponses: 7
    Dernier message: 02/01/2008, 16h32
  5. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 17h49

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