Pouvoir rajouter une ligne dans un tableau protégé et le reprotégé derrière
Bonjour à toutes et à tous,
Je travaille sur un « simple » tableau mis à disposition de plusieurs personnes mais où seule la dernière ligne vide doit pouvoir être modifiée.
L’idée est qu’une personne X puisse renseigner une ligne L (à la suite d’autres lignes déjà renseignées et protégées) et valide son action en cliquant sur la case dédiée à la fin de cette ligne (colonne M). A partir de là, cette ligne passe en gras, ne doit plus pouvoir être modifier par quiconque, le fichier doit s’enregistrer et ouvrir les droits à la modifications à la ligne L+1.
J’avais essayé de faire une macro automatique mais celle-ci est liée au numéro de la ligne.
J’avais dans l’idée ceci :
-la personne vient de renseigner la ligne L, elle clique sur la case (L ; M) pour valider
-déprotéger le classeur
-mettre en gras les cases de la ligne L
-cocher la protection de la ligne L
-décocher la protection des cases de la ligne L+1
-protéger le classeur
-enregistrer
Merci à tous pour votre aide,
Eddy
Bonjour,
Voici un essai avec un double clic sur la colonne M. Il faut placer le code dans le module de la feuille en question :
private sub worksheet_beforedoubleclick(byval target as range, cancel as boolean)
if target.column = 13 then
if target.value <> "V" then
me.unprotect "mdp"
rows(target.row).locked = true
target.interior.color = rgb(0,255,0)
target.font.color = rgb(0,255,0)
target.value = "V"
me.protect "mdp"
else
rep = msgbox("Cette ligne est verrouillée ! Voulez-vous la modifier ?",vbyesno,"Demande de confirmation")
if rep = vbyes then
me.unprotect "mdp"
range("A" & target.row & ":L" & target.row).locked = false
target.interior.color = rgb(255,255,255)
target.font.color = 0
target.value = ""
me.protect "mdp"
end if
end if
end if
end subCdlt,
Merci beaucoup pour votre réponse rapide, je regarderai cela demain et vous ferai un retour.
Eddy
Bonjour,J'ai d'abord essayé de comprendre le code et si j'ai bien compris, le mot de passe est "mdp" et pour valider la ligne je dois taper " V " dans la colonne 13 (M) de la ligne en question. Malheureusement cela ne fonctionne pas : la ligne en question ne passe pas en gras et ne passe pas en mode protégé. Les lignes du dessus sont bien protégées par contre.
Pouvez-vous m'aider svp ? Je joins le fichier avec la macro. Merci beaucoup,
Eddy
Bonjour,
Excusez-moi, c'est vrai que je ne vous ai pas donné beaucoup d'infos...
En fait, la macro se déclenche au double clic en colonne M. Il n'y a rien à saisir en colonne M. Lorsque M ne vaut pas "V" (quand elle n'est pas validée), le double clic permet de colorier la case (police et intérieur et de rajouter un "V" donc invisible) et de verrouiller la ligne entière. Lorsque la cellule vaut "V" (donc quand elle est validée et verrouillée en principe), la macro demande à l'utilisateur s'il veut déverrouiller et le cas échéant efface le "V", les couleurs et le verrou des cellules.
J'ai mis en effet un mot de passe pour l'exemple mais il serait mieux de s'en passer ou de rajouter une gestion d'erreur car une saisie incorrecte du mot de passe provoque un bug.
Je vous retourne votre fichier. L'idéal serait de déprotéger les cellules vierges car c'est le double clic qui assurera la protection.
Cdlt,
Voici une nouvelle version sans mot de passe, avec la ligne qui passe en gras et sans "V" (la condition porte uniquement sur la couleur de la cellule) même si la condition sur la valeur est plus sûre car on ne peut pas modifier la valeur d'une cellule protégée :
private sub worksheet_beforedoubleclick(byval target as range, cancel as boolean)
cancel = true
if target.column = 13 then 'si double clic en colonne M
if target.interior.color <> rgb(0,255,0) then 'si cellule en M n'est pas verte (pas validée)
me.unprotect 'deprotection
rows(target.row).locked = true 'Verrouillage des cellules de la ligne cliquée
rows(target.row).font.bold = true 'police en gras
target.interior.color = rgb(0,255,0) 'cellule M en vert
me.protect 'protection
else 'si elle est verte et validée
rep = msgbox("Cette ligne est verrouillée ! Voulez-vous la modifier ?",vbyesno,"Demande de confirmation") 'msg
if rep = vbyes then 'si reponse est oui
me.unprotect 'deprotection
range("A" & target.row & ":L" & target.row).locked = false 'deverrouillage
rows(target.row).font.bold = false 'plus gras
target.interior.color = rgb(255,255,255) 'sans couleur
me.protect
end if
end if
end if
end subCdlt,
Merci pour votre réponse, du coup je suis désolé mais cela ne répond pas à mon besoin :(
L'opérateur ne doit pas pouvoir modifier une ligne une fois qu'elle a été validée. Par contre il faut qu'à mon niveau je puisse le faire, c'est pourquoi j'avais songé à un mot de pass. Il faut également que l'opérateur ne puisse modifier que la ligne juste en dessous de la dernière ligne modifiée. Dans ma macro auto, j'avais joué avec le fait d'enlever la protection avec le mot de pass pour modifier ce que je voulais, changé la protection de ligne L+1 (décocher la case vérrouillée) et reprotéger la feuille avec le mot de pass (sauf pour la ligne L+1 pour laquelle on a décoché la case vérouillée dans la protection, ce qui la rend modifiable). Par contre cela ne marchait qu'avec une seule ligne.
En espèrant être clair dans mes explications :)
Eddy
Bonjour,
Dans ce cas, ce code suffira. Il verrouille la ligne achevée et deverrouille la suivante (et active sa 1ere cellule). J'ai mis en commentaire la possibilité de mettre la cellule en M en vert. Il faudra mettre votre propre mot de passe.
Ensuite, s'il y a besoin d'une modification, vous déverrouillez par voie classique en saisissant le mot de passe.
private sub worksheet_beforedoubleclick(byval target as range, cancel as boolean)
cancel = true
if target.column = 13 then 'si double clic en colonne M
me.unprotect "mdp" 'deprotection
rows(target.row).locked = true 'Verrouillage des cellules de la ligne cliquée
rows(target.row).font.bold = true 'police en gras
'target.interior.color = rgb(0,255,0) 'cellule M en vert
rows(target.row + 1).locked = false 'deverrouille la ligne suivante
cells(target.row + 1, 1).activate
me.protect "mdp" 'protection
end if
end subCdlt,
Merci beaucoup, j'essaye cela dès demain !! :)
Eddy
Bonjour, je viens d'essayer, cela fonctionne parfaitement !! Merci beaucoup !!
Et bien enfin !
Bonne continuation et bon week-end,