XL pour MAC Verouillage de celulles pour eviter le remplissage intempestif

nobodyuse

XLDnaute Occasionnel
J'ai un fichier Excel placé sur serveur qui est utilisé par plusieurs personnes
Ce fichier qui contient plusieurs colonne divisé en 4 partie (et +de 1000 lignes prévisionnel)
Chacune des 4 partie étant réservé a un groupe d'utilisateur:
  • Colonnes A>K réservé aux utilisateur qui font la saisi
  • Colonnes L>N réservé au 1er groupe de vérificateur (plusieurs personnes possible selon les saisi ses casses A>K)
  • Colonnes O>Q réservé au 2eme groupe de vérificateur (Idem plusieurs personnes possible selon les réponses en cases L>N)
  • Colonne R>U retour au 1er groupe d'utilisateur pour les saisis finale
Je souhaiterai que les différentes parties puisse être verrouillés après saisi afin d’éviter que par mégarde un utilisateur ce trompe et modifie une entrée

En cherchant un peu partout j'ai trouvé ce genre de code qui pourrai partiellement convenir, mais je ne sais pas comment le modifier pour mes besoins.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("Y1:Y1000")) Is Nothing Then 'Valable seulement pour la Plage Y1:Y120
'Suppression de la protection de la feuille
ActiveSheet.Unprotect
    If Range("y" & Target.Row).Text <> "" Then
        Target.EntireRow.Locked = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If
    End If
    
End Sub

Ci joint mon fichier anonymisé pour une meilleur comprehension

D'avance merci
 

Pièces jointes

  • InterSECURDIFU.xlsb
    147.3 KB · Affichages: 19

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
Je comprends pas bien le détail ?
Est ce qu'il faut protéger des blocs (comme A à K) puis L N ..etc ?
Ensuite tu dis : après saisie ? ok mais pour ressaisir plus tard il faudra déverrouiller
comme cela se fait par code avec détection de la zone je ne vois pas l'intérêt ? je ne vois pas bien
Sinon oui c'est avec ce type de code on limite des zones de sélection et on fait l'action
Précise plus ta démarche
 

nobodyuse

XLDnaute Occasionnel
Bonjour
Je comprends pas bien le détail ?
Est ce qu'il faut protéger des blocs (comme A à K) puis L N ..etc ?
Ensuite tu dis : après saisie ? ok mais pour ressaisir plus tard il faudra déverrouiller
comme cela se fait par code avec détection de la zone je ne vois pas l'intérêt ? je ne vois pas bien
Sinon oui c'est avec ce type de code on limite des zones de sélection et on fait l'action
Précise plus ta démarche
Bonjour herve62

En effet il faudrait protéger au tour par tour chaque "bock" ligne par ligne une fois le remplissage effectués par chaque personnes concernés

Apparemment ce genre de code VBA ne ce fait que sur des feuilles verrouillés et si je pige bien déverrouille pour la saisi avant de reverrouiller les cellules
Si les cellules sont verrouillés aprés remplissage les utilisateur conscient du type de fichier n’irons pas déverrouiller la feuille pour la modifier, Étant des docs sécurisé de remonté d'anomalie.

Donc par exemple pour la 1ere ligne
lorsqu'une anomalie est saisi zone A1 > K1 ces cellules doivent être verrouillées,
une fois le dirigeant concerné ayant rempli sa partie zone L1>N1 ces cellules doivent être verrouillées
et ainsi de suite

