XL 2010 Afficher image (réduction taille proportionnelle)

cathodique

XLDnaute Barbatruc
Bonjour,

je reviens avec une autre problématique. J'ai bien cherché mais je pense que je suis un piètre fouineur.
Je voudrais afficher des images dans une plage définie (coloriée) ou une shapes (en K1) tout en gardant les proportionnalités.

j'ai pas trouvé l'équivalent de la propriété PictureSiseMode =1-fmPictureSizeModeStretch comme pour le contrôle Image des userforms.

J'utilise ce code mais les images ne s'adaptent pas à la plage (ou shapes que je n'ai pas mis).
VB:
Option Explicit

Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim imgLeft As Double
   Dim imgTop As Double

   Set ws = Feuil1
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
   imgLeft = ws.[k1].Left
   imgTop = ws.[k1].Top

   ws.Shapes.AddPicture _
         Filename:=imagePath, _
         LinkToFile:=msoFalse, _
         SaveWithDocument:=msoTrue, _
         Left:=imgLeft, _
         Top:=imgTop, _
         Width:=-1, _
         Height:=-1

End Sub
je joins quelques images qui n'ont pas les mêmes dimensions.

En vous remerciant.

Bonne journée
 

Pièces jointes

  • Afficher image.zip
    605.8 KB · Affichages: 2
Solution
Re
Pour supprimer l'image existante avant :
VB:
Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim image As Picture
   Dim imageRange As Range
   Dim pic As Picture
  
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Supprimez les images existantes dans la plage spécifiée
   For Each pic In ws.Pictures
        If Not Intersect(pic.TopLeftCell, imageRange) Is Nothing Or _
           Not Intersect(pic.BottomRightCell, imageRange) Is Nothing Then
            pic.Delete
        End If
    Next pic
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)...

piga25

XLDnaute Barbatruc
Bonjour,
Peut-être comme cela:
VB:
Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim image As Picture
   Dim imageRange As Range
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
' Ajustez les dimensions de l'image à la plage spécifiée
   With image
        .Top = imageRange.Top
        .Left = imageRange.Left
        .Width = imageRange.Width
        .Height = imageRange.Height
   End With
  
End Sub
 

cathodique

XLDnaute Barbatruc
Bonjour,
Peut-être comme cela:
VB:
Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim image As Picture
   Dim imageRange As Range
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
' Ajustez les dimensions de l'image à la plage spécifiée
   With image
        .Top = imageRange.Top
        .Left = imageRange.Left
        .Width = imageRange.Width
        .Height = imageRange.Height
   End With
 
End Sub
Bonjour @piga25 ;),

Merci beaucoup. Certaines images débordent de la plage. Peut-être sont-elles un peu trop grandes.

Comment supprimer celle qui précède avant d’afficher la suivante? Les images sont l'une sur l'autre.

Bonne journée.
 

piga25

XLDnaute Barbatruc
Re
Pour supprimer l'image existante avant :
VB:
Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim image As Picture
   Dim imageRange As Range
   Dim pic As Picture
  
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Supprimez les images existantes dans la plage spécifiée
   For Each pic In ws.Pictures
        If Not Intersect(pic.TopLeftCell, imageRange) Is Nothing Or _
           Not Intersect(pic.BottomRightCell, imageRange) Is Nothing Then
            pic.Delete
        End If
    Next pic
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
' Ajustez les dimensions de l'image à la plage spécifiée
   With image
        .Top = imageRange.Top
        .Left = imageRange.Left
        .Width = imageRange.Width
        .Height = imageRange.Height
   End With
 
End Sub
 

cathodique

XLDnaute Barbatruc
Re
Pour supprimer l'image existante avant :
VB:
Sub InsertImage()

   Dim ws As Worksheet
   Dim imagePath As String
   Dim image As Picture
   Dim imageRange As Range
   Dim pic As Picture
 
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Supprimez les images existantes dans la plage spécifiée
   For Each pic In ws.Pictures
        If Not Intersect(pic.TopLeftCell, imageRange) Is Nothing Or _
           Not Intersect(pic.BottomRightCell, imageRange) Is Nothing Then
            pic.Delete
        End If
    Next pic
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
' Ajustez les dimensions de l'image à la plage spécifiée
   With image
        .Top = imageRange.Top
        .Left = imageRange.Left
        .Width = imageRange.Width
        .Height = imageRange.Height
   End With
 
