Insérer des images à partir de leurs noms

Bonjour à tous,

J'apprécierais qu'on m'aide à concevoir une macro qui insère une image dans une cellule à partir de son nom (sans son extension).

J'ai un fichier (Exemple.xlsm) qui contient 6 espaces réservés à des images. En cliquant une seule fois sur un des rectangles, le répertoire contenant les images s'ouvre. Je peux alors sélectionner l'image désirée et celle-ci est collée à l'endroit désigné, dimensionnée selon les critères définis dans le code VBA (' Macro & instructions pour coller une photo et le nom de celle-ci (B11)....) et le nom du fichier est indiqué en haut à gauche de l'image. Les images sont de format JPG et leur préfixe commence par 001, 002, 003,....999, 1000.

Mon problème est le suivant : j'aimerais pouvoir également copier les images automatiquement en conservant les dimensions prédéfinis en tapant le nom de l'image. Par exemple : cadre B11 @ E17, je tape en "B10", le numéro : 032 suivi de "Entrée" et automatiquement la photo 032.jpg sera collée dans le cadre B11 @ E17 et ainsi de suite pour les 5 autres espaces réservés aux images. Afin d'éviter l'ouverture du répertoire contenant les images après l'appui sur la touche "Entrée", il faudra modifier le code VBA (' Macro & instructions pour coller une photo et le nom de celle-ci (B11)....) pour activer un rectangle avec un double-clic au lieu d'un simple clic (cas actuel).

En vous remerciant par avance pour votre précieuse aide.

Salutations,

Renaud D.

176exemple.xlsm (261.37 Ko)

Bonjour Renaud,

Whaou!!! Ton code c'est Beyrouth! Un peu de ménage de serait pas inutile pour qu'on s'y retrouve...

Bonjour GVIALLES,

Malheureusement, je ne suis pas un programmeur en code VBA.

J'ai fait un peu de ménage dans mon code et c'est le mieux que je peux faire (voir pièce jointe).

Je suis désolé.

Salutations,

Renaud D.

113exemple-2.xlsm (248.12 Ko)

Bonsoir Renaud,

En P.J. une proposition.

J'ai dénommé chaque cadre d'image (shape) de la façon suivante : "Imgxxx" avec xxx= coordonnées de la cellule liée : par exemple pour la figure liée à la valeur de la cellule B10, le nom du cadre d'image est "ImgB10".

De plus, j'ai défini la plage nommée "Codes_Images" contenant toutes les cellules devant contenir le nom des images (B10, G10, B26...).

Le code VBA qui affiche les images est :

Option Explicit
Const cPath = "E:\EXCEL_PRATIQUE\RENAUD_DUGAS\Images" 'A modifier suivant le repertoire contenant les images
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oCellsCodesImages As Name
    Dim oFS As Object
    Dim oShape As Shape

    Dim lTop As Double
    Dim lWidth As Double
    Dim lHeight As Double
    Dim lLeft As Double

    Dim sImageFileName As String, sCadreImageName As String

    Set oFS = CreateObject("Scripting.FileSystemObject")

    'On s'assure que la cellule modifiée est une cellule de la plage "Codes_Images"
    Set oCellsCodesImages = ThisWorkbook.Names("Codes_Images")
    If InStr(1, oCellsCodesImages.RefersTo, Target.Address) > 0 Then
        'Récupération du nom de l'image
        sImageFileName = cPath & "\" & Target.Value & ".jpg"
        'On s'assure que le fichier existe
        If oFS.Fileexists(sImageFileName) Then
            'On charge l'image dans la boite voulue
            sCadreImageName = "img" & Replace(Target.Address, "$", "")
            On Error Resume Next
            Set oShape = ActiveSheet.Shapes(sCadreImageName)
            If Not oShape Is Nothing Then
                'On sauvegarde les propriétés de la shape
                lLeft = oShape.Left
                lTop = oShape.Top
                lWidth = oShape.Width
                lHeight = oShape.Height
                'On supprime l'ancienne shape
                oShape.Delete
                'On créé une nouvelle shape au même emplacement et aux mêmes dimensions et portant le même nom
                Set oShape = ActiveSheet.Shapes.AddPicture(sImageFileName, msoFalse, msoTrue, lLeft, lTop, lWidth, lHeight)
                oShape.Name = sCadreImageName
            Else
                MsgBox "Cadre d'image " & sCadreImageName & " non trouvé!"
            End If
            On Error GoTo 0
        End If
    End If