en esperant avoir été plus clair
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bon une idée de début
il faut d'abord agir sur les feuilles
Sur chaque zone concernée ( j'ai fait de A à K) décocher "verrouillé" dans le format cellules
Puis protéger la feuille en ne laissant que : autoriser pour les cellules déverrouillé
Enfin l'exemple de code fonctionne chez moi
On pourra ajouter un MdP par utilisateur par exemple avec inputbox ..etc
 

Pièces jointes

  • InterSECURDIFU_ex1.xlsm
    231.6 KB · Affichages: 7

nobodyuse

XLDnaute Occasionnel
Re herve62
merci j'ai regardé juste vite fait étant en mobilité la

Dans l'idée c'est ça
Sauf que faudrait que je trouve comment conditionner le verrouillage (j'avais pas pensé a ça)
La cellule K devant en théorie ce remplir automatiquement lors du remplissage du choix de l'incident dans le menu déroulant
et faire de même pour les autre groupe L>N etc etc

Ps: j'ai voulu tester par moi même en entrant des donné dans les lignes en dessous de celle qui etait verouillé et ça n'a pas marché bizarre (en etant sur mac parfois ca a des comportement bizarre)
 

nobodyuse

XLDnaute Occasionnel
Bon une idée de début
il faut d'abord agir sur les feuilles
Sur chaque zone concernée ( j'ai fait de A à K) décocher "verrouillé" dans le format cellules
Puis protéger la feuille en ne laissant que : autoriser pour les cellules déverrouillé
Enfin l'exemple de code fonctionne chez moi
On pourra ajouter un MdP par utilisateur par exemple avec inputbox ..etc
Re herve62
désole pour la réponse rapide de hier ...
et Merci

j'ai pris le temps de mieux regarder ce matin.

j'ai re-testé plus au calme
cela marche en effet (Sauf les lignes 6 et 7 que j'avais testé hier)
à priori le verrouillage est conditionné si je pige bien au remplissage de la case K, celui ci étant normalement rempli automatiquement par la sélection dans le menu déroulant de la case G type d'incident..

Me reste donc à trouver comment conditionner autrement le verrouillage et réussir a dupliquer la macro pour les autres groupes de cellules.
 

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour @nobodyuse
Oui conditionné par K , mais juste dernière ligne et si vide à K + 1
En fait il faut que ce soit le dernier "Change" ..mais peut être que tu dois encore entrer quelque chose ailleurs ?
Pour les autres zones ...simple tu mets autant de blocs "Intersect" pour tes différentes zones
N'oublie pas de décocher tes cellules > "Verrouillé"
cela marche en effet (Sauf les lignes 6 et 7 que j'avais testé hier)
peut être ai je oublié de déverrouiller ?
Pour l'accès conditionné aux utilisateurs : tu donnes un MdP à chaque groupe puis tu le teste dans le code avec un inputBox ensuite avec un selectCase tu affectes la portion de macro qui donne leur zone d'accès (A:K ...etc)
 

nobodyuse

XLDnaute Occasionnel
Bonjour @nobodyuse
Oui conditionné par K , mais juste dernière ligne et si vide à K + 1
En fait il faut que ce soit le dernier "Change" ..mais peut être que tu dois encore entrer quelque chose ailleurs ?
Pour les autres zones ...simple tu mets autant de blocs "Intersect" pour tes différentes zones
N'oublie pas de décocher tes cellules > "Verrouillé"

peut être ai je oublié de déverrouiller ?
Pour l'accès conditionné aux utilisateurs : tu donnes un MdP à chaque groupe puis tu le teste dans le code avec un inputBox ensuite avec un selectCase tu affectes la portion de macro qui donne leur zone d'accès (A:K ...etc)

merci herve62

j'ai ajouté une case "valid" avec menu déroulant "oui" ou "rien" en fin des groupe A>K, L>N et O>Q (qui du coup sont A>L, M>P et Q>T
L’idéal serai que quand on sélectionne "Oui' dans ce menu déroulant ça verrouille et si on remet sur "rien" ça déverrouille !
je ne sais pas si c'est possible a vrai dire mais ce serai la solution idéal a mon sens

Le mots de passe ne me semble pas une bonne idée trop de monde potentiellement susceptible de travailler sur ce fichier (d’où le besoin de verrouiller pour éviter les erreurs), je pense que l'ajout d'un mot de passe ne serai pas le bienvenue (nous avons des mots de passe partout tous le temps dans mon entreprise avec des obligation de changement régulier pour des raison de sécurité ce serai un encore a ajouter...un de trop qui ferai bouder le projet).
 

nobodyuse

XLDnaute Occasionnel
Bonjour @nobodyuse
Oui conditionné par K , mais juste dernière ligne et si vide à K + 1
En fait il faut que ce soit le dernier "Change" ..mais peut être que tu dois encore entrer quelque chose ailleurs ?
Pour les autres zones ...simple tu mets autant de blocs "Intersect" pour tes différentes zones
N'oublie pas de décocher tes cellules > "Verrouillé"

peut être ai je oublié de déverrouiller ?
Pour l'accès conditionné aux utilisateurs : tu donnes un MdP à chaque groupe puis tu le teste dans le code avec un inputBox ensuite avec un selectCase tu affectes la portion de macro qui donne leur zone d'accès (A:K ...etc)


J'ai voulu commencer le travail a defaut de trouver comment conditionner a la selection de "OUI" dans la colonne Valid

mais en ajoutant un block "Intersect" de la meme facon que toi
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 And Target.Row > 1 Then Target.Offset(0, 4).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 12 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 15 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 18 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 19 And Target.Row > 1 Then Target.Offset(0, 2).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date + 365)
If Not Intersect(Range("K1:K100"), Target) Is Nothing Then
dl = Range("k100").End(xlUp).Row
If Cells(dl + 1, 11) = "" Then
ActiveSheet.Unprotect
Range("A" & dl & ":K" & dl).Locked = True
ActiveSheet.Protect
End If
If Not Intersect(Range("N1:N100"), Target) Is Nothing Then
dl = Range("N100").End(xlUp).Row
If Cells(dl + 1, 11) = "" Then
ActiveSheet.Unprotect
Range("L" & dl & ":N" & dl).Locked = True
ActiveSheet.Protect
End If
End If
End If
End Sub

Cela ne fonctionne plu
je doit merder quelques part
 
Dernière édition:

nobodyuse

XLDnaute Occasionnel
J'ai voulu commencer le travail a defaut de trouver comment conditionner a la selection de "OUI" dans la colonne Valid

mais en ajoutant un block "Intersect" de la meme facon que toi
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 7 And Target.Row > 1 Then Target.Offset(0, 4).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 12 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 15 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 18 And Target.Row > 1 Then Target.Offset(0, 1).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date)
If Target.Column = 19 And Target.Row > 1 Then Target.Offset(0, 2).Value = IIf(Target.Value = "" Or IsEmpty(Target), Empty, Date + 365)
If Not Intersect(Range("K1:K100"), Target) Is Nothing Then
dl = Range("k100").End(xlUp).Row
If Cells(dl + 1, 11) = "" Then
ActiveSheet.Unprotect
Range("A" & dl & ":K" & dl).Locked = True
ActiveSheet.Protect
End If
If Not Intersect(Range("N1:N100"), Target) Is Nothing Then
dl = Range("N100").End(xlUp).Row
If Cells(dl + 1, 11) = "" Then
ActiveSheet.Unprotect
Range("L" & dl & ":N" & dl).Locked = True
ActiveSheet.Protect
End If
End If
End If
End Sub

Cela ne fonctionne plu
je doit merder quelques part
Voici le fichier en attachement :/
 

Pièces jointes

  • InterSECURDIFU_ex2-1-1.xlsm
    58.9 KB · Affichages: 4

nobodyuse

XLDnaute Occasionnel
vite fait , je regarde ce soir
tes blocs iF sont mal placés , il faut d'abord clore les INTERSECT !!!!
là tu testes un intersect (N1:N100) INCLU dans le 1er ??? met END IF avant !!!
Merci herve62, Pas de soucis ;)

oui j'avais vu et résolu le soucis des if car ca me mettais une erreur
le fichier en attachement post #10 contient la correction
Mais ne focntionne pas :/
(Sans avoir trouvé la solution pour conditionner au OUI dans les cellules L, P.. seulement)
 

job75

XLDnaute Barbatruc
Bonjour nobodyuse, herve62,

S'il s'agit d'autoriser l'accès aux plages par mots de passe placez dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Dim mdp$
With Feuil3 'CodeName de la feuille
    mdp = InputBox("Entrez votre mot de passe :")
    Select Case mdp
        Case "TATA": Application.Goto .[A1], True: .[A4].Select: .ScrollArea = "A4:L" & Rows.Count
        Case "TITI": Application.Goto .[M1], True: .[M4].Select: .ScrollArea = "M4:P" & Rows.Count
        Case "TOTO": Application.Goto .[Q1], True: .[Q4].Select: .ScrollArea = "Q4:T" & Rows.Count:
        Case "TUTU": Application.Goto .[U1], True: .[U4].Select: .ScrollArea = "U4:X" & Rows.Count
        Case Else: Application.Goto .[A1]: .ScrollArea = "A1"
    End Select
End With
End Sub
Bien entendu il faudra protéger l'accès au VBAProject par un mot de passe.

Je n'ai pas compris ce que vous voulez faire avec les OUI.

A+
 

Pièces jointes

  • InterSECURDIFU(1).xlsm
    57.9 KB · Affichages: 5

nobodyuse

XLDnaute Occasionnel
Bonjour nobodyuse, herve62,

S'il s'agit d'autoriser l'accès aux plages par mots de passe placez dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
Dim mdp$
With Feuil3 'CodeName de la feuille
    mdp = InputBox("Entrez votre mot de passe :")
    Select Case mdp
        Case "TATA": Application.Goto .[A1], True: .[A4].Select: .ScrollArea = "A4:L" & Rows.Count
        Case "TITI": Application.Goto .[M1], True: .[M4].Select: .ScrollArea = "M4:P" & Rows.Count
        Case "TOTO": Application.Goto .[Q1], True: .[Q4].Select: .ScrollArea = "Q4:T" & Rows.Count:
        Case "TUTU": Application.Goto .[U1], True: .[U4].Select: .ScrollArea = "U4:X" & Rows.Count
        Case Else: Application.Goto .[A1]: .ScrollArea = "A1"
    End Select
End With
End Sub
Bien entendu il faudra protéger l'accès au VBAProject par un mot de passe.

Je n'ai pas compris ce que vous voulez faire avec les OUI.

A+
Bonjour Job75

non il s’agirait de verrouiller la section de cellules après saisi comme explique maladroitement dans le post #1
Pour le OUI:
L’idée serais que les différents intervenant sur les fichiers quand il a remplie sa partie la valide par la sélection du OUi dans un menu déroulant que l’effet soit de verrouiller la groupe de cellule concernée
Et en cas de non sélection ou de retour en position « vide » du menu déroulant cela ne verrouille pas ou déverrouille le groupe de cellule concernés

pour changer j’suis pas sûr d’être clair. Dans mon explication
 

Statistiques des forums

Discussions
311 725
Messages
2 081 939
Membres
101 844
dernier inscrit
pktla