Positionner une photo en fonction du contenu d'une cellule ?

Michel_ja

XLDnaute Occasionnel
Bonjour à tous,
j'aimerais savoir s'il est possible d'avoir une macro qui vient positionner une image (au préalablement nommée) dans la cellule exacte qui correspond à son nom. J'ai joint un fichier excel qui illustre mon besoin. Le contenu des cellules dépend en grande partie d'un re-traitement d'un tableau croisé dynamique. Si vous pensez que c'est infaisable, savez-vous s'il existe un soft qui va dans ce sens ?
Merci d'avance pour votre aide. :eek:
 

Pièces jointes

  • Voitures planning.zip
    41.7 KB · Affichages: 51

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Positionner une photo en fonction du contenu d'une cellule ?

Bonjour,

Code:
Sub essai()
  For Each s In Sheets("feuil1").Shapes
   On Error Resume Next
   nom = s.Name
   Set c = [E:Z].Find(What:=nom, LookIn:=xlValues, LookAt:=xlWhole)
   If Not c Is Nothing Then
      Sheets("feuil1").Shapes(nom).Top = c.Top
      Sheets("feuil1").Shapes(nom).Left = c.Left
   End If
  Next
End Sub

JB
Formation Excel VBA JB
 

wilfried_42

XLDnaute Barbatruc
Re : Positionner une photo en fonction du contenu d'une cellule ?

Boujour à tous

ou encore par Fonction personnalisée
à placer dans un module
Code:
Public Function Image(img_nom As Variant, Optional chemin As String = "") As String
    ' Declaration des variables
    Dim ref As Range, Sh As Shape, drap As Boolean
    ' ref : la cellule qui provoque la fonction
    ' sh : les shapes
    ' Drap : drapeau definissant si la shape est trouvée
    Application.Volatile ' defini une fonction qui se recalcule automatiquement
' teste le type de variable soit une cellule soit une valeur alphanumerique
    Select Case TypeName(img_nom)
        Case "Range" ' c'est une reference cellule
            Image = img_nom.Value
        Case "String" ' c'est une valeur alphanumerique
            Image = img_nom
        Case Else ' c'est une erreur
            Image = "#VALEUR"
            Exit Function
    End Select
' le chemin est un parametre optionnel, s'il est omis, la valeur est le chemin du classeur
    If chemin = "" Then chemin = ThisWorkbook.Path
' le chemin ne se termine pas forcemment par \ je le rajoute
    If Right(chemin, 1) <> "\" Then chemin = chemin & "\"
    Set ref = Application.Caller ' affectaction à ref de la cellule qui lance la fonction
    If ref.MergeCells = True Then Set ref = Range(ref.MergeArea.Address)
    drap = False ' initialisation du drapeau
    For Each Sh In ref.Worksheet.Shapes ' je passe en revue toute les shapes
' je teste son nom construite plus bas pour savoir si c'est la bonne shappe
        If "Img-" & ref.Address = Left(Sh.Name, Len(ref.Address) + 4) Then drap = True: Exit For
    Next
    If drap = True Then ' c'est la bonne shape
' je teste maintenant si c'est la meme que celle de la formule pour ne pas refaire le traitement
' Le gain de temps n'est pas negligeable
       If "Img-" & ref.Address & "-" & Image = Sh.Name Then GoTo fin ' egalité parfaite, je sors
    End If
    On Error Resume Next ' controle d'erreur, si la shape n'existe pas encore, l'instruction suivante provoque une erreur
    Sh.Delete ' je detruits la shap
    If Image = "" Then Exit Function ' la valeur est à "" alors pas de shape à affecter
' j'inserre la shape, avec l'image en lui mettant les tailles necessaires pour la cellule
    Set Sh = ref.Worksheet.Shapes.AddPicture(chemin & Image, True, True, ref.Left, ref.Top, ref.Width, ref.Height)
    Sh.Name = "Img-" & ref.Address & "-" & Image ' je definis son nom pour la trouver plus tard
fin:
    Image = "Img" & ref.Address ' j'affecte un nom pour resultat
End Function

utilisation :
=image("lenomdelimage.gif")
ou encore :
=si(a1>"";image(A1);"")
 

Discussions similaires

Statistiques des forums

Discussions
312 336
Messages
2 087 388
Membres
103 534
dernier inscrit
Kalamymustapha