End Sub
189exemple-2-gvs.xlsm (338.64 Ko)

Bonjour GVIALLES,

Merci d'avoir répondu à ma demande d'aide.

J'ai regardé le fichier joint "Exemple2_GVS.xlsm" que vous m'avez transmis mais je ne peux pas ouvrir une image dans un répertoire image.

Il faut que je puisse utiliser les deux méthodes et celles-ci doivent coexister. Le répertoire image n'a de nom prédéfini (répertoire par défaut).

1ère méthode :

* Ouvrir une image en cliquant sur les cadres B11 ou B19 ou B27 ou G11 ou G19 ou E27 et y apposer le nom du fichier (sans son extension) en haut à gauche de l'image comme dans l'exemple du fichier joint "Exemple2.xlsm". La position et la dimension des images doivent être celles définies dans la macro de l'exemple "Exemple2.xlsm". Les dimensions en B11 ne sont pas le mêmes qu'en B19 ou B27 ou G11 ou G19 ou E27.

2ème méthode

La deuxième méthode effectue le processus inverse de la première méthode.

Par exemple, pour la cellule B10, je tape "001", suivi d'entrée. Le curseur se déplace à droite de "B10" en "C10" et non en "B11"et la photo "001" est insérée dans la cellule "B11" selon la position et la dimension définies dans la macro de l'exemple "Exemple2.xlsm. Idem pour "B18", B26, G10, G18 et E26.

J'espère de tout coeur que vous pourrez m'aider à réaliser cette macro.

Cordiales salutations,

Renaud D.

Bonjour Renaud,

Tu écris :

Il faut que je puisse utiliser les deux méthodes et celles-ci doivent coexister. Le répertoire image n'a de nom prédéfini (répertoire par défaut)

Cela signifie-t-il que pour la méthode 2 (c'est cette méthode que j'utilise dans ma proposition), tu désires que le système demande le répertoire dans lequel trouver l'image?

Bonjour GVIALLES,

Effectivement, lorsqu'on insère une image pour la première fois, nous devons définir un répertoire dans lequel Excel ira puiser ses images.

Avec la première méthode, je dois initialement définir le répertoire images par défaut en sélectionnant le répertoire et l'image désirée.

Avec la deuxième méthode, le répertoire images par défaut n'est pas nécessairement celui désiré. On devra donc le définir au début en le sectionnant à l'aide de l'explorateur. Il sera probablement pertinent de poser la question au début. Est-ce que le répertoire images par défaut est le bon? Dans l'affirmative, l'insertion des images se fera à partir du répertoire par défaut. Dans la négative, l'utilisateur devra choisir à l'aide de l'explorateur, le répertoire par défaut qu'il désire. La question ne lui sera plus posée par la suite.

Merci de l'intérêt que vous portez à mon problème.

Sincères salutations,

Renaud D.

Bonsoir Renaud,

En P.J. une nouvelle proposition...en espérant avoir répondu à tes attentes...

Bonsoir CVIALLES,

Malheureusement, je n'est pas reçu votre pièce jointe.

Salutations,

Renaud D.

Oups pour la P.J...

151exemple-3-gvs.xlsm (341.20 Ko)

Bonsoir GVIALLES,

J'ai testé votre macro et la sélection du répertoire par défaut fonctionne bien.

Les images s'insèrent bien quand on tape le nom du fichier image. Il faut que l'image s'insère dans le cadre et que le curseur se positionne à droite du nom du fichier car si le curseur se positionne sur le cadre, il y aura un conflit entre votre macro et ma macro (première méthode - Fichier : Exemple.xlsm).

Il faut également que l'on puisse supprimer une photo et en insérer une autre autant de fois qu'on le désire sans que le message "Cadre d'image img___ non trouvé!" apparaisse.

Au plaisir de vous lire.

Salutations,

Renaud D.

Bonsoir GVIALLES,

J'ai testé votre macro et la sélection du répertoire par défaut fonctionne bien.

Les images s'insèrent bien quand on tape le nom du fichier image. Il faut que l'image s'insère dans le cadre et que le curseur se positionne à droite du nom du fichier car si le curseur se positionne sur le cadre, il y aura un conflit entre votre macro et ma macro (première méthode - Fichier : Exemple.xlsm).

Il faut également que l'on puisse supprimer une photo et en insérer une autre autant de fois qu'on le désire sans que le message "Cadre d'image img___ non trouvé!" apparaisse.

