Shape à effacer
Bonjour,
Je suis toujours avec mes Cartes Grises
Dans le code j'arrive bien à créer et placer la CG. Le problème est que je n'arrive pas à lui fixer un nom pour pouvoir la faire disparaitre ensuite. La photo de la CG a toujours un nom aléatoire du style Picture (plus un nombre indéfini), donc ma macro d'effacement ne fonctionne plus puisque la Picture a changé de numéro. L'idéal aurait été que lorsque je survole mon bouton CG, celle-ci s'affiche et quand je sors du bouton elle disparaisse pour libérer l'écran. Mais d’abord voici où je suis rendue :
Public Sub ShowCG() 'Affiche la Carte Grise
'Déclaration des Variables
Dim strDossierCG As String
Dim strTypImage As String
Dim strNomPhoto As String
Dim strConcat As String
Dim shCG As Shape
Dim Cpt As Integer
Dim strUnit As String
Dim L As Single, T As Single, H As Single, W As Single
Dim strCG As String
'Dimensions et position de la Carte Grise
H = 600 '<-- hauteur
W = 450 '<-- largeur
L = 1385 '<-- position horizontale
T = 0 '<-- position verticale'Insertion de la zone de texte
' ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, L, T, W, H).Select
' Selection.Name = "CG" & Range("A1").Value '<-- nom de la zone de texte
'
' Range("A3").Activate '<-- permet de quitter la sélection de la zone de texte
strUnit = InputBox("Unité où sont localisées les Cartes Grises ? (Clé USB, Disque Dur)", "Choix Unité de Disque", "E")
strDossierCG = ":\VDL\CG\"
strNomPhoto = Range("A1")
strTypImage = ".jpg"
strConcat = strUnit & strDossierCG & strNomPhoto & strTypImage
Debug.Print strConcat
ActiveSheet.Shapes.AddPicture Filename:=strConcat, linktofile:=msoFalse, savewithdocument:=msoTrue, Left:=1400, Top:=0, Width:=450, Height:=600
Efface
End SubEt pour effacer
Sub Efface()
ActiveSheet.Shapes.Range(Array("Picture 7")).Select
Selection.Delete
Range("A3").Select
End SubC'est le Picture 7 qui me rend folle. Je pensais à hide, show, visible=false ou true enfin déjà faut que je fixe le Picture en le nommant mais là je patine. Une petite aide pour ce début d'année 2019 que je vous souhaite excellente.
Salut Alessya, et bonne année 2019 également !
C'est le Picture 7 qui me rend folle. Je pensais à hide, show, visible=false ou true
Avec ton exemple de Picture 7 ce sera :
ActiveSheet.Shapes.Range(Array("Picture 7")).Visible = FalsePour rendre invisible
ActiveSheet.Shapes.Range(Array("Picture 7")).Visible = TruePour rendre visible
ActiveSheet.Shapes.Range(Array("Picture 7")).DeletePour supprimer
Après une petite astuce pour connaître le nom de l'image sur laquelle tu clique :
- Lance l'enregistreur de macro
- Sélectionne ton image
- Va voir en VBA ce que tu a de ressorti comme nom
Si sa se trouve, tu n'a pas "Picture 7" mais "Image 7"
Restant à dispo!
Merci pour la réponse.
Mais ce qui me perturbe, c'est le "Picture XX" qui passe de X à Y à Z une fois qu'il est effacé puis rechargé.
Je suis intéressée par la façon de le renommer en "dur" par une variable. Comme cela c'est le nom en "dur" que j'effacerai sans ambiguïté.
Et dans les propriétés et méthodes de Shape, j'y perds mon latin.
Si tu me dis comment le fixer en dur ce nom aléatoire. J'ai essayé avec ".name" mais je reconnais que je me sens perdue et je ne sais plus ce que j'ai essayé ou pas essayé. A chaque fois, mes essais sont pleins d'erreurs
Bonjour à tous,
Ci-joint un extrait de code d'une de mes appli.
Dans ce code, je nomme mes shapes avec un préfixe pour pouvoir les effacer facilement quand il y a besoin
Sub Affiche_jpg(lg As Long)
Dim Sh As Shape, ndf As String
With Sheets("Catalogue").Cells(lg, "D")
ndf = Ndf_Jpg(.Value)
If Exist_Fichier(RepJpg & ndf) Then
Set Sh = Sheets("Catalogue").Shapes.AddPicture(RepJpg & ndf, True, True, _
.Left, .Top, .Width, .Height)
Sh.Name = "Sh" & lg
Sh.OnAction = "USF"
End If
End With
Set Sh = Nothing
End Sub
Sub RAZ(Optional x As Byte)
Dim Sh As Shape, lg As Long
With Sheets("Catalogue")
lg = .Cells(Rows.Count, "A").End(xlUp).Row
.Range("A1:D" & lg).ClearContents
For Each Sh In .Shapes
If Sh.Name Like "Sh*" Then Sh.Delete
Next Sh
End With
End SubPierre
Re-
Salut Pierre
Pour renommer un Shape la méthode .Name fonctionne bien :
ActiveSheet.Shapes.Range(Array("Picture 1")).Name = "Sh_1"Maintenant le Shape qui précédemment s'appelait "Picture 1" s'appel "Sh_1"
Ce qui peut différer c'est la méthode pour le renommer !
- En cliquant dessus ?
- En bouclant dessus ?
- A l'insertion ?
Restant à dispo
Merci tout le monde.
Je réfléchis un peu et je me dis que le fait de supprimer la Shape pour le recréer après (à la demande de l'utilisateur) va me recréer un Picture avec un n° différent. et donc il serait plus judicieux de cacher la Shape et de la remontrer à la demande ce qui solutionnerait d'où peut-être un hide, show, ou un visible True ou False.
Le problème c'est que sur la feuille j'ai 3 boutons et que si je fais un selectall.delete, ben c'est que mes boutons s'en vont aussi. Donc je dois figer le nom de la Shape Picture impérativement à la création avec le N° de la plaque d'immatriculation (qui est unique) et qui se trouve en A1. Donc je pensais que le survol du bouton CG pourait visualiser la carte grise ex: AA 111 BB dont l'image (Picture X) est collée sur la feuille. Elle pourrait disparaitre (se cacher) ensuite une fois la consultation terminée.
Je vous montre le code que j'utilise pour créer mes feuilles véhicules.
Dans une feuille "Véhicules" j'ai tous les véhicules en colonne A. Cette colonne est balayée pour créer x feuilles correspondant à chaque immat. Une fois qu'elles sont crées suivant un "Modèle" sur laquelle j'ai 3 boutons (dont un CG), dans chaque feuille, au premier clic sur CG, je crée une Shape. Et c'est là le binst. Dois-je cacher et montrer ou supprimer et recréer ?
Option Explicit
Public Sub SuVeh()
Dim oSh As Worksheet
Const strongVéhicules As String = "Véhicules"
Const strongServices As String = "Services"
Const strongPersonnel As String = "Personnel"
Const strongOutillage As String = "Outillage"
Const strongGaranties As String = "Garanties"
Const strongFournisseurs As String = "Fournisseurs"
Const strongAchats As String = "Achats"
Const strongDépenses As String = "Dépenses"
Const strongPublipostage As String = "Publipostage"
Const strongCG As String = "Cartes Grises"
Const strongBD As String = "BD"
Const strongModèle As String = "Modèle"
If MsgBox("Suppression des véhicules ?", vbYesNoCancel + vbExclamation) <> vbYes Then
Exit Sub
End If
For Each oSh In Worksheets
If oSh.Name <> strongVéhicules And _
oSh.Name <> strongServices And _
oSh.Name <> strongPersonnel And _
oSh.Name <> strongOutillage And _
oSh.Name <> strongGaranties And _
oSh.Name <> strongFournisseurs And _
oSh.Name <> strongAchats And _
oSh.Name <> strongDépenses And _
oSh.Name <> strongPublipostage And _
oSh.Name <> strongCG And _
oSh.Name <> strongBD And _
oSh.Name <> strongModèle Then
Application.DisplayAlerts = False
oSh.Delete
Application.DisplayAlerts = True
End If
Next oSh
End Sub
Public Sub AjVeh()
Dim oShVéhicules As Worksheet
Dim oShServices As Worksheet
Dim oShPersonnel As Worksheet
Dim oShOutillage As Worksheet
Dim oShGaranties As Worksheet
Dim oShFournisseurs As Worksheet
Dim oShAchats As Worksheet
Dim oShDépenses As Worksheet
Dim oShPublipostage As Worksheet
Dim oShCG As Worksheet
Dim oShBD As Worksheet
Dim oShModèle As Worksheet
Dim iLigFin As Integer
Dim iLig As Integer
Dim oShNew As Worksheet
Dim sNomOnglet As String
Set oShVéhicules = Worksheets("Véhicules")
Set oShServices = Worksheets("Services")
Set oShPersonnel = Worksheets("Personnel")
Set oShOutillage = Worksheets("Outillage")
Set oShGaranties = Worksheets("Garanties")
Set oShFournisseurs = Worksheets("Fournisseurs")
Set oShAchats = Worksheets("Achats")
Set oShDépenses = Worksheets("Dépenses")
Set oShPublipostage = Worksheets("Publipostage")
Set oShCG = Worksheets("Cartes Grises")
Set oShBD = Worksheets("BD")
Set oShModèle = Worksheets("Modèle")
iLigFin = oShVéhicules.Range("A" & Rows.Count).End(xlUp).Row 'C
For iLig = 4 To iLigFin
If oShVéhicules.Range("A" & iLig).Value <> "" Then
sNomOnglet = oShVéhicules.Range("A" & iLig).Value
If OngletExist(sNomOnglet) Then
Set oShNew = Worksheets(sNomOnglet)
Else
oShModèle.Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = sNomOnglet
Set oShNew = Worksheets(Worksheets.Count)
'ShowCG
End If
oShNew.Range("A1").Value = oShVéhicules.Range("A" & iLig).Value 'Véhicule
'oShNew.Range("F3").Value = oShListe.Range("C" & iLig).Value 'Nom
'lien hypertext
oShNew.Hyperlinks.Add Anchor:=oShVéhicules.Range("A" & iLig), Address:="", SubAddress:= _
"'" & sNomOnglet & "'!A3", TextToDisplay:=oShVéhicules.Range("A" & iLig).Value
Set oShNew = Nothing
End If
Next iLig
oShVéhicules.Select
Set oShVéhicules = Nothing
Set oShServices = Nothing
Set oShPersonnel = Nothing
Set oShOutillage = Nothing
Set oShGaranties = Nothing
Set oShFournisseurs = Nothing
Set oShAchats = Nothing
Set oShDépenses = Nothing
Set oShPublipostage = Nothing
Set oShCG = Nothing
Set oShBD = Nothing
Set oShModèle = Nothing
End Sub
Private Function OngletExist(psNom As String) As Boolean
Dim oSh As Worksheet
Dim lErr As Long
Dim sErr As String
On Error Resume Next
Set oSh = Worksheets(psNom)
lErr = Err.Number
sErr = Err.Description
On Error GoTo 0
If lErr = 0 Then
OngletExist = True
ElseIf lErr = 9 Then
OngletExist = False
Else
MsgBox "Erreur n°" & lErr & vbCrLf & sErr, vbExclamation
End If
Set oSh = Nothing
End FunctionLe code donné par Juice permet de renommer certes mais "Picture 1" changera de nom à la prochaine ouverture et donc le problème se présentera à nouveau. Ou alors je n'ai pas tout compris dans la manip
ActiveSheet.Shapes.Range(Array("Picture 1")).Name = "Sh_1"Le code de PierreP56, je n'ai pas eu le temps de le modifier. Il a l'air intéressant, mais je pense que si je pouvais cacher et remontrer la CG à la demande, ça serait plus simple dans la pratique (peut-être pas dans le code). Dans ce cas plus besoin de renommer la Shape Picture.
Bouuhh, je vous donne du souci avec CG. Faut imaginer que ce sont des cartes de voeux !!!
Finalement je pense avoir résolu le problème du nom de la Shape qui me perturbait.
J'ai modifié mon code :
ActiveSheet.Shapes.AddPicture Filename:=strConcat, linktofile:=msoFalse, savewithdocument:=msoTrue, Left:=1400, Top:=0, Width:=450, Height:=600De la façon suivante :
Set shCG = ActiveSheet.Shapes.AddPicture(Filename:=strConcat, linktofile:=msoFalse, savewithdocument:=msoTrue, Left:=1400, Top:=0, Width:=450, Height:=600)
shCG.Name = Range("A1").Value
Range("A3").Activate