Excel supprimer des cellules quand je supprime une forme qui leur est associee [Résolu]

Signaler
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009
-
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
-
Bonjour a tous,
je suis actuellement face a un probleme avec vba et pour ne rien vous cacher je n'y connais rien a ce langage. En fait ma macro dessine dans un premier temps une forme puis inscrit dans des cellules des inforations relatives a cette forme. Dans ce sens la ca marche tres bien, en revanche, si je supprime la forme precedement dessinee, les informations relatives restent. Je souhaiterai que mes infrmations et que mes informations relatives soient remontees d une ligne. Exemple, si je supprime la 11eme forme, il faudrait que d12 et e12 soient supprimees et que les informations relatives a la 12eme forme soient maintenant dans la cellule d12 et d12.
J espere etre assez claire dans mon explication...
Dans tous les cas je vous remercie pour votre interet.
Charluche.
PS voici mon code:

Sub colis()
    Static Ligne As Long


    ' Ajout de titres pour coordonnées
    Range("D1:E1") = Array("Hauteur", "Poids")
    ' Cellule de reference
    Range("C1").Select
    ' Initialisation des compteurs    Ligne (Ligne + 1): Colonne 1


    ' Informations sur le conteneur
    Longueur = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
    Largeur = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
    Hauteur = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
    Poids = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
    ActiveCell.Offset(Ligne, Colonne) = Hauteur
    ActiveCell.Offset(Ligne, Colonne + 1) = Poids
   
    ' Dessin de la forme
    Set myDocument = Worksheets(1)
    With myDocument.Shapes
        .AddShape msoShapeRectangle, 5, 5, Longueur, Largeur
    End With
    Set myDocument = Nothing


End Sub

24 réponses

Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Content pour toi et fier de moi
Mais pour que je cumule des points c'est ma réponse qu'il faut accpter ... pas la tienne

