XL 2013 Supression d'une ligne et de sa case a cocher

filiph79

XLDnaute Occasionnel
Bonjour le forume

Dans une liste excel j'ai inséré dans la colonne A une case à cocher de formulaire associée à une cellule pour chacune de mes lignes:
Ex ligne 3, la case est associée a A3
ligne 4, la case est associée a A4
ligne 5, la case est associée a A5
etc etc....

Je souhaite créer une macro qui par 1 Bouton supprime automatiquement la ligne sur laquelle je suis + la case à cocher correspondante
J'ai créé une variable me permettant de stocker le numéro de ligne

NumLig = Activecell.row
puis
cells(numlig,1).entireRow.delete pour supprimer la ligne, mais je n'arrive pas a supprimer la case à Cocher correspondante
j'ai vu que la case avait une propriété LinkedCell = "Ref Cellule"
et souhaitait identifier la case de cette façon ,

par exemple quelque chose comme

checbox.linkedCell=cells(numlig,1) .delete

Ou en balayant toutes les case de la feuille :

With ActiveSheet
For Each CheckBoxes In .CheckBoxes
If CheckBoxes.linkedCell=cells(numlig,1) then CheckBoxes.linkedCell=cells(numlig,1).delete
Next

mas je n'y arrive pas,

Avez vous une réponse ?

cordialement
 

Sylvain

XLDnaute Occasionnel
Bonsoir,

Une idée à tester.
VB:
Option Explicit
Option Compare Text
Sub efface(ByVal adresse)
'
'Supprime les cases à cocher liées à la cellule adresse ($A$8 par exemple)
  Dim sh As Shape
  On Error Resume Next
  For Each sh In ActiveSheet.Shapes
    sh.Select
    If Selection.LinkedCell = adresse Then
      If Err.Number = 0 Then
        sh.Delete
      End If
    End If
    Err.Clear
  Next
  On Error GoTo 0
End Sub
Sub test()
  efface "$A$8"
End Sub
 

filiph79

XLDnaute Occasionnel
Bonjour sylvain
Merci pour ta réponse qui correspond à ce que je souhaite même si c'est un poil compliquer à la lecture du Code !!!!
J'ai pu modifier le code pour supprimer la case à cocher en fonction de ma cellule active en écrivant ds la procédure Test :
"$A$"& Activecell.Row
et ajouter dans la procédure Efface Activecell.EntireRow.delete après sh.delete

Pour comprendre le code que tu as écrit, j'ai ajouter quelques commentaires ds le code ci dessous, peux tu qd tu auras un peu de temps me confirmer si ils sont corrects et j'ai aussi quelques questions Complémentaires.

Option
Explicit Déclaration des variables obligatoires
Option
Compare Text ??? pour gérer le texte stocké dans adresse et la référence de la procédure SUB ?

Sub efface(ByVal adresse) Début de la Procédure
'
'Supprime les cases à cocher liées à la cellule adresse ($A$8 par exemple)
Dim sh As Shape

On Déclare la variable Sh comme un objet Forme/Dessin ou objet OLE……

Est-il possible de faire en sorte que cette variable ne concerne que les ChecBoxes. ?


On Error Resume Next ‘Gestion de l’erreur, si il n’y a pas de « Shapes »dans la feuille on quitte la procédure

For Each sh In ActiveSheet.Shapes ’Boucle permettant de balayer l’ensemble des objets présents dans la feuille

sh.Select On sélectionne le 1er objet

If Selection.LinkedCell = adresse Then On vérifie si la cellule liée de la forme correspond bien à la référence définie dans la procédure test

If Err.Number = 0 Then

sh.Delete SI il n’y a pas d’erreur on supprime l’objet

End If
End If
Err.Clear Réinitialise l’erreur ?

Next
On Error GoTo 0
End Sub Fin de la procédure



Sub test()
efface "$A$8" ‘Exécute la procédure Efface ave comme référence l’adresse « $A$8 »
End Sub Fin de la procédure

Questions :
sub efface (Byval Adresse)
Adresse permet d'exécuter la macro avec la référence saisie dans test mais techniquement cela correspond à quoi, Ce n'est pas une variable ? c'est un paramêtre ?
Comme je déclenche macro à partir d'une forme automatique (Un "shape" donc) , ma forme est sélectionnée a la fin de macro, du coup je ne suis plus sur ma celluleActive.
Peux ton limiter l'exécution du code aux checkBoxes et utiliser une variable as Checboxes (ce n'est pas dispo qd on saisit par exemple Dim Ch as ........
Pourquoi faut il passer par une première Procédure test en demandant d'exécuter la procédure Sub efface() avec la référence de cellule identifier dans test.
Dans mes premiers essais j'essayai de stocker dans une variable la référence à prendre en compte et d'utiliser celle ci pour effacer la case à cocher qui était liée a la référence en question......


Voila.
Merci encore pour ta solution proposée, elle me sert!!!, et au plaisir de te lire.
cordialement Philippe
 

