IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Protéger des colonnes selon l'utilisateur


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut Protéger des colonnes selon l'utilisateur
    Bonjour,

    Je fais appel à vos lumières, car je suis confronté à un problème qui me dépasse. Je suis en train de réaliser un planning de vacances pour une trentaine de personnes.
    Les noms des travailleurs figurent en ligne 10, par exemple en F10, puis H10, J10, L10, etc. Il y a toujours une ligne vide entre deux collègues.

    En D15 figure la première date de l'année (1.01), puis en D16 le 2.01, D17 le 3.01, etc, jusqu'au 31.12.

    Le fichier s'ouvre toujours sur la date du jour, qui apparaît en première ligne.

    Les personnes notent leurs jours de vacances, de formation, de maladie, etc, en passant par le clic droit de la souris. Le menu est personnalisé ("Noter mes vacances", "Noter mes jours de formation", etc), ce qui permet de lancer la macro adaptée. Elle va mettre par exemple les jours de vacances en rouge, formation en orange, maladie en vert, etc.

    Voilà, dans les grandes lignes, ce qui fonctionne correctement, jusqu'ici, dans le projet.

    Ce que j'aimerais améliorer: dans le fonctionnement décrit, si une personne se trompe de colonne et note ses vacances dans la colonne (toute proche) du voisin, il n'y a pas de contrôle, ce sera accepté. Mon idée serait d'utiliser l'identifiant de l'utilisateur pour verrouiller, à l'ouverture, toutes les colonnes sauf la sienne. Sous le nom des collègues, en ligne 10, j'ai des lignes masquées, avec leur identifiant, par exemple sde3, sde12, sde15, etc. Et à l'ouverture du fichier, j'ai utilisé l'instruction Range("D1").Value = Environ ("username"). Par exemple, il pourrait s'agir de sde12. Cet identifiant va apparaître en D1, mais il est aussi présent, dans la ligne masquée (par exemple la ligne 12 contiendrait tous les identifiants des utilisateurs).

    Ma question: quelle instruction la plus adaptée mettre dans ThisWorkbook, événement Open, pour que dans un premier temps Excel verrouille tout le planning, puis déverrouille la bonne colonne? En l'occcurrence, s'il voit sde12 dans la cellule D1, il devrait chercher la même valeur dans la ligne 12. S'il voit que sde12 figure dans la cellule N12, Excel devrait déprotéger une partie de cette colonne, c'est à dire allant de la date du 1.01, donc en N15, jusqu'à N381 (ou 382 si l'année est bissextile).

    J'espère avoir été clair. N'hésitez pas à me demander si ce n'est pas le cas!

    Merci d'avance pour votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    C'est les cellules qu'il faut verrouiller, et ne déverrouiller que celles qui t'intéressent.
    ensuite, il te faut protéger les feuilles, sinon le verrouillage ne sert à rien.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Ws As excel.Worksheet
    Set Ws = ThisWorkbook.Worksheets(1)
     
    Ws.Cells.Locked = True    '// Verouille toutes les cellules
    Ws.Range("A10:F10").Locked =False    '// Deverrouille les cellules interessantes
    Ws.Protect    '// Protection de la feuille
    Note: La fonction Protect accepte de nombreux arguments, je te laisse regarder la documentation pour plus d'infos.

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    978
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 978
    Par défaut
    Bonsoir, voici une proposition à tester. Remplacez "Nom de votre feuille de calcul" par le nom de votre feuille de calcul et "Votre mot de passe" par le mot de passe que vous souhaitez utiliser pour protéger la feuille de calcul. Ce code suppose que les identifiants des utilisateurs sont dans la ligne 12 et que les dates commencent à la ligne 15. Modifiez si nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Private Sub Workbook_Open()
        Dim ws As Worksheet
        Dim rng As Range
        Dim c As Range
        Dim username As String
     
        Set ws = ThisWorkbook.Sheets("Nom de votre feuille de calcul")
     
         username = Environ("username")
     
        ' Verrouiller toutes les cellules
        ws.Cells.Locked = True
     
        ' Trouver la colonne de l'utilisateur
        Set rng = ws.Rows(12).Find(What:=username, LookIn:=xlValues, LookAt:=xlWhole)
     
        ' Si l'utilisateur est trouvé, déverrouiller sa colonne
        If Not rng Is Nothing Then
            For Each c In ws.Range(ws.Cells(15, rng.Column), ws.Cells(381, rng.Column))
                c.Locked = False
            Next c
        End If
     
        ' Protéger la feuille de calcul
        ws.Protect Password:="Votre mot de passe", UserInterfaceOnly:=True
     
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    Bonjour,

    Merci deedolith et Franc pour vos propositions! Celle de Franc me semble tout à fait convenir à ce que je recherche.
    Avant que je fasse des tests, j'ai oublié de préciser qu'il y a, parmi les divers corps de métier, des responsables, qui, eux, doivent avoir l'accès au planning de leurs collègues. Par exemple, sde12 doit avoir à sa propre colonne, bien sûr, mais aussi à celle de ses collègues (par exemple F, H, J, L). Il faudrait donc que, pour cet utilisateur, soit déverrouillée toutes ses colonnes. Je pense donc que, pour ces responsables, il n'est pas utile de chercher leur identifiant dans la ligne 12. Je ne sais pas comment réaliser la bifurcation entre ceux qui n'ont accès qu'à leur colonne (ce que doit faire la macro de Franc) et ceux qui ont accès à plusieurs colonnes.

    Pour l'exemle, on pourrait dire sde12 doit avoir accès aux colonnes F, H, J, L et sde18 doit pouvoir accéder aux colonnes N, P, R, T. Il y en a d'autres, mais j'adapterai.

    Merci d'avance pour votre aide, très précieuse!

  5. #5
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    J'ai réussi à résoudre le problème que je mentionnais dans mon post.! Dans ThisWorkbook Open, j'ai commencé avec un If... pour repérer les validateurs, qui doivent avoir accès aux colonnes de leurs collègues, pour pouvoir valider leurs vacances. Ensuite, après un ElseIf suit l'instruction proposée par Franc. Elle fonctionne à merveille et ne déverrouille que la cellule de l'utilisateur concerné!

    Dans l'étape suivante, j'aimerais qu'un courriel soit automatiquement envoyé dans Outlook, via Excel, pour que le validateur soit informé qu'il doit valider des dates. Pour l'envoi du mail, j'ai utilisé cette instruction:

    Dim DemandeValidation as Variant

    Set DemandeValidation = CreateObject("Outlook.Application")

    With DemandeValidation.CreateItem(olMailItem)
    .Subject = "Demande de validation"
    .To = adresse mail du validateur
    .Body = Range("J30")
    .Display
    End with


    Dans cet exemple, je dois donc définir le contenu du mail dans la cellule J30. Je rappelle que dans le fichier Excel, verticalement, se trouvent les dates de l'année, et, horizontalement, la liste des collègues, chacun ayant sa colonne pour noter ses vacances. Mon problème est le suivant: imaginons qu'un collègue veuille prendre vacances du 6 au 10 juillet puis deux jours isolés, 13 septembre et 10 décembre.

    Première difficulté: il faut qu'Excel balaie la colonne pour afficher, en J30:

    6.07
    7.07
    8.07
    9.07
    10.07
    13.09
    10.12

    Deuxième difficulté: quelle fonction utiliser en vba pour que la cellule affiche plutôt:
    6.07-10.07
    13.09
    10.12

    Là, je sèche, car il faudrait qu'Excel détecte les cellules contiguës ayant la même valeur (la macro colle la lettre "v" dans la cellule)!

    J'espère que mes explications sont suffisamment claires!

  6. #6
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    Pour la première difficulté, j'ai trouvé une formule qui se rapproche de ce que je cherche:

    =FILTRE(D10375;NON(ESTVIDE(D10375)))

    Dans cet exemple, la colonne D serait celle d'un utilisateur. Mais il faudrait, je pense, utiliser la formule DECALER ou, en vba, offset, pour qu'Excel cherche les valeurs correspondantes dans la colonne B, où se trouvent les dates. Car la colonne n'affiche que les "v" que l'utilisateur y a placé, alors que la colonne B contient les dates correspondantes qui m'intéressent

  7. #7
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    Yes! Le plus approchant de ce que je cherche utilise non pas la fonction DECALER, mais INDEX combiné à EQUIV (je n'y avais plus pensé, mais j'avais déjà utilisé cette combinaison).

    =INDEX($B$10:$D$375;EQUIV(FILTRE(???;NON(ESTVIDE($D$10:$D$375)));$D$10:$D$375;0);1)

    Mais lorsque je glisse la formule dans mon message précédent (FILTRE...) à la place des points d'interrogation, j'obtiens un message d'erreur

  8. #8
    Membre confirmé
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2020
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2020
    Messages : 107
    Par défaut
    J'ai simplifié ce que je voulais faire et suis revenu à une manière de faire que je maîtrisais mieux.
    Merci pour votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cacher des colonnes selon critères
    Par Charlesraheb dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 29/07/2012, 10h42
  2. Redimensionnement des colonnes par l'utilisateur
    Par isa911Bis dans le forum Composants
    Réponses: 8
    Dernier message: 23/02/2012, 15h50
  3. Masque des colonnes selon certains critères sans les filtres
    Par CLAUDE19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/10/2011, 17h23
  4. [XL-2010] Macro vba exporter des colonnes selon titres
    Par ron13 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/06/2011, 11h48
  5. [XL-2003] Cacher des colonnes selon le mois en cours
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2009, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo