Verrouiller cellule avec macro

Fermé
Denis - 15 déc. 2009 à 13:26
 denis - 17 déc. 2009 à 18:01
Bonjour, j'ai un probleme que je vais tenter de vous expliquer le plus simplement possible:

J'ai crée un classeur (sous excel7)
Ce classeur comprend 50 feuilles rigoureusement identiques.
Chaque feuille comprend 52 cases, correspondant chacune à un versement hebdomadaire (soit les 52 semaines de l'année), versement libre, bien sûr! Chacun met ce qu'il veut!
En fin d'année, on additionne pour chacun des 50 membres leurs 52 cases et on leur rend le total avec quelques intérets.
Chaque semaine, j'effectue moi meme la saisie des versements .
Donc pour la 1ere semaine, je renseigne la 1ere case des 50 feuilles existantes.
Une fois que c'est fait, je passe à la 2e semaine et je renseigne la 2e case des 50 feuilles existantes Etc..etc...

Et voici le probléme que j'ai : lorsque je passe à la 2e semaine, je voudrais que les cases (donc les cellules de la 1ére semaine) se verrouillent automatiquement, afin que je ne puisse plus réecire dessus par inadvertance.

C'est moi même qui activerait ce verrouillage en VALIDANT le versement, une fois les saisies effectuées.


Et pour ça, je crée une 51e feuille (appelée "validation" (identique aux 50 premieres, ca simplifiera!) dans laquelle je mets 52 cases à 0 ou à 1 (chaque case correspondant à la validation du versement hebdomadaire concerné)

Donc, par exemple , si dans ma feuille "validation, la case 23 est à 1, ca veut dire que le versement de la semaine N)23 est validé et que je dois automatiquement verrouiller les cases N23 de chacun des 50 membres!)

Si la case=0 : le versement n'est pas validé, rien ne se passe.
Si la case est à 1 : le versement est validé ;il faut alors verrouiller automatiquement les cases du versement concerné

Donc, à coté de chacune des 52 cases de ma feuille "validation" , je voudrais mettre une formule de type ( si (versement N°1=1, alors verrouille_ les_cellules n°1 des 50 feuilles.

Il va de soi que les cellules de chaque feuilles sont en mode non verrouillé, pour que je puisse les saisir)

Autrement dit, je voudrais faire un verrouillage conditionnel par formule.

J'espère ne pas avoir été trop saoulant : merci d'avance à ceux qui pourraient bien m'aider et qui ont eu la patience de me lire jusqu'au bout
A voir également:

5 réponses

Bonjour,

Il n'y a pas, à ma connaissance, de formule pour faire ce que tu as dit. Mais avec une ou deux macros en VBA, c'est assez simple.
Est-ce que tu sait créer des macros, ou est-ce tu as des notions de VBA?

A+.
0
Helas non, je suis novice en la matière! mais tu peux peut etre me montrer comment on fait :il me faudrait une macro (ou une fonction ) du genre lock(cellule) et unlock(cellule)
0
salut calibos

Merci pour toutes tes infos, avec un peu de retard

J'ai reussi sous vba a faire une macro pour mon probléme, mais voilà maintenant que excel me demande un mot de passe pour oter la protection de chacune de mes feuilles, alors que je n'en ai entré aucun!!!
Resultat : touts mes feuilles sont protegees et je n'arrive pas à trouver le mot de passe (certainement VBA a du m'en mettre un !!!

Que faire?

Merci d'avance!
0
Dommage que tu ne connaisse pas le VBA.

Pour créer des macros, c'est assez simple.
Mais d'abord il faut savoir comment protéger les cellules. Ou plutot comment ne pas verrouiler une cellule.
Par défaut, les cellules d'une feuilles sont verrouillées, c'est à dire que lorsqu'on protège une feuille (menu Outils/Protection/Proteger la feuille...) les cellules qui ont la propriété verrouillé seront protégées en modification.

Donc, déja se poser la question: quelles sont les cellules auquelles je veux avoir accès en écriture même quand la feuille est protégée.

S'il n'y en a aucune, très bien, on passe à la suite.

Menu Outils/Macro/Nouvelle Macro : donner un nom ex. macro1 Ok
Selectionner la feuille "Semaine1" (ou je sais quoi)
Menu Outils/Protection/Proteger la feuille ... Ok (ne met pas de mot de passe pour l'instant)
Menu Outils/Macros/Arrêter l'enregistrement

Appuyer Alt F11: tu accèdes à l'éditeur Visual Basic, ouvrir Module1, tu y trouves ta macro1
Cette macros met la protection sur la feuille "Semaine1", en la modifiant un peu, on peut l'utiliser pour n'importe quelle feuille, il faut juste mettre le nom de la feuille en variable. Pour le moment on ne fait rien.

Faire une autre macro pour déverrouiller la même feuille.
Retournes dans ton tableau. Recommence Menu Outils/Macro/Nouvelle Macro...
Déverrouilles la feuille. Arrêter l'enregistrement. La deuxième macro est créée.

Jusque là c'est facile. Tu peux t'en sortir. Après ça se complique un petit peu. Si tu peux déjà faire la première partie alors on verra.

A+.
0
salut calibos,

ok j'ai bien compris ce que tu m'as dit : je crée une macro, j'enregistre et tout ce que je fais sera traduit en visual basic dans ladite macro, et pour terminer,j'arrete d'enregistrer.Ca fonctionne tres bien et ca me donne deja une première idée de ce qu'il faut faire.
Mais je dois faire une macro qui verrouille automatiquement les 50 cellules de mes 50 feuilles du genre :

sub verr(semaine)

for feuille= feuil1 to feuil50 {ce sont les "sheets "}
oter protection feuilles
verrouiller cellule (semaine) {ce sont les "range"}
remettre la protection feuilles
next feuille


Avec feuille qui serait une variable contenant les valeurs "feuil1....à feuil50 et semaine une variable entiere allant de 1 à 52



Donc si je lance verr(1), la macro me verrouillerait la 1ere cellule de chacune des 50 feuilles
et si je lance verr(2), la macro verrouillerait la 2è cellule de chacune des 50 feuilles etc... etc..

C'est aisément programmable dans un langage du genre turbo pascal ou basic mais là en visual basic, je sèche un peu

Alors si tu as une idée...... merci d'avance! et si tu m'envoies bouler, je comprendrai aussi!!!
(c'est compliqué pour finalement peu de choses!)

Salutations

A+ si tu veux bien
0
Salut,

Je vois que tu es familiarisé la programmation, tu n'auras pas de mal comprendre ce que vais essayer de t'expliquer.

Dans le fichier que tu pourras télécharger sous ce lien, j'ai programmé un exemple avec Excel 2003.
http://www.cijoint.fr/cjlink.php?file=cj200912/cijp9LZJce.xls

Il y a trois feuilles: Feuil1, Feuil2, Feuil3
Les deux premières sont des feuilles de versements et la troisième c'est la feuille récapitulative.

Il y a aussi un module qui contient les deux macros que je t'avais demandé d'enregister. On y accède par le raccourci Alt F11 ou par Menu Outils/Macros/Visual Basic Editor.
Vas voir comment j'ai paramétré les deux macros.
Sub Verrouiller(feuille As String) 'le nom de la feuille est passé en argument
'
    Sheets(feuille).Select 'la feuille est sélectionnée et protétée
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Sub Deverrouiller(feuille As String) 'le nom de la feuille est passé en argument
'
    Sheets(feuille).Select 'la feuille est sélectionnée et déverrouillée
    ActiveSheet.Unprotect
End Sub


Dans l'exploratteur de projet (à gauche), double clic sur Feuil3, là tu verras la procédure évènementielle qui s'exécute automatiquement quand on modifie la feuille:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lig As Integer, col As Integer, feuille As String, status As Integer

'adresse de la cellule modifiée
lig = Target.Row
col = Target.Column

'exemple avec une valeur numérique (1=Validés ; toute autre valeur = Débloqués)
If col = 2 Then 'si la colonne modifiée est la colonne 2 ("B")
   feuille = Cells(lig, col - 1).Value 'le nom de la feuille se trouve dans la cellule de gauche
   status = Cells(lig, col).Value 'ce qu'il faut faire
   Application.ScreenUpdating = False 
   If status = 1 And feuille <> "" Then 
      Call Verrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont validés"
   Else
      Call Deverrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont débloqués"
   End If
   Sheets("Feuil3").Select
   Application.ScreenUpdating = True
End If

'exemple avec un texte (Validés ; Débloqués)
If col = 6 Then 'si la colonne modifiée est la colonne 6 ("F")
   feuille = Cells(lig, col - 1).Value
   If Cells(lig, col).Value = "Validés" Then status = 1 Else status = 0
   Application.ScreenUpdating = False
   If status = 1 And feuille <> "" Then
      Call Verrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont Validés"
   Else
      Call Deverrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont Débloqués"
   End If
   Sheets("Feuil3").Select
   Application.ScreenUpdating = True
End If
End Sub


Voilà, c'est fait. Adapte cet exemple à ton projet.

Bonne continuation.
0
En relisant, je m'apperçois d'un petit bug
Modifier la macro Private Sub Worksheet_Change(ByVal Target As Range) pour eviter une erreur si le nom de la feuille est vide

If feuille<>"" Then
   If status = 1 Then 
      Call Verrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont validés"
   Else
      Call Deverrouiller(feuille)
      MsgBox "Les versements de la " & feuille & " sont débloqués"
   End If
End If


A+.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
15 déc. 2009 à 23:31
Bonsoir,

C'est pas plus simple de faire directement 'outils / protection / protéger la feuille' une fois les saisies terminées ?
eric
0