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 :

Nombre d'Images dans une cellule


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
    AMATEUR
    Inscrit en
    Février 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : AMATEUR
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2016
    Messages : 15
    Par défaut Nombre d'Images dans une cellule
    Bonjour,

    Ne trouvant de solution satisfaisante à mon problème, je me résous donc à vous le soumettre.

    Dans une feuille Excel qui contient beaucoup de petites images insérées dans des cellules, je dois pouvoir trouver dans une cellule donnée (pour l'exemple la cellule active), le nombre d'images insérées, leurs noms ainsi que leurs largeurs et positions (left)

    J'ai mis un code en place, en voici une version simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub NbImgDnsCell()
     
        Dim Shp_S As Shape
     
        For Each Shp_S In ActiveSheet.Shapes
     
            If Shp_S.TopLeftCell.Address = ActiveCell.Address Then
                Debug.Print Shp_S.Name + " : " + CStr(Shp_S.Left) + " : " + CStr(Shp_S.Width)
            End If
        Next Shp_S
     
    End Sub

    Le Debug.print est là pour l'exemple en pratique je charge les valeurs dans un tableau.

    Cela fonctionne très bien avec une feuille qui contient peu d'images, mais dès qu'il y en a beaucoup cela prend du temps car avec ce principe, on vérifie l'adresse de chaque "Shape" de la feuille.

    Je suis à la recherche d'une syntaxe du type
    For Each Shp_S - In ….. Et là désigner une collection d'images situées uniquement dans la cellule active

    Je ne sais pas si c'est possible, après bien des recherches, je n'ai rien trouvé de satisfaisant

    D'avance merci.

    Cordialement.

  2. #2
    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 ne pense pas que ça existe.
    Si c'est à faire sur plusieurs cellules tu rebalaies tout à chaque fois.
    Tu pourrais te créer un dictionary avec en clé la ref cellule avec images et en items les noms séparés par des ",".
    Le balayage n'aurait lieu qu'une fois (ou refait s'il doit être rafraichi) et quand tu en as besoin tu récupères la liste des noms des images de la cellule à l'aide du dictionary
    eric

    edit : fichier exemple
    Fichiers attachés Fichiers attachés

  3. #3
    Membre averti
    Homme Profil pro
    AMATEUR
    Inscrit en
    Février 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : AMATEUR
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2016
    Messages : 15
    Par défaut
    Bonjour eriiic
    Et merci pour cette réponse
    Il faudra que je me penche sur cette notion de dictionary.
    J'avais fait quelque chose d'un peu équivalent en listant toutes les noms des images ainsi que les cellules où elles sont insérées, leurs largeurs etc… sur une feuille cachée, constituant ainsi une petite base de données.
    Mais ça ne change pas grand-chose par rapport à la méthode que j'utilise actuellement.
    A chaque fois que je vais insérer une image en VBA, pour la positionner, je dois me préoccuper du contenu de la cellule dans laquelle je veux l'insérer. Ce qui implique de relancer un rafraichissement du contenu de cette base à chaque fois qu'une image a été insérée ou supprimée. Au final c'est aussi long.
    J'espérais pourvoir créer une collection d'objets limitée à une "range" et lister ces objets ainsi que leurs positions.

    A suivre donc…

  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
    J'ai édité et ajouté un fichier exemple.


    Tu n'avais pas précisé le fonctionnement que tu faisais.
    Si tu ajoutes/supprimes une image tu peux simplement modifier la clé concernée pour la mettre à jour sans tout rebalayer.

  5. #5
    Membre averti
    Homme Profil pro
    AMATEUR
    Inscrit en
    Février 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : AMATEUR
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2016
    Messages : 15
    Par défaut
    Bonjour Eric,

    J’ai regardé le fichier d’exemple… trop fort ! cela me donne des idées ….
    J’ai regardé un peu le code, mais je dois avouer que quelque-chose m’échappe.
    J’ai bien compris que le changement de cellule dans la feuille déclenchait la fonction « Worksheet_SelectionChange » et ainsi la boite de dialogue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Not initOk Then initListImg
        If dictImg.exists(Target.Address) Then MsgBox dictImg(Target.Address)
    End Sub
    Mais la fonction initListImg() se déclenche comment ?
    j’ai essayé le pas à pas… je n’ai rien vu dans le non plus dans le « workbook_Open ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub initListImg()
        Dim Shp_S As Shape
        Set dictImg = CreateObject("Scripting.Dictionary")
        For Each Shp_S In ActiveSheet.Shapes
            If dictImg.exists(Shp_S.TopLeftCell.Address) Then
                dictImg(Shp_S.TopLeftCell.Address) = dictImg(Shp_S.TopLeftCell.Address) & "," & Shp_S.Name
            Else
                dictImg(Shp_S.TopLeftCell.Address) = Shp_S.Name
            End If
        Next Shp_S
        initOk = True
    End Sub
    Je vais essayer de me pencher sur cette fonctionnalité dès demain.

    Pour ce qui est d’ajouter/supprimer une image en modifiant le contenu de la base, je pensais faire comme ça effectivement…
    Mais cela implique que tous les ajouts/suppressions sont effectués en VBA (pas d’ajout ou de suppression d’image directement sur la feuille)….
    Et par sécurité, il faut au moins recréer cette base à chaque ouverture du fichier.


    Un grand merci en tout cas, j’ai un os à ronger avec ce « Scripting.Dictionary »

    Cordialement.

  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,

    J'aurais pu le mettre dans workbook_open().
    Mais quand on teste, si on quitte un pas à pas sans aller jusqu'au bout on perd les variables. Et 1 fois/2 on oublie de les réinitialiser, c'est ch....
    Et si jamais le programme plante (d'accord, il ne devrait pas) on les perd aussi. C'est ch.... pour l'utilisateur qui doit : soit se rappeler la proc à lancer manuellement, soit fermer et rouvrir le fichier.
    Donc quand je suis dans une proc où j'ai besoin de dictImg, je teste au début si cette init est faite ou perdue et je la fais si besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not initOk Then initListImg
    Dans initListImg il y a initOk = True (variable globale qui est conservée) pour marquer que c'est fait.
    Comme à l'ouverture initOk = False c'est fait au 1er Worksheet_SelectionChange(), regarde mieux sa 1ère ligne. Aux suivants tu ne le vois plus même en pas à pas puisque c'est déjà fait ;-)
    Donc si plus tard tu as besoin de réinialiser la liste suite à évolutions tu peux te contenter de mettre initOk = False pour forcer la réinitialisation au moment du besoin. Même si tu fais 18 modif d'images tu n'auras qu'une seule réinit et pas de ralentissements possibles au moment des manips.
    eric

Discussions similaires

  1. pbl image dans une cellule
    Par UNi[FR] dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/08/2006, 12h54
  2. Image dans une cellule d'un tableau
    Par Swoosh67 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 13/06/2006, 15h49
  3. [html] insertion d 1 image dans une cellule avec taille en %
    Par hijodelanoche dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/01/2006, 00h50
  4. Reduire une image dans une cellule
    Par tooms2028 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/03/2005, 15h50
  5. Comment insérer une image dans une cellule d'un TDrawGrid ?
    Par kanux dans le forum Composants VCL
    Réponses: 4
    Dernier message: 15/01/2005, 18h58

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