Au plaisir de vous lire.

Salutations,

Renaud D.

Bonjour Renaud,

1-Pour le positionnement du curseur à droite de la zone modifiée, tu dois juste ajouter :

 Target.Offset(, 1).Select

Dans la séquence :

If Not oShape Is Nothing Then
                lLeft = oShape.Left
                lTop = oShape.Top
                lWidth = oShape.Width
                lHeight = oShape.Height
                oShape.Delete
                Set oShape = ActiveSheet.Shapes.AddPicture(sImageFileName, msoFalse, msoTrue, lLeft, lTop, lWidth, lHeight)
                oShape.Name = sCadreImageName
               Target.Offset(, 1).Select

2-Pour la suppression d'image, il y a un soucis : dans ton exemple, 2 cadres de dimensions différentes cohabitent. Comment savoir quel type de cadre doit s'appliquer?

Bonjour GVIALLES,

Dans le premier fichier joint "Exemple.xlsm", lorsqu'on clique sur la cellule "B11", une fenêtre s'ouvre dans le répertoire images par défaut. Après avoir choisi l'image à insérer, les dimensions de l'image insérée dans la cellule "B11" sont celles définies dans ma macro. Pour les cellules "B19, B27, G11, G19 & E27", les images sont intégrées au cadre déjà défini.

Je vous prie de noter qu'après l'insertion d'une image, un cadre doit entouré cette image (voir "Exemple.xlsm").

Comme mentionné précédemment, les deux méthodes d'insertion d'images (sélection des images par la méthode définie dans le fichier "Exemple.xlsm" ou par le nom de l'image) doivent cohabiter et les macros doivent permettre de supprimer et d'insérer d'autres images sans qu'un message d'erreur apparaisse.

Sincères salutations,

Renaud D.

Bonjour Renaud,

Un nouvelle version pour "Méthode 2" :

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim oCellsCodesImages As Name
    Dim oFS As Object
    Dim oShape As Shape, oRange As Range

    Dim lTop As Double
    Dim lWidth As Double
    Dim lHeight As Double
    Dim lLeft As Double

    Dim sImageFileName As String, sCadreImageName As String, sPath As String

    Set oFS = CreateObject("Scripting.FileSystemObject")
    'On s'assure que le dossier d'images existe
    sPath = ThisWorkbook.Names("Dossier_Images").RefersToRange.Value
    If Not oFS.Folderexists(sPath) Then
        MsgBox "Le dossier images n'a pas été trouvé!"
        Exit Sub
    End If
    'On s'assure que la cellule modifiée est une cellule de la plage "Codes_Images"
    Set oCellsCodesImages = ThisWorkbook.Names("Codes_Images")
    If InStr(1, oCellsCodesImages.RefersTo, Target.Address) > 0 Then
        'Récupération du nom de l'image
        sImageFileName = sPath & "\" & Target.Value & ".jpg"
        'On s'assure que le fichier existe
        If oFS.Fileexists(sImageFileName) Then
            'On charge l'image dans la boite voulue
            sCadreImageName = "img" & Replace(Target.Address, "$", "")
            On Error Resume Next
            Set oShape = ActiveSheet.Shapes(sCadreImageName)
            If Not oShape Is Nothing Then
                lLeft = oShape.Left
                lTop = oShape.Top
                lWidth = oShape.Width
                lHeight = oShape.Height
                oShape.Delete
                Set oShape = ActiveSheet.Shapes.AddPicture(sImageFileName, msoFalse, msoTrue, lLeft, lTop, lWidth, lHeight)
                oShape.Name = sCadreImageName
                Target.Offset(, 1).Select
            Else
                'Récupération du cadre de l'image
                Set oRange = Target.Offset(1)
                lLeft = oRange.Left
                lTop = oRange.Top
                lWidth = oRange.MergeArea.Width
                lHeight = oRange.MergeArea.Height
                Set oShape = ActiveSheet.Shapes.AddPicture(sImageFileName, msoFalse, msoTrue, lLeft, lTop, lWidth, lHeight)
                oShape.Name = sCadreImageName
                Target.Offset(, 1).Select
            End If
            On Error GoTo 0
            'On encadre l'image
            With oShape.Line
                .Weight = 2
            End With
        Else
            MsgBox "L'image '" & Target.Value & ".jpg' n'existe pas dans le dossier images choisi!"
        End If
    End If

End Sub

Mon EXCEL de test en P.J.

79exemple-4-gvs.xlsm (316.17 Ko)

Bonsoir GVIALLES,

Votre macro fonctionne très bien. Vous avez fait un beau travail.

Cependant, quand j'intègre votre code à mon fichier (Exemple 3.xlsm ci-joint) contenant la première méthode, afin que les deux méthodes fonctionnent conjointement, les deux méthodes d'intégration d'images bloquent.

Par exemple, en cliquant sur le bouton "Bouton1_Cliquer()", votre macro bloque à " Set oCell = ThisWorkbook.Names("Dossier_Images").RefersToRange".

Je ne suis vraiment pas un expert en programmation et j'essaie de comprendre pourquoi votre macro et la mienne refusent de fonctionner. Individuellement, mon code et le vôtre marchent très bien.

Je suis à court d'idées.

Salutations,

Renaud D.

22exemple-3.xlsm (255.75 Ko)

Bonjour Renaud,

2 soucis dans "Exemple 3" :

  • Tu dois donner le nom "Dossier_Images" à la plage de cellules A4:J4 stockant le dossier des images (Formules/Définir un nom).
  • Tu dois affecter la macro "Bouton1_Cliquer" au bouton situé derrière la même zone (Clic droit sur le bouton et Affecter une macro...).

Je renvoie ton Classeur modifié en conséquence.

35exemple-3.xlsm (325.07 Ko)

Bonsoir GVIALLES,

L'objectif est presque atteint.

Je vois maintenant où a été défini le "Dossier_Images" et le "Codes_Images".

Individuellement, les deux méthodes fonctionnent très bien mais lorsque celles-ci cohabitent, il y a un conflit d'opération.

Avec votre macro, après l'insertion du nom de l'image suivi de "Entrée" au clavier, il faudrait éviter que les cellules "B11" ou "B19",... contenant les images soient interceptées afin de ne pas activer mes macros et l'ouverture du répertoire images.

Avec l'exécution de mes macros, il faudrait éviter que votre macro copie l'image une deuxième fois à l'emplacement désigné.

Je ne sais si c'est possible de faire cohabiter les deux méthodes (insertion de l'image par son nom / insertion du nom par son image). L'utilisation fonctionnelle des deux méthodes dans le même fichier serait très pratique.

