Monsieur Excel
Pour tout savoir faire sur Excel !

17 mars 2019

Sélection d’une image à afficher (c)

Nous avons eu trois commentaires sur cette série d’articles.

Le premier est dû à Philippe qui nous dit : « Bonjour, il y a moyen d'éviter la macro en passant par une image définie par une plage nommée alimentée par un décaler : https://www.cjoint.com/c/IClu5CcLYTd

Sur cet article, vous trouvez un bouton pour télécharger le fichier IClu5CcLYTd_rech-image.xlsx dans lequel vous pouvez voir la solution mise en œuvre.

Cela fonctionne très bien, avec un inconvénient : vous devez avoir les différentes images visibles dans le classeur et vous ne voyez pas, comme dans ma solution, uniquement l’image demandée.

Une solution du même type est proposée par Arnaud Cottin, avec le même inconvénient mais aussi, à titre de compensation, le fait qu’il n’est plus nécessaire de passer par le VBA.

Enfin, il y a une proposition d’un habitué de notre blog, cduigou, qui passe aussi par le VBA mais en allégeant la solution que je proposais. Voici ce qu’il suggère :

Une autre solution consiste à nommer les images (Zone des noms) dans la feuille de calcul en utilisant les libellés exacts présents dans la liste de choix de la cellule C1. On se passe ainsi de l'index, des fonctions EQUIV, DECALER, etc... pour ne garder que les noms. Le choix dans la collection Pictures se fait ainsi par le nom au lieu de l'index.

La procédure événementielle devient :

Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$C$1" Then
      Me.Pictures.Visible = False
      Me.Pictures(ActiveCell.Value).Visible = True
   End If
End Sub

7 Commentaire(s):

  • Bonjour monsieur,

    Votre dernier thème abordé sur "Sélection d'une image à afficher" attire particulièrement mon attention (et même d'une façon générale avec Excel) au sujet de la mémoire occupée par les objets.

    Dans l'exemple proposé, si j'ai bien compris, on peut avoir une centaine de photos en "mode picture", toutes superposées. Via VBA on rend invisible celle affichée et parmi toutes les autres qui sont invibles, un sélecteur appoprié affiche uniquement l'une d'elles.

    Si je ne me trompe pas, mes question sont alors les suivantes:

    1- Peut-on connaître la mémoire Excel occupée par une "picture" ?

    2- Est-elle identique si sa propriété VISIBLE est à FALSE ?

    3- Est-ce une "bonne" manière pour EXCEL de faire de telles superpositions localement? Si oui, y a t-il une limite?

    Par la présente je vous félicite pour votre abnégation dans votre démarche qui n'a d'égale votre précision pour vos sujets développés en toute limpidité.



    Recevez monsieur mes salutations les plus sincères.

    By Anonymous Anonyme, sur 10:34 AM  

  • Bonjour

    En réponse à vos questions voici ce que je peux vous dire :

    1. Il n'y a pas de "mémoire Excel" à proprement parler, mais une mémoire de l'ordinateur. Cela dit il est vrai qu'Excel a parfois des difficultés de fonctionnement lorsque le classeur est très volumineux, indépendamment de la mémoire totale disponible. Une picture occupe en général de quelques dizaines de Ko à plusieurs Mo s'il s'agit de photos par exemple.

    2. La mémoire occupée est strictement la même, que la picture soit visible ou non.

    3. Oui il y a une autre technique qui consisterait à insérer dynamiquement la picture puis à la supprimer quand on demande un nouvel affichage.
    En VBA, ça donnerait quelque chose comme :
    ActiveSheet.Pictures.Insert("C:\Users\Claude\Pictures\Véranda2.png").Select

    L'inconvénient,c'est que si vous souhaitez transmettre votre classeur à un correspondant, il faut lui transmettre également les pictures, avec des contraintes d'emplacement de dossier, etc... Le problème n'existe plus lorsque toutes les pictures sont présentes dans le classeur Excel lui-même

    Cordiales salutations

    By Anonymous cduigou, sur 1:09 PM  

  • Réponse à cduigou

    Bonjour

    1- Oui le classeur est assez volumineux. Vous aviez deviné le fond de ma question.

    2- Je le supposais et vous confirmez, merci.

    3- Je vais tester votre proposition (aucun partage en vue).

    Cordiales salutations.

    By Anonymous Anonyme, sur 3:55 PM  

  • Merci pour ces questions et ces réponses !
    C'est sympa de m'aider dans ma mission :)

    Bien entendu, la place prise par les images dépend totalement de leur définition.

    Mon fichier original avec les images des quatre animaux occupait moins de 100 Ko. Je me suis amusé à détruire les quatre images et à coller à la place les photos d'identité de quatre collaborateurs de ma dernière start-up (Alzohis).

    Cela a immédiatement attribué un nom d'animal à chacun des quatre (original, n'est-ce pas !) et la taille du fichier a d'un coup été augmentée de 500 Ko...

    By Blogger Hervé Thiriez, sur 9:34 AM  

  • Petite précision...

    Microsoft conseille d'utiliser l'objet Shape (collection Shapes), très général, plutôt que l'objet Picture (collection Pictures). Cet objet Picture est conservé juste pour la compatibilité avec Excel 2003 ou 2007, je ne sais plus exactement. D'ailleurs il n'apparait plus dans l'explorateur d'objets de VBA sauf à demander explicitement l'affichage des objets cachés.
    Un objet Shape peut être aussi bien une photo, une forme géométrique, un graphique superposé,etc... La nature de la Shape est obtenue en programmation par la propriété Type. Ainsi pour une photo cette propriété a la valeur msoPicture. cela permet de distinguer les différents types de Shapes implantées sur une feuille.

    By Anonymous cduigou, sur 10:22 PM  

  • Bonjour,

    Je ne comprends pas très bien votre commentaire :
    "Cela fonctionne très bien, avec un inconvénient : vous devez avoir les différentes images visibles dans le classeur et vous ne voyez pas, comme dans ma solution, uniquement l’image demandée."

    ==> rien n’empêche de mettre les images dans une feuilles cachées.

    Cordialement

    By Blogger Benji, sur 3:16 PM  

  • Et merci à cduigou, je ne savais pas pour la collection pictures.

    By Blogger Benji, sur 3:17 PM  

Enregistrer un commentaire

<< Accueil