droits de modification sur une plage de cellule

hyp-axa

XLDnaute Nouveau
Bonjour à tous,

Aprés une recherche infructueuse dans ce merveilleux forum, j'ai decidé de vous exposer mon projet ( je dis projet alors que je n'ai rien codé.....je ss trés débutant et je ne sais pas d'ou commencer)

J'ai un classeur que je partage sur le réseau avec plusieurs utilisateurs(manager dans l'exemple en pj) et afin de sécuriser les modifications et les controler, de façon à permettre à chacun de modifier les les cellules lui concernant. En effet, sur chaque feuille, j'ai une colonne où j affiche le nom de chaque utilisateur, l'idée est de permettre à chacun d entre eux de modifier une plage de cellule sur la même ligne où son nom est renseigné.

pour identifier l utilisateur, je propose une identification par ID Windows.

en pj un petit exemple du fichier.

merci bcp pour votre aide
 

Pièces jointes

  • Ponct.xls
    17.5 KB · Affichages: 163
  • Ponct.xls
    17.5 KB · Affichages: 166
  • Ponct.xls
    17.5 KB · Affichages: 168
Dernière édition:

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Re,

Le plus simple est d'utiliser le nom utilisateur de Windows.

En VBA il est donné par Environ("Username").

Alors dans le fichier joint, effectuez les opérations suivantes :

1) Otez la protection de chaque feuille (le mot de passe provisoire est "toto").

2) Pour chaque tableau, en colonne C indiquez les noms véritables des utilisateurs (mettez y le vôtre pour tester).

3) Allez dans VBA (touches Alt+F11), double-clic sur ThisWorkbook et collez-y cette macro :

Code:
Private Sub Workbook_Open()
Dim w As Worksheet, cel As Range
For Each w In Worksheets
  w.Unprotect "toto" 'mot de passe à adapter
  w.Cells.Locked = True 'verrouille toutes les cellules
  For Each cel In w.Range("C2", w.Range("C65536").End(xlUp))
    If cel = Environ("Username") Then Intersect(cel.EntireRow, w.Range("E:G")).Locked = False 'déverrouillage des cellules de l'utilisateur
  Next
  w.Protect "toto" 'mot de passe à adapter
Next
ThisWorkbook.Saved = True 'évite le message à la fermeture si aucune modification
End Sub

4) Si vous voulez éviter que les utilisateurs aillent sur VBA, dans VBA menu Outils-Propriétés de VBAProject-Protection et entrez votre mot de passe.

5) Fermez et ouvrez le fichier : seules les cellules qui vous appartiennent en colonnes E F G sont déverrouillées.

A+
 

Pièces jointes

  • Ponct(1).xls
    31.5 KB · Affichages: 141

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Re,

Deux compléments :

- seules les cellules modifiables par l'utilisateur sont colorées en jaune

- seules ces cellules peuvent être sélectionnées.

La macro modifiée (en rouge) :

Code:
Private Sub Workbook_Open()
Dim w As Worksheet, cel As Range
Application.ScreenUpdating = False
For Each w In Worksheets
  w.Unprotect "toto" 'mot de passe à adapter
  w.Cells.Locked = True 'verrouille toutes les cellules
  [COLOR="Red"]w.Range("E2:G65536").Interior.ColorIndex = xlNone 'efface toutes les couleurs[/COLOR]
  For Each cel In w.Range("C2", w.Range("C65536").End(xlUp))
    If cel = Environ("Username") Then
      With Intersect(cel.EntireRow, w.Range("E:G"))
        .Locked = False 'déverrouille les cellules de l'utilisateur
        [COLOR="Red"].Interior.ColorIndex = 6 'couleur jaune[/COLOR]
      End With
    End If
  Next
  [COLOR="red"]w.EnableSelection = xlUnlockedCells 'l'utilisateur ne peut sélectionner que ses cellules[/COLOR]
  w.Protect "toto"[COLOR="red"], UserInterfaceOnly:=True[/COLOR] 'mot de passe à adapter
