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 :

[VBA-E] Utilisation d'un tableau en réseau (multi-utilisateurs)


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Par défaut [VBA-E] Utilisation d'un tableau en réseau (multi-utilisateurs)
    Bonjour à tous,

    Je cherche à partager un tableau en réseau, et je suis confronter à plusieurs pbs. Je ne sais pas si je pose ma question sur le bon forum. Veuillez d'avance m'en excuser...

    Je souhaite donner l'accès en modification de certaines cellules à certains utilisateurs.
    Je souhaite aussi cacher certaines cellules en fonction de l'utilisateur.

    Le fichier sera sur un serveur, en réseau.

    En bricolant avec les protections d'Excel, j'arrive seulement à bloquer l'accès à certaines cellules. Mais je ne masque RIEN....

    Si vous avez des solutions en VBA, je suis prenneur bien evidemment !J'espère q mes explications auront été suffisantes. N'hésite pas à me poser des questions pr éclaircir les zones d'ombres.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Peins les caratères en blanc selon les utilisateurs et empêche leur sélection
    A+

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Un peu de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ActiveSheet.Unprotect
        If Not Range("A6").FormulaHidden Then Range("A6").FormulaHidden = True
        Range("A6").Font.ColorIndex = 2
        ActiveSheet.Protect
    Le contenue de la cellule est invisible et la sélection ne permet pas de voir ce qu'il y a dedans
    A+

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Par défaut
    Citation Envoyé par ouskel'n'or
    Peins les caratères en blanc selon les utilisateurs et empêche leur sélection
    A+
    Merci pour ta réponse.

    Ok, pr les caractères en blanc, mais j'ai encore 3 questions :
    1/ Comment masquer la formule ?
    2/ Comment choisir les colonnes à peindre en blanc en fonction de l'utilisateur ? est-ce une commande à insérer dans ma macro ?
    3/ A chq modification de cellule, Excel demande à l'utilisateur un mot de passe; Ne peut-il pas se loguer une fois et avoir ensuite accès aux zones qui lui sont dédiées ?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Par défaut
    Citation Envoyé par ouskel'n'or
    Un peu de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ActiveSheet.Unprotect
        If Not Range("A6").FormulaHidden Then Range("A6").FormulaHidden = True
        Range("A6").Font.ColorIndex = 2
        ActiveSheet.Protect
    Le contenue de la cellule est invisible et la sélection ne permet pas de voir ce qu'il y a dedans
    A+
    ok pour la 1! Merci !!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Salut

    Sauf erreur, en mode partagé le verrouillage des cellules est statique. Si une feuille est protégée, il n'est pas possible d'annuler la proctection une fois que le classeur est partagé.

    Une piste: utiliser les evênements du type Worksheet_SelectionChange.

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le code que je t'ai passé empêche l'affichage lors de la sélection.
    Pour l'utilisateur,
    If not Application.username = "Toto" then
    mais tu peux aussi vérifier les variables d'environnement, le domaine
    Debug.Print Environ(27)
    'ou l'utilisateur
    Debug.Print Environ(28)
    Pour une boucle sur les cellules à masquer, tu crées un tableaux des cellules
    Vite fait, pas testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MasquerUneCelluleEtEmpêcherAffichage()
    Dim tableau
    tableau = array(cells(1, 3).address, cells(12, 4).address)
    If Environ(28) <> "MACHIN" then
        ActiveSheet.Unprotect
        for i = 0 To ubound(tableau)
               If not range(tableau(i)).FormulaHidden Then range(tableau(i)).FormulaHidden = True
               Range(tableau(i)).Font.ColorIndex = 2
        next
        ActiveSheet.Protect
    end If
    End Sub
    Tu dis
    A+

  8. #8
    Membre éclairé Avatar de doringen
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 73
    Par défaut
    le problème est que l´utilisateur peut entrer sans activer les macros et là, il est libre de te poutrer toutes les cellules qu íl souhaite...
    Dans une longue pratique de paranoia en ce qui concerne mes tableaux en partage sur le réseau, je masque l´onglet concerné en veryhidden et je demande à l´utilisateur de se logger pour que l´onglet apparaisse. Ensuite, il suffit d´associer à chaque nom d´utilisateur les champs auxquels il ne peut pas accéder...
    Mais comme je le disais, cela tient de la grosse paranoia

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai 2 mn, donc, plus propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub MasquerUneCelluleEtEmpêcherAffichageC()
    Dim F1 As Worksheet
    Dim Plage
    Set F1 = Worksheets("Feuil1") 'feuille à protéger
    Set Plage = F1.Range("A1:G1,H1:N1,M1:S1")
        If Environ(28) <> "MACHIN" Then
            ActiveSheet.Unprotect
            For Each Cel In Plage
                   If Not Cel.FormulaHidden Then Cel.FormulaHidden = True
                   Cel.Font.ColorIndex = 2
            Next
            ActiveSheet.Protect
        End If
    End Sub
    Testé et tout
    A+

    Meu non, ce n'est pas un pb.
    Pour empêcher le mauvais user de désactiver les macros :
    Au départ, tu masques toutes les feuilles et les verrouilles
    A l'ouverture, dans Auto_Exec, tu les affiches et tu lances ta macro qui teste le User. Epicétou.
    A l'ouverture du fichier, macros désactivées, tout reste masqué.
    Faudra juste lui interdire Ctrl + Pause. Mais là, je me souviens plus si je sais faire
    A+

    Une astuce pour récupérer sans peine les adresses des cellules à "opérer"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim r As Range
      Set r = Application.InputBox("Sélectionner les cellules en appuyant sur la touche ctrl", Type:=8)
      Cells(1, 1).Value = r.Address
    et tu récupères ce qu'il y a dans "A1"
    Juste parce que je te sens réticent
    A+

    Tiens, grâce à Bidou, j'ai retrouvé comment neutraliser les touches d'arrêt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableCancelKey = xlDisabled
    Attends le dernier moment pour le mettre en place : une boucle mal faite et tu n'en sors qu'avec le gestionnaire des tâches...
    A+

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Sans trop vouloir insister , si au final le classeur est en mode partagé les méthodes protect et unprotect ne fonctionneront pas. C'est cruel mais c'est comme ça !

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Salut choucks,
    Puisque tu as l'air de connaître les fichiers partagés, tu dois pouvoir répondre à cette question : Une macro conditionnée selon username pourrait-elle fonctionner ? Je ne parle plus de protection mais simplement d'une macro conditionnelle.
    Si j'ai travaillé sur des applications en réseau sur des bases de données communes, je n'ai jamais travaillé sur fichiers partagés.
    Merci de ta réponse. Elle pourrait offrir une solution de rechange (???) enfin elle permettrait d'y réfléchir
    A+

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Citation Envoyé par ouskel'n'or
    Une macro conditionnée selon username pourrait-elle fonctionner ? Je ne parle plus de protection mais simplement d'une macro conditionnelle.
    Oui une telle macro fonctionnera en tous cas j'ai pas trouvé de contre-indication sur la kb de microsoft.
    Pour la protection de cellules dans un classeur partagé, j'utilise les evênements du type Worksheet_SelectionChange. Je donne un exemple très prochainement.

    a+

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Salut,

    Voici une manière d'éviter que des cellules soient modifées par utilisateur. A adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Select Case Target.Column
            Case 1, 4 To 11
                'cellules des colonnes A, D ... K non verrouillées
                Exit Sub
            Case Else
                'Verrouille les autres cellules
                MsgBox "Cette plage est verrouillée"
                Cells(Target.Row, 1).Select
        End Select
    End Sub

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Merci chouks.
    Il est donc possible, non seulement de verrouiller les cellules mais aussi de les masquer et d'en mettre les caractères en blanc.
    Par contre, si on verrouille les cellules sans que la feuille soit protégée, il est possible d'y accéder et donc d'en modifier les propriétés.
    Or, si la feuille est protégée au départ, il existe aussi cette syntase
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil1").EnableSelection = xlUnlockedCells
    Dans ton exemple, la feuille est-elle en permanence protégée ?
    Sinon, la solution alternative consisterait à faire un bricolage consistant à déplacer la sélection d'une cellule vers le bas si une cellule "interdite" est sélectionnée, ou d'une colonne s'il s'agit d'une colonne, ou d'une ligne s'il s'agit d'une ligne. Ceci, comme tu le suggères, dans la sub Worksheet_SelectionChange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Plage()
    Plage = Array("$C$14", "$D$13", "$E$12", "$F$11", "$G$15", "$F$19") 'cellules interdites
        For i = 0 To UBound(Plage)
            If Target.Address = Plage(i) Then
                Cells(Target.Row + 1, Target.Column).Select
                Exit For
            End If
        Next
    End Sub
    Ce code empêcherait tout modification de la cellule et si les caractères on la même couleur que le fond, de pouvoir les lire
    Et un bricolage de plus, un !
    A+

    NB - A l'attention des paranos : Ce code n'empêche pas la sélection et la copie d'une plage contenant les cellules "défendues"... et alors là, allez savoir ce que l'espion ira en faire mais heureusement, il ne sait pas qu'il peut faire ça. Malheureusement, s'il est intelligent et qu'il a déjà fait du vba, il comprendra qu'il y a une astuce. Heureusement, il est fort probable qu'il ne comprenne pas laquelle. Malheureusement...

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Je me place ici toujours dans le contexte d'un classeur qui sera partagé car c'est ce qui intéresse Mourne, donc il faut banir dans notre raisonnement le fait qu'il existe des méthodes toutes faites de protection des feuilles.

    Donc l'aternative que tu offres ouskel'n'or est intéressante

    Citation Envoyé par ouskel'n'or
    Sinon, la solution alternative consisterait à faire un bricolage consistant à déplacer la sélection d'une cellule vers le bas si une cellule "interdite" est sélectionnée, ou d'une colonne s'il s'agit d'une colonne, ou d'une ligne s'il s'agit d'une ligne. Ceci, comme tu le suggères, dans la sub Worksheet_SelectionChange
    Code :
    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_SelectionChange(ByVal Target As Range)
    Dim Plage()
    Plage = Array("$C$14", "$D$13", "$E$12", "$F$11", "$G$15", "$F$19") 'cellules interdites
        For i = 0 To UBound(Plage)
            If Target.Address = Plage(i) Then
                Cells(Target.Row + 1, Target.Column).Select
                Exit For
            End If
        Next
    End Sub
    Ce code empêcherait tout modification de la cellule et si les caractères on la même couleur que le fond, de ne pas pouvoir les lire
    Et un bricolage de plus, un !
    A+

  16. #16
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Par défaut
    Merci à vous tous pr votre aide!
    Je me suis qd meme heurté à des difficultés.

    Je souhaiterai d'abord avoir qq précisions (elles vont peut etre vous paraitre un peu triviales...) :
    1/ Quelles est la différence entre 1 "Private sub" et 1 "sub" ?
    2/ Comment exécuter ce "Private Sub" etant donné q'il n'apparait pas ds les macros à exécuter.
    3/ Environ(28) renvoie windir=c:\winnt , ne faut-il pas mieux récupérer le nom d'utilisateur ?
    C'est ce que j'ai fait à l'aide d'une fonction, ce qui me permet d'effectivement tester le programme. 1er petit souci : je perds la couleur de police q j'avais auparavant; n'y a t il aucun moyen de masquer une cellule ss mettre en blanc ?

    ...en attendant, ma solution a été de masquer la colonne, et cela me convient !
    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
     
    Sub MasquerUneCelluleEtEmpecherAffichageC()
     
    Dim F1 As Worksheet
    Dim PlagePaul
    Dim Nom As String
     
    Set F1 = ActiveSheet 'feuille à protéger
     
    'F1.EnableSelection = xlUnlockedCells
    'Application.EnableCancelKey = xlDisabled
     
    Set PlagePaul = F1.Columns("B:C")
     
        If GetUserName <> "paul" Then
            ActiveSheet.Unprotect Password:="fff"
            For Each Column In PlagePaul
                   If Not Column.FormulaHidden Then Column.FormulaHidden = True
                   'Column.Font.ColorIndex = 2
                   Column.Hidden = True
            Next
            ActiveSheet.Protect Password:="fff"
        End If
    End Sub
    4/ Peut-on selectionner plusieurs colonnes ? sans passer par range("B:C,F:F") qui me fait ensuite un traitement cellule par cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Plage = F1.Columns("B:C") 'je voudrais par exemple sélectionner egalement la colonne "F:F"
    Merci d'avance pr vos réponses

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Par défaut
    Un petit coup de sur l'instruction Private donne :

    Instruction utilisée au niveau module pour déclarer des variables privées et attribuer de l'espace de stockage.

    Remarques

    Les variables Private ne sont disponibles que pour le module dans lequel elles sont déclarées.

    Utilisez l'instruction Private pour déclarer le type de données d'une variable. Par exemple, l'instruction suivante déclare une variable en tant que variable de type Integer :

    Private NumberOfEmployees As Integer

    Vous pouvez également utiliser une instruction Private pour déclarer le type objet d'une variable. L'instruction suivante déclare une variable pour une nouvelle instance d'une feuille de calcul.

    Private X As New Worksheet
    Donc pour atteindre une procédure d'un module hors du dit-module il ne faut pas Private devant Sub.

  18. #18
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    4/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set Plage = Union(Columns(2), Columns(3), Columns(6))
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3/ Environ(28) renvoie windir=c:\winnt , ne faut-il pas mieux récupérer le nom d'utilisateur ?
    Cela doit sans doute dépendre du poste de travail (???)
    Pour retrouver l'index, utilise plutôt cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        For i = 1 To Indx
            If InStr(Environ(i), "USERNAME") <> 0 Then
                 debug.print "Index = " & i & "  " & "UserName = " & Environ(i)
                 If Environ(i) <> "BIBI" then
                      'Je verrouille !
                 endif
            End If
        Next
    debug.print te permettra de voir les <> variables d'environnement dans la fenêtre Exécution
    A+

    NB - A défaut d'une meilleure solution

    Edit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Environ("USERNAME") <> "BIBI" then
    Chavais bien !

  20. #20
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Par défaut
    Merci pour ton aide AlainTech

    Citation Envoyé par AlainTech
    4/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set Plage = Union(Columns(2), Columns(3), Columns(6))
    Cette commande me crée un autre pb.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    If Environ("USERNAME") = "nz" Then
            ActiveSheet.Unprotect Password:="fff"
            For Each Column In Plage
                   MsgBox "Case verrouillée."
                   If Not Column.FormulaHidden Then Column.FormulaHidden = True
                   'La macro bloque sur la ligne ci-dessous
                   Column.Hidden = True
             Next
    ...
    Comment puis-je appeler la colonne ss procéder cellule après cellule ?

    D'avance merci.

Discussions similaires

  1. [VBA]xl*-Utiliser F1...F12 dans un form
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 40
    Dernier message: 27/01/2006, 11h34
  2. [VBA Excel] Utilisation de Mid(), InStrRev() etc.
    Par annedeblois dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2005, 20h21
  3. VBA/xl97 - Utilisation boîtes dialogs intégrées
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/11/2005, 16h39
  4. [vba excel] Utilisation de .borders
    Par steps5ive dans le forum Access
    Réponses: 3
    Dernier message: 22/09/2005, 15h02
  5. [C#] Utilisation d'un exe en réseau
    Par Troopers dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/01/2005, 18h12

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