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 :

Compter le nombre de "Shapes" dans une plage de cellules


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 24
    Par défaut Compter le nombre de "Shapes" dans une plage de cellules
    Bonjour,

    J'aimerai pouvoir compter le nombre de "shapes" (zone de texte dans mon cas) dans une plage de cellule donnée et reporter le résultat dans une autre

    J'arrive à toutes les compter dans la feuil1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub COmpter()
     
    Dim i As Integer
    i = ActiveSheet.Shapes.Count
    Cells(12, 4).Value = i
    End Sub
    Mais je n'arrive pas à les compter dans une plage de cellule donnée

    Par contre j'arrive à les lister grâce à ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub listerTaches()
        Dim sh As Shape
        Dim i As Integer
     
        i = 1
        For Each sh In Feuil1.Shapes
            Set inter = Application.Intersect(sh.TopLeftCell, Range("chantier"))
            If Not inter Is Nothing Then
                Feuil1.Range("ED" & i).Value = sh.TextFrame.Characters.Text
                i = i + 1
            End If
        Next
     
    End Sub
    Pouvez vous m'aider?
    Merci

  2. #2
    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
    Je n'ai pas bien regardé ton code, mais dans l'ensemble, pour moi, il te manque une autre boucle imbriquée.
    C'est à dire tu boucles sur toutes les cellules d'une plage
    et tu boucles sur toutes tes shapes, ainsi à chaque boucle cellule tu demandes le topleftcell de la shape.
    Cela devrait te sortir tous les shapes qui sont dans la plage spécifiée.

    Au plaisir
    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

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 099
    Billets dans le blog
    2
    Par défaut
    Bonjour tiktak, Bonjour Patrick,

    Il me semble que dans la 2ème procédure listerTaches, la valeur de i en fin de boucle devrait te donner le compte, si tu initialises i à 0

  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
    Bonjour

    Non i lui donne l'index de la shape mais pas le i de la cellule, donc il ne boucle pas sur une plage spécifiée mais sur tous les shapes.

    Et je crois que ce n'est pas ce qu'il veut.
    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
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 099
    Billets dans le blog
    2
    Par défaut
    Re,

    Il me semble que comme il n'incrémente son i que dans le cas où le shape fait partie de son Range, i devrait correspondre au nombre de shapes (en l'initialisant à 0)
    Mais je peux me tromper...

  6. #6
    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
    Je viens de faire l'essai avec le intersect du topleftcell.address dans une plage specifiée et je n'ai pas d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub essai_de_comptage_des_shapes_dans_un_range_precis()
    Dim i, liste As String
    i = 1
    For Each sh In Sheets(1).Shapes
    Set isect = Application.Intersect(Range(sh.TopLeftCell.Address), Range("b2:c10"))
    If Not isect Is Nothing Then
    sheets(1).Cells(i, "ed") = sh.Name
    i = i + 1
    liste = liste & sh.Name & "  " & sh.TopLeftCell.Address & vbCrLf
    End If
    Next
    MsgBox liste
    End Sub
    Es tu sûr que ta range s'appelle bien "chantier" et que c'est n'est pas plutôt ton sheet.
    oupss
    Je viens de me rendre compte et surtout comprendre pourquoi tu as une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set inter = Application.Intersect(sh.TopLeftCell, Range("chantier"))
    Or c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set inter = Application.Intersect(range(sh.TopLeftCell.address), Range("chantier"))
    edit:
    Finalement en relisant tu as raison.
    Sélectionner tout - Visualiser dans une fenêtre à part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set inter = Application.Intersect(sh.TopLeftCell, Range("chantier"))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set inter = Application.Intersect(range(sh.TopLeftCell.address), Range("chantier"))
    Cà donne la même chose, du texte en plus c'est tout.

    Dans ce cas là je vois pas où est l'erreur dans son code ???
    Peut être à ce moment là une erreur de déclaration de ses variables sur leurs types.
    Au plaisir
    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

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    La propriété TopLeftCell renvoit un objet Range
    Patrick, Quel est la différence entre Sh.TopLeftCell et Range(Sh.TopLeftCell.address)

    Une fonction comme l'a bien précisé tototiti2008 tiré du code de tiktak28 qui compte les Shapes

    EDIT
    Pour compter les Shapes qui ne débordent pas de la plage
    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 CountShapes(ByVal Rng As Range) As Integer
    Dim B As Range, H As Range
    Dim Sh As Shape
    Dim i As Integer
     
    For Each Sh In Rng.Parent.Shapes
        Set B = Intersect(Sh.BottomRightCell, Rng)
        Set H = Intersect(Sh.TopLeftCell, Rng)
        If Not B Is Nothing And Not H Is Nothing Then
            i = i + 1
            Set B = Nothing
            Set H = Nothing
        End If
    Next Sh
    CountShapes = i
    End Function
    Remplace le AND par OR si tu veux compter les Shapes qui "touchent" la plage

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/11/2012, 15h49
  2. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  3. [XL-MAC 2011] Rechercher le nombre d'initiales de noms dans une plage
    Par gcroset dans le forum Excel
    Réponses: 5
    Dernier message: 16/09/2011, 18h28

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