Modifier l'image d'un Shape Image en VBA

Bonjour,

je ne trouve pas la syntaxe pour faire un échange d'image d'une image insérée sur une feuille Excel.
Ruban : Insertion, menu Illustrations, item Image : je sélectionne une image sur mon PC.

Je me retrouve avec un Shape dont je peux changer le nom grâce au champ texte à gauche de la barre des tâches.
En VBA je me retrouve donc avec une ligne de code comme suit : ActiveSheet.Shapes("MonImage")

Maintenant il me manque le code pour coder l'équivalent du menu clic droit sur ce shape : "Changer d'image".
j'ai trouvé des :
ActiveSheet.Shapes.AddPicture
ActiveSheet.Pictures.Insert
mais tout ceci c'est pour l'insérer, je ne trouve pas l'équivalent du "Changer". L'enregistreur de macro n'enregistre que la sélection du shape !

Connaissez-vous cette instruction ?

@ bientôt

LouReeD

Bonsoir,

en fait la solution est que je change mon fusil d'épaule !
J'insère les images par l'insertion d'image (normal direz-vous !) et grâce à cela j'ai bien le menu "changer d'image" sur le clic droit, donc "dès le début" j'ai une image et je peux en changer.

La solution trouvée : j'insère un rectangle sans bordure. Clic droit dessus : aucun menu me permettant d'y mettre une image !
Qu'à cela tienne, je vais en mettre une par code VBA : ActiveSheet.Shapes("Test").Fill.UserPicture ("C:\Users\Roue1.jpg")
et voilà, je peux "facilement" remplacer l'image de ce shape avec le même code mais une image différente.

Pour les autres fonction cela marche aussi, comme le rognage et le réglage d'affichage de ce dernier.
En fait à vouloir "prendre au plus simple" avec l'insertion direct d'une image on se "coupe" de certaines possibilités car je pense l'image est un objet image alors qu'une forme c'est un objet "container" dans lequel on peut y mettre une image ! Mais rien n'est moins sur !

@ bientôt

LouReeD

Bonsoir LouReeD,

En effet, par clic Droit dans les dernières versions d'Excel, il est possible de changer l' image un peu à la manière d'un contrôle image d'un formulaire.

Et c'est bien un objet image qui est modifié puis remplacé. Soit par accès par disque, soit par accès au presse-papier si une autre image a été copiée auparavant.

Mais rien n'est précisé, du moins encore sur le code VBA pouvant être appliqué.

Par contre depuis Excel 2007 il existe toujours le moyen d'utiliser l'objet forme comme conteneur de l'image.

Sur la feuille, avec des propriétés qui peuvent aussi s'appliquer si l'on passe par un formulaire et ses contrôles. (Voir Pento) qui s'en réfère.

Ci-dessous un fichier exemple réalisé pour voir le principe. L'avantage est que des images (en format réduit puis réagrandit) peuvent déjà être présentes.

134imgswap.xlsm (49.80 Ko)

On peut voir quand on sélectionne l'objet, qu'Excel affiche (en vert) dans le ruban les deux propriétés globales hybrides (Forme et Image)

Si besoin faire un retour, que je regarderais dimanche.

Bonsoir,

par rapport à mon besoin :

Public Switch As Boolean
Sub Bascule()
    If Switch Then
        ActiveSheet.Shapes("Rect01").Fill.UserPicture ("C:\Users\Untel\Desktop\A.jpg")
    Else
        ActiveSheet.Shapes("Rect01").Fill.UserPicture ("C:\Users\Untel\Desktop\B.jpg")
    End If
    Switch = Not Switch
End Sub

Comme indiqué dans mon précédent message.
Et avec les instruction suivante, je peux régler la tailler du "container", ainsi que l'image dans ce dernier et je place "où je veux" cette image dans le container si cette dernière est trop grande, et pour moi c'était le but premier afin de faire une animation comme proposé par waard ( après vérification, il a lui aussi utilisé "image" pour l'insertion car il n'y a que le menu image qui s'affiche lors de la sélection du pingouin...):

        ActiveSheet.Shapes("Rect01").Height = 150
        ActiveSheet.Shapes("Rect01").PictureFormat.Crop.PictureWidth = 4000 ' on agrandi l'image en largeur elle est donc plus grande que le container
        ActiveSheet.Shapes("Rect01").PictureFormat.Crop.PictureOffsetX = 1975 - 250 ' par exemple afin de caller l'image où l'on veut dans le Crop

@ bientôt

LouReeD

Bonjour X Cellus,

L'avantage avec votre code c'est que le fichier embarque avec lui les images. Donc pas besoin d'accès disque et un seul fichier à distribuer, plus lourd, mais unique.

Je vais y réfléchir !

@ bientôt

LouReeD

Bonsoir LouReeD,

Avec une version unique mais qui peut ensuite être moins lourde. Si l'on souhaite.

Il suffit d'ajouter une ligne de code ensuite. Ou une macro before_close

Avec une astuce, bien sûr. Exemple fait ici avec deux images seulement.

Voir notes en rouge.

110imglist.xlsm (170.07 Ko)

Bonsoir X Celluls,

bon ben je n'ai pas réussi à faire fonctionner votre fichier...

Sino j'ai pu me rendre compte que j'avais déjà utilisé Fill.UserPicture dans mon application "The King Of The Road" ! Mais voilà, mes soucis de mémoire reviennent à la surface !

Sinon votre fichier si j'ai compris le principe : il embarque les images dans un contrôle, puis les enregistre sur le disque dur local, puis à la fermeture du fichier soit on supprime dans le fichier le contrôle image pour faire "de la place" puisque les images sont installées en local, soit on efface sur le disque pour laisser tout propre ?

J'aime autant l'autre fichier où les images étaient dans un objet qui pourrait se trouver dans une autre feuille du classeur et on switch celles que l'on veut.

@ bientôt

LouReeD

Bonsoir LouReeD,

En Effet,

Sinon votre fichier si j'ai compris le principe : il embarque les images dans un contrôle, puis les enregistre sur le disque dur local, puis à la fermeture du fichier soit on supprime dans le fichier le contrôle image pour faire "de la place" puisque les images sont installées en local, soit on efface sur le disque pour laisser tout propre ?

Oui, à la première fermeture du fichier, on vérifie que l'imageList est présent (donc il a fait le taf).puis on l'efface.

Non, ou du moins tant que l'utilisateur garde le fichier Excel. La copie des fichiers images sur le disque est une sécurité en cas d'erreur (fausse manip) de l'utilisateur.

Et, oui, si l'utilisateur ne désire plus du fichier Excel. Alors on peut prévoir un bouton pour effacer les images sur le disque. Vu qu'en colonne O la liste des images est inscrite.

D'ailleurs, il est possible qu'il y avait déjà la liste dans le fichier fourni. Et comme la macro NombreImg() contrôle l'existence de celle-ci afin de ne pas faire doublons des images. A la première installation du fichier (workbook_open) la liste en colonne O n'existe pas, ce qui copie les images sur le disque en dossier Images.

Et ne le fait plus ensuite.

Ce qui fait qu'après la liste déroulante peut fonctionner.

72imgliste.xlsm (170.32 Ko)
Rechercher des sujets similaires à "modifier image shape vba"