Supprimer une image présente dans une cellule via macro

Résolu
Bonjour ! Merci d'avance de prendre le temps de lire ma requête, je vous explique le problème :-)

Mon classeur excel est composé de deux feuilles : une feuille bdd, où est présent un tableau à trois colonnes. Chaque cellule du tableau a une image.

La seconde feuille consiste en une macro qui, selon des paramètres précis, copie une des cellules du tableau et la met sur cette dite-feuille. Du coup, cela copie aussi l'image.

Maintenant que c'est terminé, j'aimerai créer une macro de reset, qui remettrai la cellule dans l'état où elle est... Or, j'ai beau copier une cellule "vierge" par dessus la cellule où l'image vient d'apparaître, elle est toujours présente ! Je ne trouve pas de moyen pour la supprimer "automatiquement" via la macro !

Voilà voilà, dans l'espoir que vous puissiez m'aider, merci d'avoir lu (-:

15 réponses

  1. Contributeur
    Bonjour,

    Cliques sur ton image, tu verras son nom en haut à gauche en dessous du ruban. Mets la dans le code ci-dessous:

    ActiveSheet.Shapes("Image 1").Select ' a adapter le nom de l'image
    Selection.Delete


    0
    1. Bonjour,

      C'est du VBA ou une macro?
      en VBA :

      Dim imgx As Object
      For Each imgx In ActiveSheet.Shapes
      imgx.Delete
      Next
      0
      1. Contributeur
        Si tu n'as qu'une image sur ta feuille, tu peux utiliser aussi cela:

        ActiveSheet.Shapes.SelectAll
        Selection.Delete
        


        Par contre si il n'y a pas d'image tu auras un bug!
        0
        1. Merci de vos réponses rapides !

          Pivert > Le problème est que ce n'est pas toujours la même cellule qui sera copiée, donc pas tout le temps la même image... Et il y a plus de deux cents images =/ Il n'y a pas d'équivalent à celui sur toute la feuille mais pour juste une cellule ?

          612C > C'est du VBA, mais l'image n'apparaît pas via le VBA. En gros, chaque cellule du tableau de la feuille "bdd" a une image, et le code copie la cellule, ce qui copie aussi l'image en même temps.
          0
          1. Contributeur
            Si c'est la dernière image tu peux l'avoir comme ceci:

             Dim img As Object
              Set img = Worksheets(1).Shapes 'a adapter le nom de la feuille
               MsgBox img.Count 'nbre d'images

            0
            1. Excuses moi, je débute en VBA et... Je ne vois pas quoi modifier dans ce code, pour l'adapter au nom de la feuille ainsi que le "nbre d'images'" =/

              Juste un peu de curiosité : si je fais apparaître plusieurs images (par exemple 4) de cellules différentes, il me suffirait d'utiliser ce code 4 fois pour supprimer les 4 ?
              0
          2. Contributeur
            La solution est dans ma 1ère réponse. Il te faut récupérer le nom de l'image et l'adapter au code

            ActiveSheet.Shapes("Image 1").Select ' a adapter le nom de l'image
            Selection.Delete


            Il s'agit de la feuille active où se trouve tes images

            Il faut faire ce code pour chaque image à supprimer en l'adaptant au nom de l'image

            C'est simple!
            0
            1. Sauf que comme précisé dans ma première réponse, ce n'est pas la même image qui apparaît. J'ai besoin d'une manière pour supprimer une image, sans devoir préciser son nom, vu que je ne le sais pas à l'avance.

              L'autre code que tu m'as proposé, qui supprime la dernière image apparue ( de ce que j'ai compris ) m'irait, mais je ne vois pas comment le faire fonctionner, je ne sais pas quoi modifier là-dedans pour l'adapter, comme tu l'as marqué dans le commentaire..
              0
              1. Contributeur
                Voilà essaie ceci avec un bouton:

                Private Sub CommandButton1_Click()
                Dim var
                Dim img As Object
                  Set img = ActiveSheet.Shapes
                   var = img.Count 'nbre d'images
                   
                   'vérification nom image en haut à gauche sous le ruban
                   MsgBox "Image " & var 'verifier si cela correspond à la dernière image, sinon corrigé var
                   'en conséquence par var + 1 ou 2 etc.
                   
                   If var = "0" Then Exit Sub 'si pas d'image
                
                ActiveSheet.Shapes("Image " & var).Select
                Selection.Delete
                End Sub
                

                0
                1. Contributeur
                  Par exemple si le MsgBox te donne: "Image 100"

                  et que ta dernère image est "Image 104" tu mets ceci:

                  ActiveSheet.Shapes("Image " & var + 4).Select
                  
                  0
              2. Contributeur
                Une autre solution. Il faut sélectionner l'image à supprimer et mettre ce code:

                Private Sub CommandButton2_Click()
                Dim img As Object
                For Each img In ActiveSheet.Shapes
                img.Select
                MsgBox "Le nom de la forme sélectionnée est : " & img.Name
                ActiveSheet.Shapes(img.Name).Select
                Selection.Delete
                Next
                End Sub


                Je pense qu'avec tout cela tu vas pouvoir l'adapter à ton programme!
                0
                1. J'ai vraiment du mal avec tes codes... Désolé, vraiment =/

                  Le problème est que techniquement, on ne va pas faire apparaître juste une fois les images. Les gens qui se serviront du fichier vont les faire apparaître / disparaître plusieurs fois ( vu qu'il y a de l'aléatoire ) et le problème est que les noms continuent d'avancer.

                  Par exemple, Je viens de faire apparaître 5 images, qui vont de Image 54 a 59, je les supprime via " ActiveSheet.Shapes("Image 1").Select ' a adapter le nom de l'image
                  Selection.Delete "et lorsqu'on génère d'autres images, les noms continuent... donc le code ne fonctionne plus.

                  De plus, dans tout les cas ça va buguer et ne pas marché vu que techniquement, il peut y avoir jusqu'à cinq images à supprimer mais parfois moins, ce n'est pas obligatoire !

                  Je commence à penser que ce que je demande est impossible =/
                  0
                  1. Contributeur
                    Une autre solution.Supprimer la dernière image d'un clic droit en A1 si A1 contient "1"

                    Allez dans la feuille qui contient les images, mettre 1 dans la cellule A1 (a adapter)

                    Allez dans le code sélectionner en haut à gauche la feuille concernée et mettre ce code:

                    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
                    If Target.Value = "1" Then
                    delete_shapes
                    End If
                    End Sub
                    Private Sub delete_shapes()
                    Dim img As Object
                    For Each img In ActiveSheet.Shapes
                    MsgBox "Le nom de la forme sélectionnée est : " & img.Name 'a supprimer après essai
                    ActiveSheet.Shapes(img.Name).Select
                    Selection.Delete
                    Exit Sub
                    Next
                    End Sub
                    


                    A chaque clic droit dans A1 ou dans une cellule qui contient "1", la dernière image est supprimée. Cela est a adapter suivant tes préférences
                    0
                    1. Contributeur
                      J'ai une autre solution, si tu connais où ce trouve le bord haut et gauche de l'image. Je l'ai mis dans l'evenement de la feuille: Worksheet_SelectionChange
                      Tu peux changer:

                      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                      Dim img As Object
                      For Each img In ActiveSheet.Shapes
                      If Not Application.Intersect(img.TopLeftCell, ActiveSheet.Range("C19")) Is Nothing Then
                               If img.Type = msoPicture Then img.Delete
                             End If
                          Next img
                      End Sub
                      


                      a adapter la cellule

                      0
                      1. Salut, encore merci de tes rapides réponses !

                        La première "nouvelle" solution ne me convient pas, s'il faut à chaque fois faire un clique droit sur l'image, autant dire simplement à la personne de cliquer dessus et d'appuyer sur suppr'... =/

                        Concernant l'autre, je ne comprend pas ce que tu veux dire par "bord haut et gauche de l'image"... L'image est redimensionnée pour rentrer largement dans la cellule ( de manière à ce que, lorsque la macro copie la cellule, elle recopie bien la position de l'image )
                        0
                        1. Contributeur
                          Voici un exemple avec une plage de cellule.

                          A adapter a tes besoins

                          http://www.cjoint.com/data3/3BfsA08D15b.htm
                          0
                          1. Contributeur
                            Et regarde ce que font ces 2 boutons avec un autre code:

                            Option Explicit
                            Sub Bouton1_Clic()
                            'caché
                            Dim img As Object
                            For Each img In ActiveSheet.Shapes
                            If Not Application.Intersect(img.TopLeftCell, ActiveSheet.Range("A3:M31")) Is Nothing Then
                                     If img.Type = msoPicture Then img.Visible = False
                                   End If
                                Next img
                            End Sub
                            Sub Bouton7_Clic()
                            'visible
                            Dim img As Object
                            For Each img In ActiveSheet.Shapes
                            If Not Application.Intersect(img.TopLeftCell, ActiveSheet.Range("A3:M31")) Is Nothing Then
                                     If img.Type = msoPicture Then img.Visible = True
                                   End If
                                Next img
                            End Sub
                            
                            
                            0
                        2. Merci beaucoup pour l'exemple, ça fonctionne parfaitement pour moi, merci merci merci !
                          0