Code VBA - Récupérer des valeurs entre diverses feuilles

Trunk

XLDnaute Nouveau
Bonjour à tous,

Je tiens tout d'abord à vous remercier car j'ai pu réussir à trouver un petit bout de code que je cherchais grace aux divers échanges que j'ai pu lire sur ce forum...vous contribuez à aider les personnes, telles que moi, qui ne sont pas expertes en Excel et en développement et qui nécessitent parfois des petits coups de pouce pour parvenir à leurs fins !

Néanmoins, j'ai encore besoin d'aide... Je vous expose mon besoin :

J'ai mis en place dans un fichier excel un petit bout de code VBA qui affiche une feuille spécifique après qu'une personne ait entré un mot de passe (inputbox).

J'aimerais désormais pouvoir afficher à cette personne de manière automatique ce qu'elle est censée voir sur sa feuille dédiée.

--> Nous avons dans ma société un système de gestion électronique de clés contrôlée par des badges, et les personnes qui l'utilisent ont accès à plein de clés et ne savent pas à quoi toutes ces clés correspondent... J'aimerais donc leur montrer au sein d'une feuille l'intitulé des emplacements, mais seulement ceux auxquels ils ont accès.

J'ai fait un fichier excel exemple très raccourci que je joins à ce message, pour imager un peu ...

J'ai une feuille nommée "Accès" où j'ai comme colonnes :

- une colonne avec le mot de passe de la personne,
- ensuite une colonne avec son Prénom NOM,
- ensuite 5 colonnes correspondant à numéros de groupes qui sont en fait les numéros d'emplacements des clés. Sur la ligne de cette personne sont cochées des croix sous les groupes, indiquant les accès qu'a la personne.

Ensuite j'ai une feuille nommée "Emplacements" où l'on retrouve les numéros d'emplacements et en face de chacun d'entre eux l'intitulé des bureaux.

Ce que j'aimerais réaliser :

- Une personne ouvre le fichier, l'invite de commande lui demande un mot de passe. Elle entre le mot de passe et cela lui affiche la feuille qui lui a été réservée dans le code VBA (feuille "Agent1" ou "Agent2" dans mon fichier),

- la feuille contient un tableau comme celui déjà présent qui va alors lui afficher les numéros et intitulés de clés relatives aux accès qu'il a.

--> Pour cela, il faudrait que le code ait le comportement suivant : Le mot de passe est entré, le fichier cherche dans la colonne mot de passe du fichier "Accès", il vérifie les croix cochées sur la ligne de la personne et fait la relation avec les emplacements de la feuille "Emplacements". Puis les numéros et intitulés de clés sont récupérés et s'affichent les uns après les autres dans le tableau de feuille vue par l'agent.

J'ai simulé le fonctionnement de cet automatisme au sein du fichier excel joint.

Les mots de passe pour accéder au fichier sont "test" et "test2" ("test" affiche la feuille 1 et "test2" affiche la feuille 2).

Je ne sais pas si mes explications sont claires, mais j'ai cogité pendant un petit moment avant de me lancer dans l'écriture de ce message en essayant de clarifier au maximum ... Vous me répondrez peut-être que c'est utopique ce que je demande, ou critiquerez peut-être aussi code déjà en place (vous pouvez bien sur! :)), quoiqu'il en soit je suis ouvert à toute proposition ou aide, même si partielle, du moment que cela peut me permettre d'avancer...

Merci d'avance à tous ceux qui prendront le temps de me répondre.
 

Pièces jointes

  • Exemple simulé.xls
    27 KB · Affichages: 209

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

LoL, effectivement si c'était aussi simple ... mais non ! D'où mes questions en fait ...

Erreur quand je masque la feuille Emplacements, apparemment ça pose problème ... déboguage : ligne surligné en jaune ...

Même chose pour le mot de passe administrateur, ça pose problème puisque je ne peux pas masquer la feuille "Emplacements" sans créer une erreur à l'exécution du code... lié au problème ci-dessus.

Et pour finir, j'avais déjà essayé de protéger le classeur via la protection excel, mais là aussi ça pose des soucis avec l'exécution du code ...

