Empecher la suppression d'une shape
Bonjour a tous,
Je vous ecris pour le probleme suivant:
J'ai un fichier dans lequel des shapes sont generees petit a petit. Au fur et a mesure que j'entre des articles et leur code en respectivement D et E, je cree une forme en G2 comportant comme texte le code de l'article, pour la positionner sur mon etalage ensuite.
Je voudrais intercepter la suppression d'une shape avec un messagebox par exemple. Je sais le faire lorsqu'il s'agit d'une cellule en particulier via une procedure Workbook_SheetChange mais s'agissant la d'une manipulation de Shapes et qui plus est de n'importe laquelle parmi celles existantes a un instant t, c'est plus complique...
Par contre attention, je veux pouvoir continuer a bouger mes shapes de part et d'autre de ma feuille.
Je vous ai mis un exemple de fichier en PJ pour une meilleure comprehension du probleme.
Merci pour vos contributions!
Bonsoir Léa13
Il doit y avoir un problème avec ton fichier
1 pour ThisWorkbook
1 pour Sheet1
A+
Bonjour,
Pas eu d'erreur sur 2010.
A ma connaissance il n'y a pas d'événement sur les shapes.
A part boucler dessus toutes les secondes avec OnTime pour récréer les manquantes je ne vois pas.
eric
Bonsoir a tous les deux et merci pour vos reponses.
Mince je pensais qu'on trouverait une solution en passant par Workbook_SheetChange...
Bizarre pour les erreurs dans le fichier.... Voici en piece jointe un screenshot de la feuille et je donne le code utilise ci dessous. La procedure est associe au bouton du meme nom.
Sub Generer_Shape()
Dim last_line As Long
Dim Sh As Shape, Num As Integer, NbBoite As Integer
For Each Sh In ActiveSheet.Shapes
If Sh.Name Like "Box*" Then
Num = Val(Mid(Sh.Name, 4))
If Num > NbBoite Then NbBoite = Num
End If
Next Sh
last_line = ThisWorkbook.Worksheets(1).Range("D65536").End(xlUp).Row
Set Sh = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 40, 40)
With Sh
.Name = "Box" & NbBoite + 1
.TextFrame.Characters.Text = ThisWorkbook.Worksheets(1).Range("E" & last_line)
.TextFrame.VerticalAlignment = xlVAlignCenter
.TextFrame.HorizontalAlignment = xlHAlignCenter
.TextFrame.Orientation = msoTextOrientationDownward
.Top = ActiveSheet.Range("G2").Top
.Left = ActiveSheet.Range("G2").Left
End With
End SubDans ce cas peut etre qu'on pourrait imaginer un bouton "Check" qui verifierait que toutes les lignes ajoutees ont bien generees une shape et proposer a l'utilisateur la creation d'une shape si on s'apercoit que l'une d'elles manque?
Mais la encore, ma connaissance de la manipulation des shapes s'avere trop limite...
Bonsoir,
Je ne comprends pas trop ni ton problème, ni ton souci !
Déjà tu pourrais utiliser .Shapes.Count+1 pour générer la nouvelle boîte à générer plutôt que ta méthode alambiquée, ou même te baser sur le rang de l'article, ce qui serait plus précis si tu estimes que des formes pourraient être supprimées (comment ?)
Ensuite tu pourrais lancer la génération par une procédure Change sur la colonne E (en cadrant la partie code boîte : la procédure pourrait vérifier si une boîte existe, vérifier son inscription et la modifier s'il y a lieu, la créer si elle n'existe pas, la supprimer si la cellule est vide...
(C'est exprès que tu ne mets pas les inscriptions horizontales ?)
Cordialement.
Bonjour MFerrand,
Ok je ne connaissais pas .Shapes.Count, en effet dans ce cas c'est un peu plus simple!
En fait ce probleme n'est qu'un exemple d'un probleme plus large sur lequel je travaille mais que je n'ai pas voulu mettre en ligne de peur de rebuter les bonnes volontes vu la longueur du code...
En fait, (cf fichier joint), il s'agit d'un entrepot ou l'on veut entreposer des boites longilignes sur des etageres. Le programme doit servir a renseigner l'emplacement d'une nouvelle boite (ou le nouvel emplacement d'une boite qui a ete deplacee) et a rechercher ou se trouve une boite en particulier.
Mon probleme actuel est le suivant:
Si je supprime une ligne de la liste, mais pas la boite, le programme ouvre une boite de dialogue pour m'informer qu'il n'y a pas match et me propose d'ajouter la ligne ou de supprimer la boite, parfait.
Cependant dans le cas inverse ou je supprime une boite et pas la ligne correspondante dans la liste, pour une boite suffiamment "haute" dans la liste, quand j'appuie sur save, cela supprime toutes les positions des boites de la liste et un message m'avertit qu'il ne trouve pas la boite en question, mais je n'ai pas la possibilite de regler le probleme en la creant ou en la supprimant. Je ne peux pas non plus cliquer sur "create new item", il faut que je supprime la ligne en question dans la liste et generalement tout cela fait planter le programme a un moment donne.
C'est pour ca que je cherchais un moyen a empecher la suppression d'une boite existante autre qu'en passant par le moyen prevu a cet effet qui est le bouton "delete" Mon exemple de fruits et legumes etait peut etre un peu trop simplifie...
Si vous avez une idee la dessus je suis preneur!
Bonsoir,
Pour diagnostiquer le fonctionnement,, cela demande une étude un peu approfondie... J'ai déjà une erreur à la première ouverture (rien de grave apparemment...). Au vu de tes indications, j'ai le sentiment qu'un certain nombre de choix conceptuels ne sont pas de nature à faciliter l'utilisation : diagramme à l'envers, pas de distinction entre les boîtes "support" et les boîtes "supportées", dénomination indépendante des boîtes...
Ceci étant, le problème que tu soulèves ne me paraît pouvoir être correctement solutionné que si les boîtes inscrites sont les seules à pouvoir figurer dans le diagramme et uniquement à l'emplacement inscrit, donc si ce qui ne correspond pas aux inscriptions (boîtes manquantes, boîtes en trop, boîtes déplacées, boîtes non exactement dimensionnées..) est automatiquement éliminé pour rétablir la situation.
La question est d'arriver à insérer ça dans le programme et d'en définir les déclencheurs, ainsi que revoir l'ensemble pour assurer que les processus soient verrouillés sur : création/modification >> validation >> inscription >> traduction automatique diagramme, et que toutes les modalités d'utilisation obéissent à ce schéma.
Cordialement.
Bonsoir,
- Oui je me suis apercu de cet erreur a l'ouverture, une procedure "Workbook_Open" inutile dans "ThisWorkbook" je l'ai supprimee dans la V2.
- Pour ce quie st de la difference boites supports/supportees pourquoi voudrais tu la faire apparaitre? Elle sont interchangeables (pas de critere boite fragile ou autre qui rentre en jeu) dans tous les cas sauf si une boite est trop petite est dans ce cas elle sera obligatoirement au dessus si on ne veut pas qu'elle tombe.
- Je suis d'accord avec vous si j'ai bien compris, le fichier a besoin de nettoyage et n'a pas forcement etait super bien concu des le depart... C'est fort probable, je suis desolee je n'ai pas beaucoup d'experience en programmation...
Je mets en PJ la V2, je n'ai rien change, juste rajoute la capacite de rechercher un item dans le store.
En tout cas merci pour votre interet! =)
Cordialement
Petite relance, quelqu'un aurait-il des idees fraiches sur la question?
En vous remerciant pour votre temps,
Cordialement
Bonjour,
Je m'étais un peu penché sur l'analyse du problème.
J'en étais arrivé à la conclusion que si tu continuais avec des formes tu devais les balayer toutes régulièrement pour recréer les absentes (dont tu aurais stocké leur position) comme je te l'avais dit.
Ou sinon utiliser des ActiveX qui eux ont des événements sur feuille.
Avec une image ActiveX tu as les événements Click, MouseMove, MouseDown et MouseUp qui peuvent te servir à détecter une action dessus et empêcher sa sélection (donc plus de suppression possible)
Le pb c'est qu'il faut créer des sub pour chaque objet créé, et gérer les déplacements en deux temps : 1 clic = sélection/désélection de l'objet, 1 clic sur une cellule le déplace (avec soucis pour le déplacer directement sur une cellule qu'il recouvre, ce qui devrait être autorisé).
Ou bien faire un module de classe mais là ça dépasse mes compétences.
Voilà deux pistes mais qui demandent trop de travail pour te proposer un modèle.
eric
Bonjour,
Je suis en syntonie avec eriiic sur le sujet...
Cela demande du temps de s'y pencher, d'autant plus que je ne ferais rien sans commencer par remettre ton diagramme à l'endroit : ce n'est pas ergonomique de devoir toujours pencher la tête du même côté !
Je ne dis pas que j'abandonne définitivement ton problème... mais vu le nombre de fichiers que je tripote en même temps, ce ne sera pas pour tout de suite ! On peut exprimer le diagnostic de différentes façons, pour ma part je l'avais sous la forme : procédure de validation unique et fiabilisée. Ce qui implique d'analyser l'ensemble du programme... On ne résoudra pas la question par une ou deux lignes de code, la révision à faire est au niveau de la conception et de la façon dont les différentes interventions s'articulent entre elles.
Je commencerais par faire le schéma de toutes les procédures-actions de ton programme, comment elles sont lancées et comment elles débouchent sur le résultat, cela devrait mettre en évidence les points sur lesquels il y a lieu d'intervenir pour modifier le cheminement du programme...
Cordialement.