XL 2013 Gestion affichage onglets par username

Vincenzozo

XLDnaute Nouveau
Bonjour à tous,

Je gère l'affichage d'onglets en fonction de l'identifiant des utilisateurs (pour pas que tout le monde voit tout sur tout le monde...).
Sauf que la "liste" d'autorisation est une galère à gérer...
Les chefs ayant accès à tous, ça fait tout de suite des lignes et des lignes...
Il n'y aurait pas moyen de simplifier ça avec une matrice?
Le liste d'autorisation ressemble à ça :
id_chef / onglet1
id_chef / onglet2
...
id_collaborateur / onglet_collaborateur
...

Le code que j'utilise pour la gestion à l'ouverture :
(la feuille 1 comporte un message d'alerte demandant à activer les macros)

VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Fl As Worksheet
Set Fl = ThisWorkbook.Worksheets("Feuil1")
Fl.Visible = xlSheetVisible
For Each Fl In ThisWorkbook.Worksheets
    If Fl.Name <> "Feuil1" Then
        Fl.Visible = xlSheetVeryHidden
    End If
Next
Set Fl = Nothing
End Sub
Private Sub Workbook_Open()
Dim Fl As Worksheet
For i = 1 To Range("user").Count
    If UCase(Environ("username")) = UCase(Range("user")(i)) Then
       temp = Range("feuille")(i)
       Sheets(temp).Visible = True
    End If
Next i
Set Fl = ThisWorkbook.Worksheets("Feuil1")
    Fl.Visible = xlSheetHidden
End Sub

Merci d'avance
 

vgendron

XLDnaute Barbatruc
Hello

Comme tu dis.. autant utiliser une "matrice" placée dans une feuille "Gestion"
en colonne: les id
en ligne, les feuilles auquelles ils ont accès, signalées par un "X"

au démarrage tu mets tout dans tableau
puis tu regardes s'il faut afficher ou pas la feuille..

sans avoir de fichier pour exemple, pas facile, mais ca donnerait un truc comme ca
VB:
Private Sub Workbook_Open()
Dim TabGestion() As Variant

With Sheets("Gestion")
    TabGestion = .Range("A1").CurrentRegion.Value 'on récupère les droits d'accès
    For i = LBound(TabGestion, 1) To UBound(TabGestion, 1) 'sur chaque ligne d'id
        If UCase(Environ("username")) = UCase(TabGestion(i, 1)) Then 'si on est sur le bon ID
            For j = LBound(TabGestion, 2) To UBound(TabGestion, 2) 'on parcourt les colonnes = les feuilles
                If TabGestion(i, j) = "X" Then 'si la feuille est autorisée
                    Sheets(TabGestion(1, j)).Visible = True 'on l'affiche
                End If
            Next j
        End If
    Next i
End With

End Sub
 

Vincenzozo

XLDnaute Nouveau
J'ai mis un fichier "simplifié" en PJ.
Par contre, j'aimerai bien que la "matrice commence en B2 pour pouvoir mettre des "titres".
Déjà, faut que je mette des X majuscules, ça va mieux...
 

Pièces jointes

  • ILUO-- Copie.xlsm
    140.6 KB · Affichages: 41
Dernière édition:

vgendron

XLDnaute Barbatruc
Re

pour commencer à B2, il "suffit" d'ajuster les indices pour les boucles i et j
1) ajoute cette ligne pour voir ce qui est mis dans TabGestion
.Range("B2").CurrentRegion.select
vba détecte la région autour de B2: limitée par des cellules vides

dans ton dernier fichier joint, ca correspond à la zone A1:G5

--> pour commencer à la ligne 2 au lieu de 1
For i = LBound(TabGestion, 1) To UBound(TabGestion, 1)
devient
For i = LBound(TabGestion, 1)+1 To UBound(TabGestion, 1)

--> pour tester l'ID sur la colonne B au lieu de A
For j = LBound(TabGestion, 2) To UBound(TabGestion, 2)
If UCase(TabGestion(i, j)) = "X" Then

devient
For j = LBound(TabGestion, 2) +1 To UBound(TabGestion, 2)
If UCase(TabGestion(i, j)) = "X" Then