Next
ThisWorkbook.Saved = True 'évite le message à la fermeture si aucune modification
End Sub

A+
 

Pièces jointes

  • Ponct(2).xls
    33.5 KB · Affichages: 113
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Bonjour à tous ici zelà


Mon bon Monsieur Job (bonjour à vous sous la pluie et le vent, et chez vous ?)
Quand je lis ceci
J'ai un classeur que je partage sur le réseau avec plusieurs utilisateurs
Je m'interroge: s'agit-il d'un partage via Excel ?

Dans ce cas, je dis : "Aie ! , nous voila bien !"

edition : bonjour JB
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Bonjour Staple, JB,

Je m'interroge: s'agit-il d'un partage via Excel ?

Dans ce cas, je dis : "Aie ! , nous voila bien !"

Je n'ai jamais utilisé de fichier partagé sur Excel :eek:

Mais il me semble que si le fichier est déjà en cours d'utilisation, il s'ouvre en "Lecture seule".

En testant alors la propriété ReadOnly, on peut décider ensuite de ce qu'il faut faire.

Je ne m'occuperai pas de ça, mais s'il y a des amateurs...

Edit : Staple, à Paris légèrement nuageux avec du bon soleil :)

A+
 
Dernière édition:

hyp-axa

XLDnaute Nouveau
Re : droits de modification sur une plage de cellule

Bonjour,

Merci bcp Job pour ton aide et pour tt l interet que tu as accordé à mon probléme.
Je viens de tester avec ma session et ca marche. Par contre, je rencontre un blocage; Pour permettre aux utilisateurs d'avoir accés au fichier et apporter leurs modifications, je suis obligé de le partager outils --> partager le classeur, ce qui bloque le lancement de la macro.
Y a-t-il une solution svp ?

Merci.

simo
 

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Bonjour hyp-axa, le forum,

Staple avait bien raison :)

Sur ce lien de Microsoft :

Fonctionnalités non disponibles dans les classeurs partagés - Excel - Microsoft Office

on voit que la modification de la protection des feuilles fait partie des fonctionnalités non disponibles sur un classeur partagé.

Alors nous allons changer complétement notre fusil d'épaule.

On ne protégera jamais les feuilles, mais on obligera l'utilisateur à entrer les données seulement dans les cellules autorisées.

Et cela grâce à 2 macros évènementielles dans ThisWorkbook :

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
If Sh.Name = "Accueil" Then Exit Sub 'au cas où cette feuille existe
If Source.Areas.Count > 1 Or Source.Column < 5 _
  Or Source.Column + Source.Columns.Count > 8 Then Annule
Dim plage As Range
Set plage = Source.Columns(1).Offset(, 3 - Source.Column) 'plage correspondante en colonne C
If Source.Rows.Count > Application.CountIf(plage, Environ("username")) Then Annule
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Source As Range)
If Sh.Name = "Accueil" Or Source.Address = "$H$1" Then Exit Sub
Dim cel As Range, plage As Range
For Each cel In Sh.Range("C2", Sh.Range("C65536").End(xlUp))
  If cel = Environ("username") Then Set plage = Union(cel, IIf(plage Is Nothing, cel, plage))
Next
If plage Is Nothing Then Sh.Range("H1").Select: Exit Sub
Set plage = Intersect(Source, plage.EntireRow, Sh.Range("E:G"))
If plage Is Nothing Then Sh.Range("H1").Select: Exit Sub
Application.EnableEvents = False
plage.Select
Application.EnableEvents = True
End Sub

Private Sub Annule()
With Application
  .EnableEvents = False
  .Undo 'annule la modification
  .EnableEvents = True
  .OnRepeat "", ""
End With
End
End Sub

La macro SheetChange se suffit à elle-même, elle annule les modifications sur les cellules non autorisées.

