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

Excel Discussion :

Macro affectation d'une ligne à un utilisateur [Toutes versions]


Sujet :

Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Macro affectation d'une ligne à un utilisateur
    Bonjour à tous

    Alors voila je vous expose mon problème. Je tente de créer une macro pour un fichier Excel qui est utilisé par plusieurs utilisateur.
    Chaque utilisateur a des lignes qui lui appartient. On connais l'appartenance de la ligne grâce à la colonne A où est inscrite pour chaque ligne sont utilisateur.
    La macro a pour but que lorsque qu'une autre personne que l'utilisateur de la ligne modifie cette ligne un message d'alerte apparaît pour le prévenir et lui laisser 2 choix : soit il est au courant que la ligne est pas à lui et il veut quand même modifier
    soit c'était une erreur de sa part est la modification qu'il a faite sur cette ligne s'annule
    Mon code est le suivant :
    Mais il ne fonctionne pas. J'ai deux soucis. Le premier est qu'il reconnaît bien qui est l'utilisateur de la ligne mais qu'il n'empêche pas la modification par quelqu'un d'autre utilisateur.
    L'annulation de la modification ne fonctionne pas non plus mais je pourrais le traiter qu'après avoir traiter le premier problème.

    Quelqu'un serait pourquoi mon keycells ne prend pas la valeur de la ligne de l'username qui n'est pas propriétaire de la ligne ou si le problèmevient d'ailleurs ou si je suis complétement à la masse ? lol

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim i As Integer

    'La variable KeyCells contient les cellules qui déclencheront une alerte si elles sont modifiées.

    For i = 0 To 12000

    If Cells(i + 1, 1).Value = Environ("username") Then Else Set KeyCells = Columns("B:L").Rows(i + 1)
    Next
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
    Is Nothing Then

    ' Affichage d'un message lorsque l'une des cellules désignées a été modifiée
    If MsgBox("Ces lignes ne t'appartiennent pas, es-tu sur(-e) de vouloir les modifier?", vbYesNo, "Demande de confirmation") = vbYes Then MsgBox ("Modification sauvegardée") Else Sub Workbook_BeforeSave(vbyes, vbno)


    End If


    End Sub

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


    * *
    Cancel = True
    MsgBox ("Modification(-s) annulé(-es)")

    'Annule les demandes d'enregistrement
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mary_am Voir le message
    Bonjour,

    En balayant vos 12000 lignes, vous allez mettre un temps infini pour saisir une donnée.

    La fonction ci-dessous contrôle les users pouvant saisir des données sur le fichier :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Function VerifierLesUsersUtilisateurs(ByVal LigneAModifier As Long) As Boolean
     
    Dim Fso As Object
    Dim ListeDesUsers(3, 1) As Variant
    Dim CtrI As Long
    Dim PresenceUser As Boolean
     
        ListeDesUsers(0, 0) = "C:\Users\raymonde"
        ListeDesUsers(0, 1) = "Raymonde"
     
        ListeDesUsers(1, 0) = "C:\Users\paul"
        ListeDesUsers(1, 1) = "Paul"
     
        ListeDesUsers(2, 0) = "C:\Users\Eric"
        ListeDesUsers(2, 1) = "Eric"
     
        ListeDesUsers(3, 0) = "C:\Users\Jean"
        ListeDesUsers(3, 1) = "Jean"
     
        PresenceUser = False
        VerifierLesUsersUtilisateurs = False
        For CtrI = LBound(ListeDesUsers, 1) To UBound(ListeDesUsers, 1)
     
            Set Fso = CreateObject("Scripting.FileSystemObject")
            PresenceUser = Fso.FolderExists(ListeDesUsers(CtrI, 0))
            Set Fso = Nothing
     
            If PresenceUser = True Then
               If ActiveSheet.Cells(LigneAModifier, 1) = ListeDesUsers(CtrI, 1) Then
                  VerifierLesUsersUtilisateurs = True
                  Exit Function
               End If
            End If
     
        Next CtrI
     
    End Function
    Le code dans le module de l'onglet est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If VerifierLesUsersUtilisateurs(Target.Row) = False Then
            MsgBox "Vous n'êtes pas habilité à saisir sur cette ligne !", vbCritical
            Application.EnableEvents = False
            Target.ClearContents
            Application.EnableEvents = True
        End If
     
    End Sub
    Le problème de ce code est qu'il n'empêche pas la saisie et si une valeur est existante, elle sera effacée. Je n'ai pas vu non plus dans l'aide en ligne d'Excel, la possibilité de simuler la touche Annulation (Ctrl + Z) avec un SendKeys.

    De mon point de vue, la solution passe par :

    • Soit par le filtrage de la première colonne en fonction du User de l'utilisateur sur l'événement Worksheet.Activate de l'onglet.
    • Soit par la protection de la feuille et le contrôle de la saisie via un Userform en utilisant cette fonction pour la validation.


    Sinon, mettez votre code entre balises #.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    1) Cette boucle de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To 12000
      If Cells(i + 1, 1).Value = Environ("username") Then Else Set KeyCells = Columns("B:L").Rows(i + 1)
    Next
    n'a de justification que si les lignes correspondant à un utilisateur sont dans une série totalement continue.
    1) si tel est le cas, elle est maladroite (lourde) puisqu'elle détermine sans cesse une plage Keycells
    2) si tel n'est pas le cas, elle est encore plus maladroite puisque, ne sortant pas, elle va inclure d'autres lignes, d'autres utilisateurs, dès qu'elle retrouvera l' utilisateur concerné.
    Eclaire-nous donc sur cet aspect FONDAMENTAL.
    3) une fois l'aspect 1) résolu :
    je ne vois pas pourquoi attendre la tentative de sauvegarde, voire la tentative de modification, pour réagir.
    Il est nettement plus simple d'intervenir au Worksheet.selectionChange:
    - ou l'utilisateur est "normal" et --->> amen
    - ou il n'est pas celui naturellement autorisé et --->> question de confirmation -->> et :
    ------- on ne continue que si réponse "oui"
    ------- on l'envoie se balader ailleurs (dans une autre cellule lui correspondant) si réponse "non"
    Ce qu'il aura pu modifier dans te telles conditions n'a donc bien évidemment pas à être "examiné" à nouveau lors de la sauvegarde
    Mais tout ceci me parait relever tellement plus de la conception .... !
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Et puis, on n'a pas encore parlé du calvaire que l'utilisation de fichiers Excel partagés va entraîner, tôt ou tard.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Enfet les lignes correspondant à un utilisateur sont dans une série totalement continue.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    dans une série totalement continue
    Bien. Voilà déjà un éclaircissement.
    Question, maintenant : connait-on le nombre de lignes dédiées à chaque utilisateur ? Et si oui : est-il fixe (pour chacun) ou susceptible de varier (pour un utilisateur) ?
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    si vraiment c'est la route souhaitée à ton projet, alors je pense qu'il serait plus sage de travailler sur l'évènenement Selection_Change sous la mécanique suivante :

    - déplacement sur une cellule par l'utilisateur
    - déclenchement de l'évènement SelectionChange
    - vérification que la cellule sélectionnée est dans la plage à contrôler
    - si on est dans la plage concernée : interrogation de l'utilisateur
    - vérification que l'utilisateur est habilité
    - si pas habilité : message lui expliquant que cette ligne ne lui appartient pas, en lui demandant s'il veut poursuivre
    - s'il veut poursuivre : fin de la procédure
    -s'il ne veut pas poursuivre : désactivation des évènements / recherche de la première ligne qui lui appartient* / activation de cette cellule / réactivation des évènements / fin de procédure


    *on peut aussi aller sélectionner une cellule en dehors du contrôle d'habilitation pour éviter de "chercher" une cellule appartenant à l'utilisateur (et dans l'éventualité où il n'en existerait pas encore)


    bien sûr, y'a de l'optimisation à faire pour réduire le nombre de calculs/vérifications qui se feront pour que la navigation de l'utilisateur reste transparente.
    Déjà, un MsgBox est très bloquant pour une expérience utilisateur, mais c'est ton souhait initial

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour joe.levrai
    Rechercher la bonne place de l'utilisateur n'est rien s'il sait (et c'est encore là une affaire de conception) s'y prendre adroitement.
    S'y prendre adroitement, c'est par exemple nommer chaque plage dédiée à un utilisateur en la baptisant tout simplement du nom de l'utilisateur.
    Car alors il suffit de (exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("toto")(1).select
    pour se retrouver à la première cellule de la plage dédiée à l'utilisateur toto.
    Juste une question de conception et d'organisation.

    EDIT : pour le reste, je suis bien d'accord avec toi. Nous nous rejoignons parfaitement en ce qui concerne cet aspect-là.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bien. Voilà déjà un éclaircissement.
    Question, maintenant : connait-on le nombre de lignes dédiées à chaque utilisateur ? Et si oui : est-il fixe (pour chacun) ou susceptible de varier (pour un utilisateur) ?

    Non on ne connaît pas le nombre de ligne dédiées à l'utilisateur, il est variable car celui-ci peut supprimer ou ajouter des lignes

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    c'est surement une question bête mais je vois pas comment faire les deux premières étapes déjà (dsl je suis vraiment pas doué ^^ )
    -déplacement sur une cellule par l'utilisateur
    - déclenchement de l'évènement SelectionChange

    Pour le déplacement j'utilise activcell ?

    Je vous remercie de prendre du temps pour me répondre

  11. #11
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    le proto algorithme que j'ai fournis combine les étapes "réalisée par l'utilisateur" - "qui se réalisent seules" - " qui sont réalisées par ta procédure"

    pour t'y retrouver :

    - déplacement sur une cellule par l'utilisateur
    ==> c'est l'utilisateur qui se déplace

    - déclenchement de l'évènement SelectionChange
    ==> l'évènement se déclenche tout seul quand l'utilisateur a déplacé le curseur de la cellule sélectionnée

    - vérification que la cellule sélectionnée est dans la plage à contrôler
    ==> c'est la procédure que tu as écris de ton évènement qui gère

    - si on est dans la plage concernée : interrogation de l'utilisateur
    ==> c'est la procédure que tu as écris de ton évènement qui gère

    - vérification que l'utilisateur est habilité
    ==> c'est la procédure que tu as écris de ton évènement qui gère

    - si pas habilité : message lui expliquant que cette ligne ne lui appartient pas, en lui demandant s'il veut poursuivre
    ==> c'est la procédure que tu as écris de ton évènement qui gère, c'est l'utilisateur quoi choisit la réponse via un MsgBox

    - s'il veut poursuivre : fin de la procédure
    ==> c'est la procédure que tu as écris de ton évènement qui gère

    -s'il ne veut pas poursuivre : désactivation des évènements / recherche de la première ligne qui lui appartient* / activation de cette cellule / réactivation des évènements / fin de procédure
    ==> c'est la procédure que tu as écris de ton évènement qui gère

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mary_am Voir le message
    Un exemple modifié de mon premier message dans ce fichier.

    Pour le fonctionnement, ajouter votre user dans la matrice des users.
    A l'ouverture du fichier, l'onglet Menu est activé. A la sélection de l'onglet Base de données, l'événement Worksheet.Activate filtre le tableau selon le User utilisateur.Pièce jointe 243778
    Dernière modification par Invité ; 12/02/2017 à 15h17. Motif: A l'ouverture le fichier ne pointait pas sur Menu

  13. #13
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Merciiii !
    Je vais regarder ca se soir !
    Eric KERGRESSE ta macro à l'air vraiment bien, je vais la tester dans mon fichier

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mary_am Voir le message
    Cette macro ne règle pas tout car on peut toujours saisir dans une cellule.

  15. #15
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Eric,

    en partant des derniers codes que tu as montré (je n'ai pas ouvert le .zip que tu as joint à ton dernier message)

    il faut stocker la valeur de la cellule active sur deux évènements :

    - worksheets_Activate
    - worksheets_selectionchange

    via une variable global

    ainsi, tu pourras restaurer la valeur dans le Change si l'utilisateur ne dois pas écrire

    d'où ma suggestion qui était de travailler sur le SelectionChange plutôt que le Change, qui évite de mettre en œuvre ce mécanisme : ma proposition agit AVANT toute intervention dans la cellule, alors qu'ici vous travaillez APRES l'intervention

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour Joe,

    J'ai repris ta préconisation du SelectionChange qui est plus pertinente. Ta proposition relative à la sauvegarde est aussi pertinente.

    Actuellement dans un module standard, j'ai mis le code suivant :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Option Explicit
     
    Public ListeDesUsers(3, 1) As Variant
     
    Function UtilisateurAutorise() As String
     
    Dim Fso As Object
    Dim CtrI As Long
    Dim PresenceUser As Boolean
     
        ChargerMatriceUsers
        PresenceUser = False
        UtilisateurAutorise = ""
        For CtrI = LBound(ListeDesUsers, 1) To UBound(ListeDesUsers, 1)
            Set Fso = CreateObject("Scripting.FileSystemObject")
            PresenceUser = Fso.FolderExists(ListeDesUsers(CtrI, 0))
            If PresenceUser = True Then
               UtilisateurAutorise = ListeDesUsers(CtrI, 1)
               Exit Function
            End If
            Set Fso = Nothing
        Next CtrI
    End Function
     
     
    Sub ChargerMatriceUsers()
     
        ListeDesUsers(0, 0) = "C:\Users\raymonde"
        ListeDesUsers(0, 1) = "Raymonde"
     
        ListeDesUsers(1, 0) = "C:\Users\paul"
        ListeDesUsers(1, 1) = "Paul"
     
        ListeDesUsers(2, 0) = "C:\Users\Eric"
        ListeDesUsers(2, 1) = "Eric"
     
        ListeDesUsers(3, 0) = "C:\Users\Jean"
        ListeDesUsers(3, 1) = "Jean"
     
    End Sub

    Dans le module de l'onglet :
    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
     
     
    Private Sub Worksheet_Activate()
     
        ActiveSheet.Range("$A:$G").AutoFilter Field:=1, Criteria1:=UtilisateurAutorise
     
    End Sub
     
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        If Cells(Target.Row, 1) <> UtilisateurAutorise Then
            MsgBox "Vous n'êtes pas habilité à saisir sur cette ligne !", vbCritical
       End If
     
    End Sub

  17. #17
    Invité
    Invité(e)
    Par défaut
    En reprenant la deuxième suggestion de Joe, le code pourrait être celui-ci :

    Avec deux possibilités :
    • Soit à partir d'une variable ContenuCellule (Public de type variant déclarée dans le module standard).
    • Soit à partir d'une zone nommée "DerniereValeur" sur l'onglet actif.

    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
    28
    29
    30
    31
    32
     
     Private Sub Worksheet_Activate()
     
        ActiveSheet.Range("$A:$G").AutoFilter Field:=1, Criteria1:=UtilisateurAutorise
     
    End Sub
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        Application.EnableEvents = False
        If Cells(Target.Row, 1) <> UtilisateurAutorise Then
            MsgBox "Vous n'êtes pas habilité à saisir sur cette ligne !", vbCritical
            Target = ActiveSheet.Range("DerniereValeur")
            'Target = ContenuCellule
       End If
       Application.EnableEvents = True
     
     
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        Application.EnableEvents = False
        ActiveSheet.Range("DerniereValeur") = Target
        'ContenuCellule = Target
        If Cells(Target.Row, 1) <> UtilisateurAutorise Then
            MsgBox "Vous n'êtes pas habilité à saisir sur cette ligne !", vbCritical
       End If
       Application.EnableEvents = True
     
    End Sub
    Le fichier joint est réglé sur l'option Zone nommée pour mieux se rendre compte de l'effet en phase de validation. Une fois la validation faite, il vaut mieux passer avec la variable ContenuCellule et supprimer la zone nommée.

    Pièce jointe 243808

  18. #18
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Dans l'idée, c'est ainsi que je le verrai

    non testé et écrit à main levé, avec pour finalité de tout gérer dans un seul évènement

    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
    Dim Utilisateur As String
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim ProprietaireCellule As String, PremiereCelluleUtilisateur As Range
    If Utilisateur = "" Then Utilisateur = VBA.Environ("USERNAME")
    ProprietaireCellule = Cells(Target.Row, 1).Value
        If ProprietaireCellule <> Utilisateur Then
            If MsgBox("Attention, cette cellule appartient à " & ProprietaireCellule & ", souhaitez-vous néanmoins modifier ?", vbYesNo) = vbNo Then
                Set PremiereCelluleUtilisateur = ActiveSheet.Columns(1).Find(Utilisateur, , , xlWhole)
                Application.EnableEvents = False
                    If Not PremiereCelluleUtilisateur Is Nothing Then
                        PremiereCelluleUtilisateur.Select
                    Else
                        Cells(UsedRange.Rows.Count + 1, 1).Select
                    End If
                Application.EnableEvents = True
            End If
        End If
    End Sub
    il reste ici à restreindre l'analyse sur une portion de feuille plutôt que son ensemble ? Là c'est au concepteur du fichier d'arbitrer ces sujets


    EDIT : en y pensant plus sérieusement, on est obligé de gérer l'évènement Activate quand même, sinon l'utilisateur fait un aller-retour entre deux feuilles et pourra modifier la cellule active
    Il deviendrait du coup opportun de déporter le traitement de vérification (et l'action qui s'ensuit) dans une procédure à part, appelée sur l'évènement Activate et SelectionChange

  19. #19
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    super grâce à vous j'ai pu résoudre mon problème !

    Mais je me permets d'abuser de votre intelligence et gentillesse . J'ai une autre problématique maintenant :

    je souhaiterais enregistrer une copie de mon fichier à chaque modification ( sur une même fichier en xls ) afin de toujours avoir un fichier xlsm et un fichier xls avec les même informations mais à chauqe fois que j'enregistre mon fichier xlsm se ferme et mon fichier xls s'ouvre. Alors que je voudrais pouvoir faire mes modifications sur le fichier en xlsm sans ouvrir le fichier xls

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub copie()
    '
     
    '
        ChDir "C:\Users\lalala\Desktop\test1"
        ActiveWorkbook.SaveAs Filename:="C:\Users\lalala\Desktop\test1\Classeur1.xls" _
            , FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
        ActiveWorkbook.RunAutoMacros Which:=xlAutoClose
    End Sub

  20. #20
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je n'ai jamais essayé, mais je ne serais pas surpris que ce soit possible avec savecopyas
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Macro ajout d'une ligne
    Par Jum_o dans le forum VBA Word
    Réponses: 4
    Dernier message: 03/11/2008, 10h57
  2. [E-02] Macro pour insérer une ligne
    Par HQ_LG4 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/10/2008, 00h07
  3. Macro ACCESS / Insérer une ligne vide
    Par david71 dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/03/2008, 10h20
  4. Une macro à faire sur une ligne précise
    Par JPDU92 dans le forum VBA Word
    Réponses: 5
    Dernier message: 31/01/2008, 12h13
  5. [Macro excel]selectionner une ligne à partir d'une recherche
    Par heavenly dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/04/2007, 16h26

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