Supprimer une image présente dans une cellule via macro [Résolu/Fermé]

Signaler
-
 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

Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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


Messages postés
2
Date d'inscription
vendredi 30 janvier 2015
Statut
Membre
Dernière intervention
5 février 2015

Bonjour,

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

Dim imgx As Object
For Each imgx In ActiveSheet.Shapes
imgx.Delete
Next
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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!
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.
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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

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 ?
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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!
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..
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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

Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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!
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 =/
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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


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 )
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
Voici un exemple avec une plage de cellule.

A adapter a tes besoins

http://www.cjoint.com/data3/3BfsA08D15b.htm
Messages postés
7436
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 juillet 2021
643
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

Merci beaucoup pour l'exemple, ça fonctionne parfaitement pour moi, merci merci merci !