Cliquons "Réponse Acceptée" quand c'est le cas
JML. Partageons notre savoir et nos acquis
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Salut,
En fait j'ai oublier de corriger le module de suppression en tenant compte des mofifs du module de création
Ligne en rouge dans le code ci-dessous
Attention au mot de passe si tu l'a modifié dans le fichier

Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
  Err.Clear
  NumBoite = Selection.Name
  If Err <> 0 Then Exit Sub
  ActiveSheet.Unprotect (" password ")
  Selection.Delete
  Range(Cells(Range(NumBoite & "_Hauteur").Row, Range("hauteur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
  Selection.Delete Shift: =xlUp
 ActiveSheet.Protect "password", DrawingObjects:=True, Contents:=True, Scenarios:=True
 ActiveSheet.EnableSelection = xlUnlockedCells
  Range("A1").Select
End Sub
Cliquer "Réponse Acceptée" Quand La Réponse Est OK
JML. Partageons notre savoir et nos acquis
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Salut,
Je pense que toute la partie sous ' Dessin de la forme peut se réduire à
   Worksheets(1).Shapes.AddShape msoShapeRectangle, 5, 5, Longueur, Largeur

Si j'ai bien compris ton soucis c'est la suppression des données relatives à la forme supprimée. Je pense qu'en enregistrement de macro en exécutant la suppression, tu auras le code souhaité.

JML
 Partageons notre savoir et nos acquis
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour JM,
merci de ta reponse, j ai bien essaye de passer par lenregistrement mais le probleme c est que VBA n enregistre pas les lignes concernant les formes. De plus il faudrait que le lie les cellule avec la forme et ca je ne sais pas comment faire, si tu as une idee je suis preneur.
Charluche
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Salut,
La suppression de l'objet de fait elle par code ou manuellement ?

JML
 Partageons notre savoir et nos acquis
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour JML,
la suppression de la forme se fera manuellement avec la souris puis la touche suppr, par la suite il faudra que les cellules associees a cette forme soit elle aussi supprimee.
Merci pour ton interet.
Charluche
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Désolé mais aucune chance car la suppression d'objet dans une feuille ne déclenche aucun évènement du type "Change" ou "Sélection Change" ... Ce qui veut dire que à moins de faire une usine à gaz du type :
Clic sur un bouton qui balaie toutes les cellules contenant des infos relatives aux objets ... et qui supprimerait les cellules dont l'objet n'existerait plus ...
Constat d'inexistence établi par le fait que l'objet créé et la plage de cellule s'y référant porterait le même nom
Mais pourquoi pas !!!
JML
 Partageons notre savoir et nos acquis
Messages postés
9
Date d'inscription
jeudi 28 juin 2007
Statut
Membre
Dernière intervention
8 septembre 2007

J'ai une idée qui vient... je vous la livre comme elle me vient, j'ai pas creusé plus avant :

Créer une classe qui associerait la forme et les cellules (autrement elles ne seront associé que dans l'esprit de charluche) avec une méthode pour les détruire, qui s'occuperait d'effacer la forme, effacer la ligne, et mettre à jour les formes suivantes... Mais faudrait un bouton qui appelle une feuille (UserForm) pour demander à l'utilisateur quel rectangle effacer.

C'est tout de suite un peu plus compliqué.

En même temps, si c'est juste pour effacer un rectangle et une ligne, on peut le faire à la main.

Et puis d'abord, t'as vraiment besoin de mémoriser ces deux valeurs ? Parce que j'en ai pas l'impression. Je crois qu'il nous manque une vision d'ensemble du projet pour pouvoir apporter une aide efficace.

<hr />AglarEdain
J'avais cherché une signature originale... mais j'ai rien trouvé.
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Et pourquoi ne pas développer un code pour la création de l'objet en utilisant InputBox pour la définition des valeurs et du nom de l'objet puis d'affecter ces valeurs dans un objet texte qui porterait un nom associé à celui de l'objet.
Puis comme le préconise AglarEdain - celui qui recherche une signature originale - gérer la suppression par du code

JML
 Partageons notre savoir et nos acquis
Messages postés
9
Date d'inscription
jeudi 28 juin 2007
Statut
Membre
Dernière intervention
8 septembre 2007

Je viens de voir que oui il y a besoin des valeurs en qestion. Désolé, j'avais mal lu.

Sinon, je reste sur mon idée de classe. Genre une classe Colis qui aurait comme "propriétés" :
.Hauteur as Long
.Largeur as Long
.Longueur as Long
.Poids as Integer
.IndexDeForme as Integer
.Ligne as Integer

Et ensuite, gérer un tableau avec des classes Colis dedans.

<hr />AglarEdain
J'avais cherché une signature originale... mais j'ai rien trouvé.
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour a tous les deux,
je vous remercie tout d abord pour votre interet. En revanche je dois vous avouer que je suis un peu honteux car je n ai aucune formation de programmeur ou quoi que ce soit et du fait de l utilisation de formes libres l enregistreur de macro ne m aide pas beaucoup, bref je ne peux meme pas faire de bricolage pour vous faire rire de mon incompetence!
Pour repondre a la premiere question, l objet de ce projet est de calculer une sorte de barycentre. Le tout se passe sur le pont d un bateau, une premiere macro me permet de dessiner le colis sur le pont et de rentrer des informations quant a la hauteur du centre de gravite du colis ainsi que son poids (coef ponderateur pour le barycentre). Une fois tous les colis dessines sur le pont une deuxieme macro (qui fonctionne) scrute tous les colis presents et calcul le centre de cahque forme par rapport au coin sup gauche de ma feuille. Cette macro me donne ces resultats par ordre d apparition de la forme sur la feuille. Dans ce cas tout marche tres bien. En revanche si je fais une erreur de saisie ou autre, si je supprime la forme, la macro de calcul de centre de gravite fonctionne et ne tiens plus compte de cette forme alors que la premiere macro elle laisse les infos entree par l inputbox bref plus moyen de faire les calculs sur excel. Voici donc dans le detail la problematique.
Pour en revinir a vos suggestions, elles me semblent tout a fait compatibles au projet. Seulement je ne vois pas comment les mettre en oeuvre (niveau zero de connaissance VBA), Pourriez vous donc s il vous plait me donner une methode et des codes pour que je puisse essayer de m en sortir avec l aide VBA? Je suis desole de vous demande de me macher ainsi le travail mais je ne peux pas faire mieux.
Encore meric a vous deux,
Charluche
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Si j'ai bien tout compris, ce qui compte pour les calculs ce sont les valeurs, les objets ne sont là que pour être créés puis éventuellement supprimés
Alors pourquoi plutôt qu'un objet ne pas utiliser une cellule en regard de celles contenant les valeurs afin de simplement identifier le carton
Ainsi la suppression se ferait par la suppression de la ligne

JML
 Partageons notre savoir et nos acquis
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour JML,
mes formes mes sont utiles car les colis charges sont de grandes taille (6m*2.4m) et sont stockes sur un espaces restreint. Elles me sont donc de grande utilite pour optimise au mieux le chargement de facon visuelle. De plus elle permettent de les deplacer et de les faire tourner en gardant une vue d ensemble. Je reste donc sur mon idee de lier une forme avec des cellules. Je fais de recherche actuelement pour maitriser un peu mieux le integer mais ce n est pas encore terrible. Dans tous les cas je reste ouvert a toute proposition.
Merci encore pour ton interet,
Charluche.
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Bonjour,
Ca devrait répondre à ta question ... à toi de l'adapter

' Dans une feuille Excel
' Cellules de titre doivent être nommées : "Longueur", "Largeur", "Hauteur", "Poids"
' Une cellule doit être nommée "NombreDeBoites"
' Les 2 codes ci-dessous affectés à un bouton après avoir été collés dans un module


Option Explicit
Sub CreationBoite()
Dim Lg, Cl
' Ne pas oublier d'ajouter les tests concernant les valeurs ... Diff de vide et Numérique
  ActiveSheet.Shapes.AddShape(msoShapeRectangle, 20.25, 12#, 34.5, 26.25).Select
  Range("NombreDeBoites") = Range("NombreDeBoites") + 1
  Selection.Name = "Boite" & Range("NombreDeBoites")
  Lg = Range("Longueur").End(xlDown).Row + 1
  If Lg > 65536 Then Lg = 2
  Cl = Range("Longueur").Column
  Cells(Lg, Cl) = InputBox("Saisir la Longueur de la boite", "LONGUEUR BOITE")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Longueur", RefersToR1C1:=Cells(Lg, Cl)
  Cl = Range("Largeur").Column
  Cells(Lg, Cl) = InputBox("Saisir la largeur de la boite", "LARGEUR BOITE")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Largeur", RefersToR1C1:=Cells(Lg, Cl)
  Cl = Range("Hauteur").Column
  Cells(Lg, Cl) = InputBox("Saisir la hauteur de la boite", "HAUTEUR BOITE")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Hauteur", RefersToR1C1:=Cells(Lg, Cl)
  Cl = Range("Poids").Column
  Cells(Lg, Cl) = InputBox("Saisir le poids de la boite", "POIDS BOITE")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Poids", RefersToR1C1:=Cells(Lg, Cl)
End Sub
'************************
Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
  Err.Clear
  NumBoite = Selection.Name
  If Err <> 0 Then Exit Sub
  Selection.Delete
  Range(Cells(Range(NumBoite & "_Longueur").Row, Range("Longueur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
  Selection.Delete Shift:=xlUp
End Sub

JML
 Partageons notre savoir et nos acquis
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Pas de nouvelle ... Est ce à dire que cela fonctionne ?

Cliquons "Réponse Acceptée" quand c'est le cas
JML
 Partageons notre savoir et nos acquis
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour JML,
desole du retard, j ai passe un peu de temps pour adapter ton cade a ma sauce car je n y connais pas grand chose. Dans tous les cas je te felicite car ca fonctionne impecable. C est vraiment tres aimable de ta part d avoir passer autant de temps pour moi.
Encore un grand merci car ton aide m a etee tres utile.
Encore merci pour tout,
Charluche.
PS : voici ton code maintenant bidouille:
Option Explicit
Sub CreationBoite()
  Dim Lg, Cl, cd, ce
  cd = InputBox("Longueur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Longueur du conteneur", "1")
  ce = InputBox("Largeur du conteneur en metre, si vous ne connaissez pas la longueur exacte, tapez 1 et ajustez manuellement avec les poignees.", "Largeur du conteneur", "1")
  ActiveSheet.Shapes.AddShape(msoShapeRectangle, 20, 20, cd, ce).Select
  Range("NombreDeBoites") = Range("NombreDeBoites") + 1
  Selection.Name = "Boite" & Range("NombreDeBoites")
  Lg = Range("Hauteur").End(xlDown).Row + 1
  If Lg > 65536 Then Lg = 2
  Cl = Range("Hauteur").Column
  Cells(Lg, Cl) = InputBox("Hauteur du conteneur en metre, cette hauteur sera automatiquement ponderee du coefficient 2/3 pour le calcul du KG.", "Hauteur du conteneur")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Hauteur", RefersToR1C1:=Cells(Lg, Cl)
  Cl = Range("Poids").Column
  Cells(Lg, Cl) = InputBox("Poids du conteneur en tonnes.", "Poids du conteneur")
  ActiveWorkbook.Names.Add Name:="Boite" & Range("NombreDeBoites") & "_Poids", RefersToR1C1:=Cells(Lg, Cl)
 
End Sub
Sub SuppressionBoite()
Dim NumBoite
On Error Resume Next
  Err.Clear
  NumBoite = Selection.Name
  If Err <> 0 Then Exit Sub
  Selection.Delete
  Range(Cells(Range(NumBoite & "_Hauteur").Row, Range("hauteur").Column), Cells(Range(NumBoite & "_Poids").Row, Range("Poids").Column)).Select
  Selection.Delete Shift:=xlUp
  Range("A1").Select
End Sub
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

C est mieux comme ca?
encore felicitation!
Charluche
Messages postés
57
Date d'inscription
mardi 14 août 2007
Statut
Membre
Dernière intervention
10 novembre 2009

Bonjour JML,
je suis de retour mais rassure toi pour quelque chose de tres facile pour toi, mais une fois de plus compliquee pour moi. En fait je souhaiterai que la forme qui apparait soit deverouillee de maniere a ce que je puisse la modifier meme si ma feuille est protegee. L utilisateur n a pas le droit de modifier les images et formes qui ne sont pas issues de la macro. J ai bien essaye de mettre des activeshape.unprotect un peu partout, mais sans grand succes. Si tu es encore dans le coin, pourras tu me donner ton avis.
Merci encore pour tout,
charluche
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
Envoie moi ton fichier à cette adresse
[mailto:Jean-Michel@Lascous.com Jean-Michel@Lascous.com]

Cliquer "Réponse Acceptée" Quand La Réponse Est OK
JML. Partageons notre savoir et nos acquis

Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
2
C'est un X à la fin
[mailto:Jean-Michel@Lascoux.com Jean-Michel@Lascoux.com]

Cliquer "Réponse Acceptée" Quand La Réponse Est OK
JML. Partageons notre savoir et nos acquis