FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- Comment insérer une image dans la feuille de calcul ?
- Pourquoi Pictures.Insert ne fonctionne plus sous Excel 2007 ?
- Comment exporter toutes les images d'une feuille sur le disque dur ?
- Comment créer une image à partir d'une plage de cellules ?
- Comment supprimer toutes les images dans la feuille ?
- Comment stocker une image GIF dans un classeur et conserver les propriétés d'animation ?
- Est il possible de manipuler et de modifier des images externes à partir d'Excel ?
- Comment afficher des images conditionnelles sans macro ?
- Comment identifier le passage de la souris sur un point précis d'une image ?
- Comment récupérer les dimensions d'une image stockée sur le disque dur ?
- Est il possible d'utiliser librairie graphique gdiplus.dll (GDI+) depuis Excel ?
Sans macro, vous pouvez utiliser le menu Insertion/Images.
Sélectionnez l'image à partir de la boîte dialogue, puis cliquez sur le bouton OK pour valider.
L'exemple suivant reproduit la même opération par macro.
L'image sélectionnée sera en plus repositionnée sur la plage de cellules D3:E8. S'il y avait déjà une image à cet emplacement
(et nommée "Cible"), celle ci sera préalablement supprimée.
Sub
InsertionImage
(
)
Dim
Emplacement As
Range
Dim
Img As
Object
Dim
ShapeObj As
Shape
'Boucle pour supprimer l'ancienne image
For
Each
ShapeObj In
ActiveSheet.Shapes
If
ShapeObj.Name
=
"Cible"
Then
ActiveSheet.Shapes
(
"Cible"
).Delete
Next
ShapeObj
If
Application.Dialogs
(
xlDialogInsertPicture).Show
Then
'Définit l'emplacement de l'image
Set
Emplacement =
Range
(
"D3:E8"
)
Set
Img =
ActiveSheet.DrawingObjects
(
ActiveSheet.Shapes.Count
)
With
Img.ShapeRange
'Nommer l'image insérée (Pour la supprimer plus facilement ensuite)
.Name
=
"Cible"
.LockAspectRatio
=
msoFalse
.Left
=
Emplacement.Left
.Top
=
Emplacement.Top
.Height
=
Emplacement.Height
.Width
=
Emplacement.Width
End
With
Else
MsgBox
"Insertion d'image interrompue."
End
If
End
Sub
Ces deux autres méthodes permettent aussi d'insérer une image dans la feuille de calcul :
L'élément masqué Pictures est pris en charge uniquement pour assurer une compatibilité descendante entre les différentes versions d'Excel. Il préférable d'utiliser la propriété Shapes (type msoPicture) dans vos nouveaux projets. Néanmoins comme l'élément Pictures fonctionne encore, il peut être intéressant de voir son fonctionnement.
Sub
AjoutImageFeuille_V01
(
)
Dim
Fichier As
String
Fichier =
"C:\Documents and Settings\mimi\dossier\ Image2.jpg"
Feuil1.Pictures.Insert
Fichier
End
Sub
Les exemples suivants montrent comment insérer une image à partir de la méthode AddPicture.
Sub
AjoutImageFeuille_V02
(
)
Dim
Shp As
Shape
Dim
Fichier As
String
Fichier =
"C:\Documents and Settings\mimi\dossier\Image2.jpg"
'expression.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
Set
Shp =
Feuil1.Shapes.AddPicture
(
Fichier, msoFalse, msoCTrue, 0
, 0
, 100
, 90
)
End
Sub
Vous pouvez vous en servir aussi pour insérer dans la feuille, une image stockée sur une page Web :
Sub
AjoutImageFeuille_V03
(
)
Dim
Shp As
Shape
Dim
Fichier As
String
Fichier =
"https://www.developpez.com/template/logo.gif"
Set
Shp =
Feuil1.Shapes.AddPicture
(
Fichier, msoFalse, msoCTrue, 0
, 0
, 150
, 70
)
End
Sub
Ce problème peut se produire si l'image se trouve à un emplacement HTTP.
Pour contourner ce problème, codez la macro VBA pour insérer l'image comme une image de remplissage dans une forme tel qu'un rectangle.
Un exemple par macro en reprenant l'idée de l'aide Microsoft :
Dim
strImage As
String
Dim
Sh As
Shape
Set
Sh =
Worksheets
(
"Feuil1"
).Shapes.AddShape
(
msoShapeRectangle, 40
, 80
, 140
, 50
)
strImage =
"https://www.developpez.com/template/logo.gif"
Sh.Fill.UserPicture
strImage
La macro boucle sur les images de la feuille et les enregistre sur le disque dur au format GIF.
Sub
ExtractionImagesFeuille
(
)
Dim
Pict As
Picture
Dim
Nb As
Byte
Application.ScreenUpdating
=
False
For
Each
Pict In
Worksheets
(
"Feuil1"
).Pictures
Pict.CopyPicture
'copie l'image
With
Worksheets
(
"Feuil1"
).ChartObjects.Add
(
0
, 0
, Pict.Width
, Pict.Height
).Chart
.Paste
'colle l'image dans un graphique temporaire
'Sauvegarde au format image, dans le même répertoire que ce classeur.
.Export
ThisWorkbook.Path
&
"\"
&
Pict.Name
&
".gif"
, "GIF"
End
With
'Supprime le graphique
Nb =
Worksheets
(
"Feuil1"
).ChartObjects.Count
Worksheets
(
"Feuil1"
).ChartObjects
(
Nb).Delete
Next
Pict
Application.ScreenUpdating
=
True
End
Sub
Dans cet procédure, une image de la plage A1:B5 est collée dans la feuille de calcul.
Sub
ImagePlageCellules
(
)
'La plage de cellules A1:B5 est copiée dans le Presse-papiers en tant qu'image.
Worksheets
(
"Feuil1"
).Range
(
"A1:B5"
).CopyPicture
'L'image est collée dans la feuille active
Worksheets
(
"Feuil1"
).Paste
' renomme l'image
Selection.Name
=
"Image A1:B5"
End
Sub
Dans cet autre exemple, une image de la feuille complète est créée puis enregistrée sur le disque dur.
Sub
exporter_Feuille_ImageJPG
(
)
Dim
Ligne As
Integer
, Colonne As
Integer
Application.ScreenUpdating
=
False
'Copie, en tant qu'image, les cellules utilisées dans la feuille.
Feuil1.UsedRange.CopyPicture
Feuil1.Paste
'Récupére la position des dernières lignes et colonnes utilisées.
'Cette information va servir à redimensionner la taille de l'image.
Ligne =
Feuil1.Cells.Find
(
"*"
, Feuil1.Range
(
"A1"
), SearchDirection:=
xlPrevious).Row
+
1
Colonne =
Feuil1.Cells.Find
(
"*"
, Feuil1.Range
(
"A1"
), SearchDirection:=
xlPrevious).Column
+
1
'Crée un graphique temporaire
With
Feuil1.ChartObjects.Add
(
0
, 0
, Cells
(
Ligne, Colonne).Left
, Cells
(
Ligne, Colonne).Top
).Chart
.Paste
'exporte l'image sur le disque dur, dans le même répertoire que ce classeur.
.Export
ThisWorkbook.Path
&
"\monImage.jpg"
, "JPG"
End
With
With
Feuil1
'Supprime le graphique temporaire
.ChartObjects
(
Feuil1.ChartObjects.Count
).Delete
'Supprime l'image dans la feuille.
.Shapes
(
Feuil1.Shapes.Count
).Delete
End
With
Application.ScreenUpdating
=
True
End
Sub
Sub
SupprimerImagesFeuille
(
)
Dim
Sh As
Shape
For
Each
Sh In
Worksheets
(
"Feuil1"
).Shapes
If
Sh.Type
=
msoPicture Then
Sh.Delete
Next
End
Sub
Une première solution de stockage consiste à enregistrer le fichier au format binaire dans une des feuilles de calcul. Vous pouvez ensuite reconstituer l'image et la visualiser en utilisant le contrôle WebBrowser :
Une deuxième possibilité consiste à stocker l'image GIF dans un contrôle ImageList.
Nota :
Le stockage d'images dans un classeur alourdit considérablement la taille en ko.
Il est toujours préférable, quand c'est possible, de stocker les images à l'extérieur du classeur et de les charger quand vous en
avez besoin.
Oui, en utilisant par exemple la bibliothèque Windows Image Acquisition.
Téléchargez le classeur démo.
Le fichier zip contient une version xls et une version xlsx (Excel 2007).
Une possibilité consiste à placer l'image dans un graphique et d'utiliser ensuite les évènements de ce dernier.
Cet exemple contient un plan de département. Le nom de la commune et le nombre de personnes s'affiche dans les cellules
B8:B9 lorsque vous déplacez le curseur sur l'image sur un point précis (le graphique doit être préalablement activé).
Les villes à tester dans l'exemple :
Rambouillet
Mormant
Etampes
Versailles
Magny en Vexin
Nangis
Les données sources sont stockées dans l'onglet "Base".
Les colonnes x et y contiennent les coordonnées horizontales et verticales de chaque ville. Le code intègre aussi
la modification éventuelle du zoom (mais pas le redimensionnement manuel du graphique).
Pour retrouver facilement les coordonnées d'autres villes, ou plus généralement d'un point dans l'image, utilisez :
La formule matricielle,
=
INDEX
(
$C$2
:$C$7
;EQUIV
(
1
;(
$A$2
:$A$7
>=
F1-((
F1*
5
)/
100
))*(
$A$2
:$A$7
<=
F1+((
F1*
5
)/
100
))*(
$B$2
:$B$7
>=
F2-((
F2*
5
)/
100
))*
(
$B$2
:$B$7
<=
F2+((
F2*
5
)/
100
));0
))
dans la cellule G1 de l'onglet "Base", permet d'identifier les croisements verticaux et horizontaux des points, (F1*5)/100 et (F2*5)/100 servants à définir la précision de proximité pour chaque position de la souris.
Private
Sub
Graph_MouseMove
(
ByVal
Button As
Long
, ByVal
Shift As
Long
, _
ByVal
x As
Long
, ByVal
y As
Long
)
Dim
ElementID As
Long
Dim
Arg1 As
Long
, Arg2 As
Long
On
Error
Resume
Next
ActiveChart.GetChartElement
x, y, ElementID, Arg1, Arg2
Range
(
"A14"
) =
x
Range
(
"A15"
) =
y
End
Sub
Cette méthode simple fonctionne uniquement pour les formats JPG, jpeg, gif et bmp.
Sub
DimensionsImage
(
)
'Fonctionne pour les formats :
'JPG
'jpeg
'gif
'bmp
Dim
iPict As
IPictureDisp
Dim
NomFichier As
String
NomFichier =
"C:\dossier\lapin.jpg"
Set
iPict =
LoadPicture
(
NomFichier)
MsgBox
Round
((
iPict.Width
) /
21
.16
, 0
) &
" x "
&
Round
((
iPict.Height
) /
21
.16
, 0
)
Set
iPict =
Nothing
End
Sub
clGdiPlus est un module de classe VBA pour faciliter l'utilisation de la librairie graphique gdiplus.dll (GDI+).
Vous pourrez en autre :
Personnaliser la forme d'un formulaire
Gérer les données Exif des images
Développer un jeu de tir
Inclure des images jpeg dans un objet OLE
Créer une mosaïque de photos
Afficher des informations sur une carte géographique
Créer un Casse-brique