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
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
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.
OptionExplicit Déclaration des variables obligatoires
OptionCompareText ??? 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. ?
OnErrorResumeNext ‘Gestion de l’erreur, si il n’y a pas de « Shapes »dans la feuille on quitte la procédure
ForEach 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
EndIf EndIf
Err.Clear Réinitialise l’erreur ?
Next OnErrorGoTo 0 EndSub 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 » EndSub 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
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.
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 …...
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
.../...
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