:(:(:(
 

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Il faut comme tu l'as dis qu'il y a au moins une feuille d'afficher à l'ouverture du classeur, une feuilles "accueil" par exemple.
De quelle protection parles-tu?
Classeur,feuilles,VBA?
Si tu caches les feuilles concernées, tu n'auras pas besoin de les protéger non? car XlVeryHidden dans le code empêche à l'utilisateur de pouvoir afficher les feuilles cachées.
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

OK, oui pour la feuille accueil, désolé, j'ai pas fait le rapprochement tout à l'heure que je n'avais en fait plus aucune feuille d'activée ... ça, c'est fait !

Pour la protection, je parle effectivement de la protection excel (outils / protection). Si je l'active avec l'option "structures" : erreur.

Oui pour les feuilles accès et emplacements que je peux désormais masquer, effectivement pour celles ci je suis tranquille, si ce n'est que :

- la feuille qui s'affiche pour l'utilisateur avec ses accès, il peut la modifier. Si il a envie de modifier le tableau, ou d'insérer une feuille, il peut ... Je vais tenter de résoudre ça avec le partage NTFS, où je ne donnerai pas les droits de modification... mais je cherchais préférentiellement sur excel.

- par contre, ce qu'il faut absolument que j'arrive à faire, c'est verrouiller le code VBA. Parce qu'actuellement, si j'entre un des mots de passe et que j'accède à une feuille du fichier, si je fais "outils / macros / visual basic editor", j'accède au code VBA ... j'aimerais pouvoir verrouiller cela, si c'est possible ...

Au delà de ça, merci encore pour ton aide Skoobi, vraiment sympa ...:eek:
 

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Re bonjour,

- par contre, ce qu'il faut absolument que j'arrive à faire, c'est verrouiller le code VBA. Parce qu'actuellement, si j'entre un des mots de passe et que j'accède à une feuille du fichier, si je fais "outils / macros / visual basic editor", j'accède au code VBA ... j'aimerais pouvoir verrouiller cela, si c'est possible ...
Je t'ai donné la solution, tu ne l'as pas vu?:
Pour protéger le code VBA:
Dans la fenêtre projet sous VBE:
1-ferme l'arborescence du projet pour ne voir apparaître que le nom du fichier
2-bouton droit>propriétés de VBA projet
3-onglet protection: coche verrouiller l'affichage du projet et cré le mot de passe.
- la feuille qui s'affiche pour l'utilisateur avec ses accès, il peut la modifier. Si il a envie de modifier le tableau, ou d'insérer une feuille, il peut ... Je vais tenter de résoudre ça avec le partage NTFS, où je ne donnerai pas les droits de modification... mais je cherchais préférentiellement sur excel.
Il est possible de verrouiller une feuille pour l'utilisateur tout en pouvant modifier cette feuille par code VBA grâce à l'argument UserInterfaceOnly + un mot de passe bien sûr, par exemple:

Code:
ActiveSheet.Protect Password:="mdp", UserInterfaceOnly:=True
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Oh, génial pour le verrouillage du code VBA, ça fonctionne ! Quand je l'avais testé de la même manière, ça me mettait un message d'erreur à l'exécution du script ! Nickel !

Pour le verrouillage des feuilles, je vais essayer d'intégrer le code que tu me donnes au sein du VBA déjà présent pour que ça fonctionne... il me reste plus que ça et c'est bouclé ... et je te devrai une fière chandelle Skoobi ! ;)
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Ok !

J'ai ajouté le code suivant :

Dim group As Variant, sheet As Worksheet
Set group = Sheets(Array("ACCUEIL", "Agent1", "Agent2", "Accès", "Emplacements"))
For Each sheet In group
sheet.Activate
ActiveSheet.Protect "mdp", UserInterfaceOnly:=True
With ActiveWindow
.DisplayHeadings = False
.DisplayWorkbookTabs = False
End With
Next sheet

Ca m'a l'air de plutôt bien fonctionner ! ;)

Je n'arrive par contre pas à insérer dans le reste du code qui filtre les mots de passe, une exception pour qu'à la saisie d'un mot de passe spécifique, disons "admin", il y ait l'affichage des feuilles "Accès" et "Emplacements" ?

Allé, après j'te fous la paix ! :eek:
 

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

bonjour,
Allé, après j'te fous la paix ! :eek:
No problemo ;).
Je n'arrive par contre pas à insérer dans le reste du code qui filtre les mots de passe, une exception pour qu'à la saisie d'un mot de passe spécifique, disons "admin", il y ait l'affichage des feuilles "Accès" et "Emplacements" ?
Quelque chose comme ça:
Code:
      If BoxValue = "mot de passe admin" Then
        Sheets("Accès").Visible = True
        Sheets("Emplacements").Visible = True
      End If