Paf

XLDnaute Barbatruc
bonjour,

pour reprendre le code du post 1, on pourrait écrire:
VB:
With ActiveSheet
For Each cb In .CheckBoxes
      If cb.LinkedCell = Cells(numlig, 2).Address Then cb.Delete
Next
en prenant garde que les adresses de cellules liées soit du type $A$1 ou pas .

une autre solution si les cases à cocher sont numérotées au N° de la ligne (en ligne 8 : case à cocher 8 , ce qui est peu probable...
VB:
ActiveSheet.CheckBoxes("case à cocher " & numlig).Delete
A+
 
Dernière édition:

filiph79

XLDnaute Occasionnel
Merci A vous PAF,
Ta solution correspond à ce que j'avais imaginé pouvoir faire !!
et Merci Aussi à toi Sylvain.
cordialement
 

filiph79

XLDnaute Occasionnel
With ActiveSheet
For Each cb In .CheckBoxes
If cb.LinkedCell = Cells(numlig, 2).Address Then cb.Delete
Next
bonjour PAF, Je viens de tester ton code mais il me génère une erreur d'éxécution 1004
Erreur définie par l'application ou par l'objet......

Cordialement
 

Paf

XLDnaute Barbatruc
ce morceau de code doit être intégré au reste de ton code où la variable numlig est initialisée. je ne vois que ça qui pourrait poser souci.

edit : Par sécurité, il faudrait modifier Cells en .Cells

re edit : à moins que CheckBoxes ne fonctionne pas au delà de XL2003
 
Dernière édition:

filiph79

XLDnaute Occasionnel
Bonjour PAf,
Effectivement avec numlig initialisée, cela fonctionne parfaitement.
Ayant fait évoluer mon fichier, j'ai maintenant un 2ème Case à cocher dans la colonne 3 et je ne vois pas comment supprimer cette case en suivant la 1ère.


cordialement
 

Paf

XLDnaute Barbatruc
si cette seconde case à cocher possède également une cellule liée sur chaque ligne (en supposant colonne C),

VB:
For Each cb In .CheckBoxes
      If cb.LinkedCell = Cells(numlig, 2).Address Then cb.Delete
      If cb.LinkedCell = Cells(numlig, 3).Address Then cb.Delete 
Next
ou
VB:
For Each cb In .CheckBoxes
      If cb.LinkedCell = Cells(numlig, 2).Address  Or cb.LinkedCell = Cells(numlig, 3).Address Then cb.Delete
Next
 

filiph79

XLDnaute Occasionnel
Bonjour PAF,
de retour sur mon fichier.......
la 2ème ligne de suppression des Cases à Cocher génère une erreur 1004 Impossible de lire la propriété linkedcell de la classe checkBox…???
J'ai joint mon fichier exemple avec le code. la cellule liée étant relative, j'ai ajouté Row et column absolute := false dans le code.

Je dois aussi après avoir supprimer les cases sur la ligne, supprimer cette ligne --> Activecell.entirerow.delete
Je code me permet de nettoyer le fichier pour ne plus avoir de lignes vides en fin de fichier (254 Lignes réservées) et je devrai donc répéter ces actions pour toutes les lignes sélectionnées.
j'aimerai par exemple fairs ces suppressions après avoir sélectionnés le 50 Dernières lignes. mon problème est en fait lié à la suppression des lignes qui ne supprime pas automatiquement les cases à cocher …….
Peut être y a t'il une autre façon de gérer ce problème…...
Cordialement
Et merci de ta patience …...
 

Fichiers joints

Paf

XLDnaute Barbatruc
J'avais répondu un peu vite pour la première proposition du post# 9, ça ne peut pas marcher.
Par contre la deuxième devrait fonctionner.

ce qui devrait donner avec les adresses relatives :

VB:
.../...
numlig = ActiveCell.Row
    With ActiveSheet
        For Each cb In .CheckBoxes
              If cb.LinkedCell = .Cells(numlig, 22).Address(0, 0) _
              Or cb.LinkedCell = .Cells(numlig, 23).Address(0, 0) Then cb.Delete
        Next
    End With
.../...
 

filiph79

XLDnaute Occasionnel
merci de ta réponse, effectivement ca marche
Comme je dois supprimer plusieurs lignes en même temps, j'ai modifié comme ci dessous, ca a l'air de fonctionner (même si ca a l'air un peu long en traitement.
LA macro devant etre déclenchée après la sélection des lignes à supprimer
….
nbfois = Selection.Rows.Count
For c = 1 To nbfois
numlig = ActiveCell.Row
With ActiveSheet
For Each cb In .CheckBoxes
If cb.LinkedCell = .Cells(numlig, 22).Address(0, 0) _
Or cb.LinkedCell = .Cells(numlig, 23).Address(0, 0) Then cb.Delete
Next
ActiveCell.EntireRow.Delete

End With
Next c
…..
 

Discussions similaires


Haut Bas