le Ucase te permet de saisir des x ou X (VBA transforme automatiquement en majuscule pour le test
 

Vincenzozo

XLDnaute Nouveau
Je vais devenir chèvre...
J'ai insérer la ligne pour voir ce qui est dans tabgestion.
J'ai modifié les indices et ça ne va toujours pas... :(
VB:
Private Sub Workbook_Open()
Dim TabGestion() As Variant

With Sheets("Gestion")
.Range("B2").CurrentRegion.Select
    TabGestion = .Range("B2").CurrentRegion.Value 'on récupère les droits d'accès
    For i = LBound(TabGestion, 1) + 1 To UBound(TabGestion, 1) 'sur chaque ligne d'id
        If UCase(Environ("username")) = UCase(TabGestion(i, 1)) Then 'si on est sur le bon ID
            For j = LBound(TabGestion, 2) + 1 To UBound(TabGestion, 2) 'on parcourt les colonnes = les feuilles
                If UCase(TabGestion(i, j)) = "X" Then 'si la feuille est autorisée
                    Sheets(TabGestion(1, j)).Visible = True 'on l'affiche
                End If
            Next j
        End If
    Next i
End With
' Set Fl = ThisWorkbook.Worksheets("Feuil1")
'    Fl.Visible = xlSheetHidden
End Sub
 

vgendron

XLDnaute Barbatruc
j'ai corrigé et mis des commentaires pour que tu voies où intervenir
Note:
ceci
UCase(Environ("username"))
est comparé avec la colonne B

VB:
Private Sub Workbook_Open()
Dim TabGestion() As Variant

With Sheets("Gestion")
    .Range("A2").CurrentRegion.Select
    TabGestion = .Range("A2").CurrentRegion.Value 'on récupère les droits d'accès
    For i = LBound(TabGestion, 1) + 1 To UBound(TabGestion, 1) 'sur chaque ligne d'id  / +1 pour commencer à la ligne 2
        If UCase(Environ("username")) = UCase(TabGestion(i, 2)) Then 'si on est sur le bon ID présent en colonne B (2)
            For j = LBound(TabGestion, 2) + 2 To UBound(TabGestion, 2) 'on parcourt les colonnes = les feuilles / +2 pour commencer à la colonne C (3)
                Sheets(TabGestion(1, j)).Visible = (UCase(TabGestion(i, j)) = "X") ' la feuille est affichée ou pas selon le résultat de la ligne
            Next j
        End If
    Next i
End With
End Sub
 

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
Excusez-moi d'intervenir concernant ces mots de passe !
Vous n'êtes pas sans savoir que lorsque l'on a accès à un module VBA et lorsque ce module contient un mot de passe permettant d'accéder à une macro, il est très facile de cracker sur excel ce mot de passe !
Bref, pour vous rappeler ce qui a été déjà dit dans beaucoup de forum !
Bonne soirée quand même !
 

Vincenzozo

XLDnaute Nouveau
Bonsoir,
J'ai repris le code de vgendron avec la ligne suivante mise en commentaire, sinon ça bugait...
VB:
   .Range("A2").CurrentRegion.Select
et j'ai laissé la ligne 1 vide, pareil, sinon ça bugait...
Mais bon, ça fonctionne comme ça et c'est très bien, merci bcp à vgendron ! :)

Et puis les protections par mot de passe, je suis pas fan, comme dit avant, ça sert à pas grand chose... ;)
 

Vincenzozo

XLDnaute Nouveau
Bonjour à tous,
J'ai une question supplémentaire, comment puis-je "forcer" la sortie proprement de la macro si une personne non autorisée (ie pas dans la matrice) essaye d'ouvrir le fichier?
Je pensais à un msgbox et une fermeture du fichier sans enregistrement, mais je sais pas trop comment faire ça simplement.
Une idée?
 

vgendron

XLDnaute Barbatruc
Hello
je verrais un truc dans le genre
VB:
Private Sub Workbook_Open()
Dim TabGestion() As Variant

With Sheets("Gestion")
    NonAutorisé = True
    TabGestion = .Range("A2").CurrentRegion.Value 'on récupère les droits d'accès
    For i = LBound(TabGestion, 1) + 1 To UBound(TabGestion, 1) 'sur chaque ligne d'id  / +1 pour commencer à la ligne 2
        If UCase(Environ("username")) = UCase(TabGestion(i, 2)) Then 'si on est sur le bon ID présent en colonne B (2)
            NonAutorisé = False
            For j = LBound(TabGestion, 2) + 2 To UBound(TabGestion, 2) 'on parcourt les colonnes = les feuilles / +2 pour commencer à la colonne C (3)
                Sheets(TabGestion(1, j)).Visible = (UCase(TabGestion(i, j)) = "X") ' la feuille est affichée ou pas selon le résultat de la ligne
            Next j
        End If
    Next i
End With
If NonAutorisé Then
    MsgBox ("Vous n'avez aucune autorisation, veuillez contacter votre administrateur")
    ActiveWorkbook.Close (True)
End If
End Sub

!! atttention !! avant de faire un essai avec ton nom.. fais une sauvegarde que tu PEUX ouvrir... :-D
 
Dernière édition:

Discussions similaires

Réponses
6
Affichages
202
Réponses
11
Affichages
236

Statistiques des forums

Discussions
311 709
Messages
2 081 774
Membres
101 816
dernier inscrit
Jfrcs