Supprimer une image présente dans une cellule via macro

Résolu
Heine -  
 Heine -
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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  2. 612C Messages postés 3 Statut Membre
     
    Bonjour,

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

    Dim imgx As Object
    For Each imgx In ActiveSheet.Shapes
    imgx.Delete
    Next
    0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  4. Heine
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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. Heine
       
      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
  7. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  8. Heine
     
    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
  9. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
  10. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  11. Heine
     
    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
  12. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  13. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
  14. Heine
     
    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
  15. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voici un exemple avec une plage de cellule.

    A adapter a tes besoins

    http://www.cjoint.com/data3/3BfsA08D15b.htm
    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
  16. Heine
     
    Merci beaucoup pour l'exemple, ça fonctionne parfaitement pour moi, merci merci merci !
    0