J'attends vos commentaires.

Sincères salutations,

Renaud D.

Bonjour Renaud,

Pour régler ces problèmes je propose que le déclenchement de ta méthode se réalise par un double-clic dans le cadre de l'image dans laquelle elle doit s'insérer. Et pour réaliser cette proposition, il est nécessaire :

  • De définir une une nouvelle plage nommée "Cadres_Images" représentant, comme son nom l'indique, tous les cadres d'images.
  • De déplacer le code de déclenchement de ta méthode de l'évènement "Selection_Change" à l'évènement "BeforeDoubleClick".

Ce qui donne :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    'On s'assure que la cellule sélectionnée est dans la plage "Cadres_Images"
    Set oCellsCodesImages = ThisWorkbook.Names("Cadres_Images")
    If InStr(1, oCellsCodesImages.RefersTo, Target.Cells(1, 1).Address) > 0 Then
        If Not Intersect(Target, Range("B11")) Is Nothing Then cellule_B11
        If Not Intersect(Target, Range("G11")) Is Nothing Then cellule_G11
        If Not Intersect(Target, Range("B19")) Is Nothing Then cellule_B19
        If Not Intersect(Target, Range("G19")) Is Nothing Then cellule_G19
        If Not Intersect(Target, Range("B27")) Is Nothing Then cellule_B27
        If Not Intersect(Target, Range("E27")) Is Nothing Then cellule_E27
        Cancel = True
    End If

End Sub

Je joins mon fichier de test.

135exemple-5-gvs.xlsm (241.70 Ko)

Bonjour GVIALLES,

Effectivement, le double-clic sur les cellules images permet d'éviter l'ouverture du répertoire images à l'exécution de votre macro.

Cependant, quand j'insère une image avec le double-clic (mon code), une deuxième image est insérée dans la cellule images. Idéalement, une seule image doit être insérée dans l'espace réservé à cet effet.

Je me pose une question. Serait-t-il plus simple de concevoir une macro qui permettrait d'activer une méthode ou une autre comme un "interrupteur"?

Au plaisir de vous lire,

Sincères salutations,

Renaud D.

Rechercher des sujets similaires à "inserer images partir leurs noms"