Il faudra aussi que tu penses à déprotéger les feuilles et à les reprotéger après les modifications "admin"...
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

C'est exactement ce que j'ai mis, mais ça ne doit pas être au bon endroit je pense parce que ça ne fonctionne pas... Je cherche.

Dommage pour le fait que ça ne re-protège pas automatiquement les feuilles après fermeture... :(

Je fais les tests et te dis.

MERCI !
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Génial, ça fonctionne parfaitement ta dernière astuce.

Par contre, je te confirme que je n'ai pas réussi à mettre en place ce dernier petit tronçon de code pour qu'à la saisie du mot de passe admin il y ait affichage des feuilles Accès et Emplacements.

J'ai vraiment essayé plusieurs configurations possibles, l'ai mis à plusieurs endroits différents du code, mais soit ça me spécifie que le mot de passe "admin" n'existe pas, soit j'ai une erreur d'exécution du script pointant vers le code que j'ai ajouté.

Il ne me manque vraiment plus que ce petit truc et c'est bouclé ! :(

Si t'as 5 minutes supplémentaires pour m'aiguiller sur l'endroit, au besoin je te repasse le code VBA actuel.

Tu m'enverras la facture, j'essaierai de passer ça en note de frais ! ;) Plus sérieusement, merci énormément, c'est vraiment rare les personnes qui prennent de leur temps pour aider les autres, c'est sincère !
 

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Bonjour,

au besoin je te repasse le code VBA actuel.
Je veux bien car le code à du changer depuis.

c'est vraiment rare les personnes qui prennent de leur temps pour aider les autres, c'est sincère !
C'est sympa, merci!
C'est toujours un plaisir de pouvoir échanger avec des personnes comme toi qui explique bien leur problème et qui s'implique dans leur projet ;).
A te relire.
Bonne journée.:)
 

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Merci, sympa :eek:

Je te joins le fichier, c'est le dernier en date qui inclus les modifications faites au fur et à mesure.

un des mots de passe pour l'ouvrir et accéder au code : "test"

ps : j'ai déverouillée la protection sur le VBA pour le moment, ça facilite les modifications rapides, je le remettrai à la fin dès que tout sera fonctionnel.
 

Pièces jointes

  • Copie de Fichier Final V1.xls
    41 KB · Affichages: 60
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Re,

Il faut mettre la condition vérifiant que c'est l'administrateur (j'ai mis "admin" comme mot de passe) qui ouvre le fichier juste après la boîte de dialogue demandant le mot de passe.
De plus, j'ai créé la procédure
Private Sub ProtectSheet()
Je te laisse regarder ;).

Edit: ajoute bien sûr le code de dé-protection des feuilles quand l'admin ouvre le fichier après l'affichage des feuilles accès et emplacements

Code:
'si mot de passe administrateur on affiche les feuilles Accès et Emplacements puis on quitte le code.
      If BoxValue = "admin" Then
        With Sheets("Accès")
          .Visible = True
          .Activate
        End With
        Sheets("Emplacements").Visible = True
        ActiveWindow.DisplayWorkbookTabs = True
[B]'ici code pour dé-protéger les feuilles[/B]
        Exit Sub
      End If

Bon test.
Bonne soirée.
 

Pièces jointes

  • Fichier Final V1.1.zip
    14 KB · Affichages: 38
Dernière édition:

Trunk

XLDnaute Nouveau
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Bonjour et merci encore pour ton aide.

J'ai vu ton post samedi et ai pu bosser un peu sur le fichier ce week-end pour réussir à en faire ce que je voulais.

Je te joins la version de ce jour, où désormais le mot de passe "admin" permet :

- d'afficher toutes les feuilles,
- de les débloquer,
- de remettre les lignes et colonnes.

J'ai fais deux tests avec un tableau d'accès et une feuille d'emplacements qui seront de même grandeurs que ceux que j'ai dans ma boîte et les utilisateurs voient bien les bons emplacements avec les intitulés correspondants.