La macro SheetSelectionChange n'est pas absolument indispensable : elle oblige à ne sélectionner que les cellules autorisées.

Elle ne se suffit pas à elle-même, car il faut que la 1ère macro empêche la copie par glissement-déplacement. Edit : il y a aussi le double-clic...

Ouvrez le fichier sans activer les macros et mettez votre nom d'utilisateur en colonne C (il y a le mien, Gérard).

Puis voyez ce que donnent la sélection des cellules et les entrées/suppression de données...

Fichier (3) joint.

A+
 

Pièces jointes

  • Ponct(3).xls
    34.5 KB · Affichages: 118
Dernière édition:

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Re,

J'ai ajouté, toujours dans ThisWorkbook, cette macro :

Code:
Private Sub Workbook_Open()
Me.Names.Add "Utilisateur", Environ("username")
Me.Saved = True
End Sub

Elle crée à l'ouverture le nom "Utilisateur" qui contient le nom de l'utilisateur.

Cela permet d'introduire une Mise en forme conditionnelle (MFC) sur la plage E2:G13 de chaque feuille.

Formule de la MFC (en E2) => $C2=Utilisateur

Fichier (4) joint.

EDITION : vérifiez ce que ça donne sur 2 postes différents du réseau, je ne suis pas sûr de mon coup.

A+
 

Pièces jointes

  • Ponct(4).xls
    39 KB · Affichages: 104
Dernière édition:

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Re,

Retour sur cette affaire de MFC.

Telle que je l'ai définie, ça ne devrait pas marcher.

En effet toutes les modifications seront téléchargées vers les autres postes du réseau quand le fichier sera enregistré.

Le nom "Utilisateur" envoyé écrasera donc tous les noms d'utilisateur, et leur MFC seront modifiées...

Alors une solution : supprimer le nom "Utilisateur" à l'enregistrement avec cette macro :

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
Me.Names.Add "Utilisateur", "" 'entraine la suppression de toutes les MFC
End Sub

Toutes les MFC disparaîtront donc, mais on les fera réapparaître en cliquant sur une cellule ou en la modifiant.

Fichier (5) joint.

PS. Toutes ces procédures font assez "gadget" je trouve :p

Mais faute de grive... J'espère seulement qu'il existe une solution plus normale au niveau de l'administration des classeurs partagés.

Si quelqu'un la connaît, merci de nous en faire part.

A+
 

Pièces jointes

  • Ponct(5).xls
    45 KB · Affichages: 94

hyp-axa

XLDnaute Nouveau
Re : droits de modification sur une plage de cellule

Bonjour JOB
je vous remercie infiniment pour votre aide précieuse.
La MFC ne se réactive pas si une cellule est selectionnée à nouveau !
J'ai une toute derniere demande, j'ai besoin de déclarer des utilisateurs comme des administrateurs afin qu'ils aient les droits de modifications sur tout le fichier.

Est ce possible de les déclarer dans une liste à mettre à jour quand il le faut ?

Merci bcp JOB.

Cdt,
Simo
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : droits de modification sur une plage de cellule

Bonsoir hyp-axa,

La liste des administrateur doit être codée dans un tableau (Array).

Il suffit alors de neutraliser les 2 macros évènementielles par ce code placé au début :

Code:
Dim administrateur
administrateur = Array("tata", "titi", "toto", "tutu")
If IsNumeric(Application.Match(Environ("username"), administrateur, 0)) Then Exit Sub

Je joins quand même le fichier (6).

Pour finir ce serait bien de nous dire comment se comportent les différents postes du réseau utilisant le classeur partagé.

En particulier quid de la MFC, c'est intéressant à savoir.

Edit : j'avais déclaré administrateur As String alors que c'est un tableau !!

A+
 

Pièces jointes

  • Ponct(6).xls
    46.5 KB · Affichages: 124
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 880
Membres
103 404
dernier inscrit
sultan87