Supprimer une ligne contenant des cellules verrouillées
Hello à tous!
C'est encore moi avec mon fichier Devis (que voulez-vous j'adore le customiser
J'ai besoin de vous cette fois car dans mon tableau Devis je voudrais que l'utilisateur puisse sélectionner une ligne du tableau (aléatoirement, pas forcément la dernière) et la supprimer.
Seulement le problème est que ma feuille est protégée et que les cellules des dernières colonnes sont verrouillées (pour éviter que les utilisateurs suppriment des formules malencontreusement) donc en essayant de supprimer une ligne, Excel me renvoie fatalement le message d'erreur "impossible de supprimer une ligne contenant des cellules verrouillées).
Donc, en ayant réfléchi au problème, je me suis dit qu'il était possible de faire un petit bout de code VBA pour lui dire en gros :
Si l'utilisateur sélectionne une ligne appartenant au tableau Devis + essai de la supprimer
Alors on déprotège la feuille
Puis on supprime la ligne
Puis on reprotège la feuille
Fin du Si
Or j'ai déjà deux problèmes avant d'écrire ce bout de code :
1/ la plage de mon tableau Devis n'est pas encore définie et si je la nomme alors je ne sais pas si les lignes ajoutées par mon bouton "ajout de ligne" seront prises en compte dans cette plage nommée.
2/ peux-t'on vraiment réaliser ce Si ? Peux-t'on vraiment dire à Excel : "si utilisateur sélectionne une ligne et tente de la supprimer" ? Est-ce une action identifiable?
Si jamais cela n'est pas réalisable alors je pensais créer un bouton suppression de ligne (tout comme j'ai déjà un bouton "ajout de ligne") qui permettrait de choisir la ligne du tableau à supprimer (l'utilisateur pourrait choisir le numéro de la ligne et je l'aiderais en lui mettant une nouvelle colonne avec un numéro chrono).
Je vous joins mon fichier au cas ou :
Merci d'avance pour votre aide
Vip4rk
J'utilise quelque chose de similaire a ce que tu cherche
Essaye sa en adaptant a ton fichier
Sub EffaceLigneTableau()
'déprotege la feuille
ActiveSheet.Unprotect "tonMDP"
With Selection
'test si la selection est une ligne et qu'elle n'est pas comprise dans les 5 prmeieres lignes du tableau
If .Columns.Count > 50 And .Columns.Count > 1 And Selection.Row > 5 Then
'si oui affiche la boite de dialogue de suppression de la ligne
Dim Lign As Long 'N° de la ligne à supprimer
Dim i As Long 'variable pour passer d'une colonne à une autre
Dim Rep As Integer 'Tableau mémoire contenant le nombre de colonne reseignée
Dim Plag As String 'Plage de la ligne à supprimer
Dim Mess As String 'Message du MsgBox
Lign = ActiveCell.Row 'récupération de la ligne sélectionnée
'construction du message
For i = 2 To 7 'définit le nombre de colone
Mess = Mess & vbCrLf & Cells(4, i).Value & " : " & Cells(Lign, i).Value 'cells(4,i) définit la zone d'entête
Next
Mess = Mess & vbCrLf & vbCrLf & "Voulez-vous supprimer cette opération ?"
Rep = MsgBox(Mess, vbYesNo + vbInformation + vbDefaultButton2, "Confirmation de suppression d'une opération")
'supprime la ligne
If Rep = vbYes Then
Plag = Lign & ":" & Lign
Rows(Plag).Delete
End If
'si pas la bonne plage de selection affiche message
Else
MsgBox "Veuillez sélectionner une ligne entiére" & vbLf & "Les lignes 1 à 5 ne sont pas autorisées", vbInformation, "Information"
End If
End With
'protége la feuille
ActiveSheet.Protect "tonMDP", True, True, True
End Sub
Salut @tico06
Merci pour ton code.
J'ai essayé de l'adapter mais je pense que je manque encore de connaissances en VBA pour y arriver.
Mais du coup je me suis contenté d'un code permettant de supprimer la dernière ligne du tableau et c'est déjà pas mal
Pour info le code :
Sub SuppressionLigne()
'
Application.ScreenUpdating = False
ActiveSheet.Unprotect Password:="victor"
Application.EnableEvents = False
'
Dim Ligne As Long
'
Ligne = [LigneTotalDevis].Row - 1
'
Rows(Ligne).Select
Selection.EntireRow.Delete
'
Application.CutCopyMode = False
Application.ScreenUpdating = True
ActiveSheet.Protect Password:="victor", AllowDeletingRows:=True
Application.EnableEvents = True
'
End Sub
Vip4rk