Par contre, comme tu pourras le constater, j'alourdis le code avec ce que j'ai fait ... :s Pour moi cela n'est pas évident, ne connaissant que très très très peu le VBA, de faire quelque chose de vraiment "propre" d'un point de vue développeur. Mais ça fonctionne en tous cas...

La seule chose "dommage", c'est le fait que si je rajoute un jour un mot de passe à une personne dans le fichier "Accès", il faudra en fait que je crée une feuille dédiée à la personne et modifie le Code VBA aussi ajouter les multiples lignes qui ont en paramètre le nom de la feuille (masquer, déverrouiller, etc etc...).
Dommage donc que ce ne soit pas automatique, dans le sens où il n'y aurait en fait qu'une seule feuille générique créée avec un tableau déjà fait, et les emplacements seraient affichés à l'utilisateur après mot de passe entré, en fonction des croix qu'il y a sur sa ligne.
 

Pièces jointes

  • Fichier Final V1.2.zip
    25.6 KB · Affichages: 39

skoobi

XLDnaute Barbatruc
Re : Code VBA - Récupérer des valeurs entre diverses feuilles

Bonjour Trunk,

La seule chose "dommage", c'est le fait que si je rajoute un jour un mot de passe à une personne dans le fichier "Accès", il faudra en fait que je crée une feuille dédiée à la personne et modifie le Code VBA aussi ajouter les multiples lignes qui ont en paramètre le nom de la feuille (masquer, déverrouiller, etc etc...).
Dommage donc que ce ne soit pas automatique

Et bien il est tout à fait possible de passer par une boucle pour gérer les feuilles sans avoir à les citer une par une:
Par exemple, si je reprends cette partie du code:

Code:
'Masque directement la feuille si cette derniere est visible
  If Sheets("Adrien BATRA").Visible = True Then Sheets("Adrien BATRA").Visible = xlVeryHidden
  If Sheets("Simone NITAO").Visible = True Then Sheets("Simone NITAO").Visible = xlVeryHidden
  If Sheets("Accès").Visible = True Then Sheets("Accès").Visible = xlVeryHidden
  If Sheets("Emplacements").Visible = True Then Sheets("Emplacements").Visible = xlVeryHidden

Ca donne ceci:
Code:
'Masque directement la feuille si cette derniere est visible
For i = 1 To Sheets.Count
Sheets(i).Visible = xlVeryHidden
Next

Et pour la partie connexion admin:

Remplace ça:
Code:
'si mot de passe administrateur on affiche les feuilles Accès et Emplacements puis on quitte le code.
      If BoxValue = "admin" Then
        With Sheets("Accès")
          .Visible = True
          .Activate
        End With
        Sheets("Emplacements").Visible = True
        Sheets("Adrien BATRA").Visible = True
        Sheets("Simone NITAO").Visible = True
        ActiveWindow.DisplayWorkbookTabs = True
        With ActiveWindow
            Sheets("Adrien BATRA").Activate
            ActiveWindow.DisplayHeadings = True
            Sheets("Simone NITAO").Activate
            ActiveWindow.DisplayHeadings = True
            Sheets("Emplacements").Activate
            ActiveWindow.DisplayHeadings = True
            Sheets("ACCUEIL").Activate
            ActiveWindow.DisplayHeadings = True
            Sheets("Accès").Activate
            ActiveWindow.DisplayHeadings = True
        End With
        'Verrouille la modification des feuilles
        ProtectSheet ("admin")
        Exit Sub
      End If

par:
Code:
'si mot de passe administrateur on affiche les feuilles Accès et Emplacements puis on quitte le code.
      If BoxValue = "admin" Then
        For i = 1 To Sheets.Count
          Sheets(i).Visible = True
          ActiveWindow.DisplayHeadings = True
        Next
        ActiveWindow.DisplayWorkbookTabs = True
        Sheets("Accès").Activate
        'Verrouille la modification des feuilles
        ProtectSheet ("admin")
        Exit Sub
      End If


Pour ce qui est de gérer l'ajout d'une personne dans "Accès", création de la feuille etc..., c'est aussi possible mais une chose après l'autre ;).
 
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 Code de tri
Réponses
22
Affichages
288
Réponses
2
Affichages
154
Réponses
8
Affichages
146

Membres actuellement en ligne

Statistiques des forums

Discussions
312 165
Messages
2 085 879
Membres
103 009
dernier inscrit
dede972