End Sub
Pour moi bien que ça déborde pour quelques unes. Le résultat est très satisfaisant.
Je te remercie ça va me permettre d'avancer.
 

piga25

XLDnaute Barbatruc
Re
Et en ajustant proportionnellement l'image en fonction de sa hauteur ou de sa largeur
VB:
Sub InsertImage()

    Dim ws As Worksheet
    Dim imagePath As String
    Dim image As Picture
    Dim imageRange As Range
    Dim pic As Picture
    Dim aspectRatio As Double
    Dim newWidth As Double
    Dim newHeight As Double
 
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Supprimez les images existantes dans la plage spécifiée
   For Each pic In ws.Pictures
        If Not Intersect(pic.TopLeftCell, imageRange) Is Nothing Or _
           Not Intersect(pic.BottomRightCell, imageRange) Is Nothing Then
            pic.Delete
        End If
    Next pic
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
  
' Calculer le ratio de l'image originale
   aspectRatio = image.Width / image.Height
' Ajustez les dimensions de l'image en gardant le ratio
   If imageRange.Width / imageRange.Height > aspectRatio Then
' La plage est plus large que l'image, ajuster la hauteur
        newHeight = imageRange.Height
        newWidth = newHeight * aspectRatio
    Else
' La plage est plus haute que l'image, ajuster la largeur
        newWidth = imageRange.Width
        newHeight = newWidth / aspectRatio
    End If
    ' Positionnez et redimensionnez l'image
    With image
        .Top = imageRange.Top + (imageRange.Height - newHeight) / 2
        .Left = imageRange.Left + (imageRange.Width - newWidth) / 2
        .Width = newWidth
        .Height = newHeight
    End With
 
End Sub
 

piga25

XLDnaute Barbatruc
Re;
Regarde ce post, cela pourrait correspondre à ce que tu recherche:
 

cathodique

XLDnaute Barbatruc
Re
Et en ajustant proportionnellement l'image en fonction de sa hauteur ou de sa largeur
VB:
Sub InsertImage()

    Dim ws As Worksheet
    Dim imagePath As String
    Dim image As Picture
    Dim imageRange As Range
    Dim pic As Picture
    Dim aspectRatio As Double
    Dim newWidth As Double
    Dim newHeight As Double
 
'définition de la feuille et de la plage
   Set ws = Feuil1
   Set imageRange = ws.Range("K1:L7")
' Supprimez les images existantes dans la plage spécifiée
   For Each pic In ws.Pictures
        If Not Intersect(pic.TopLeftCell, imageRange) Is Nothing Or _
           Not Intersect(pic.BottomRightCell, imageRange) Is Nothing Then
            pic.Delete
        End If
    Next pic
' Chemin du fichier image
   imagePath = ThisWorkbook.Path & "\photos\" & [C4].Text & ".jpg"
' Insérez l'image dans la feuille
   Set image = ws.Pictures.Insert(imagePath)
 
' Calculer le ratio de l'image originale
   aspectRatio = image.Width / image.Height
' Ajustez les dimensions de l'image en gardant le ratio
   If imageRange.Width / imageRange.Height > aspectRatio Then
' La plage est plus large que l'image, ajuster la hauteur
        newHeight = imageRange.Height
        newWidth = newHeight * aspectRatio
    Else
' La plage est plus haute que l'image, ajuster la largeur
        newWidth = imageRange.Width
        newHeight = newWidth / aspectRatio
    End If
    ' Positionnez et redimensionnez l'image
    With image
        .Top = imageRange.Top + (imageRange.Height - newHeight) / 2
        .Left = imageRange.Left + (imageRange.Width - newWidth) / 2
        .Width = newWidth
        .Height = newHeight
    End With
 
End Sub
Merci beaucoup. Avec ce dernier, ça ne va pas.
Il a supprimé le bouton qui lançait la macro mais n'a pas supprimé l'image et a planté sur cette ligne
VB:
Set image = ws.Pictures.Insert(imagePath)

à la seconde exécution, le code a fonctionnait. Merci pour le lien, je vais aller voir.
 

patricktoulon

XLDnaute Barbatruc
Bonsoir
autant donner le lien original
les images seront réduites ou "agrandies de f"acon "a ce qu'elle rentre totalement d"ans la plage sans perdre l'aspect ratio
 

Discussions similaires

Statistiques des forums

Discussions
313 866
Messages
2 103 087
Membres
108 521
dernier inscrit
manouba