Excel affichage restreint & récurrent données

Fermé
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 - Modifié par etienne06 le 17/10/2011 à 16:58
vanavana Messages postés 35 Date d'inscription mardi 22 janvier 2013 Statut Membre Dernière intervention 8 juin 2016 - 8 juin 2016 à 14:13
Bonjour,

Je viens vers vous pour afin de demander de l'aide pour concevoir un tableau Excel périodique.

Voici la situation : je travaille dans une structure où la plupart des employés ont une ligne de téléphone fixe. Chaque mois, le service informatique/télécom génère un fichier Excel où les consommations mensuelles sont indiquées pour chaque personne. Il est alors envoyé aux différents chefs de service afin qu'ils décèlent d'éventuelles consommations abusives par rapport aux postes occupés.

D'où ma question (qui a 2 volets) :

- comment faire en sorte que, lorsqu'un chef de service reçoit le fichier complet, il ne puisse avoir accès qu'aux données des personnes de sa Direction (j'ai pensé à un formulaire, impliquant un identifiant et un mot de passe ou une liste déroulante, mais, je ne sais comment mettre tout cela en oeuvre)

- comment rendre cela automatique de mois en mois, car le service informatique génère un fichier chaque mois, et ajoute la colonne correspondant au mois écoulé, tout en laissant les colonnes des mois passés.

J'ai mis le fichier à cette adresse : http://www.cijoint.fr/cjlink.php?file=cj201110/cijbNOnS6Q.xls

Le fichier est présenté de la façon suivante : la colonne correspondant au n° du poste téléphonique, celle du nom de l'employé, celle du code de son service (le même code est donc partagé entre tous les employés d'un même service), puis celles des consommations mensuelles, qui finissent par le total annuel par personne.

Un grand merci donc à celles et ceux qui pourraient consacrer un peu de temps à ma question.

Bonne après-midi et bonne continuation à tous,

Cordialement,

Jean-Philippe


A voir également:

8 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
18 oct. 2011 à 11:57
Bonjour,

Tout d'abord, excusez moi pour la longueur de ce message, mais ces explications sont nécessaires...
Je replace le fichier ici...
Le but de ce fichier est de masquer les infos qui ne les concernent pas aux différents services.
Pour cela, j'ai pris le parti de :
- masquer toutes les infos,
- n'afficher que celles correspondantes aux divers services.
Donc :
1ère partie : masquer les infos.
La feuille "Feuil1" contenant toutes les informations doit être "masquée", sans que l'utilisateur "lambda" puisse l'afficher par la commande : Format/feuille/Afficher.
Pour cela, il nous faut régler la propriété visible de cette feuille sur : xlveryhidden. Attention toutefois, pour ouvrir un classeur, il nous faut, au moins, une feuille "visible". Donc on insère une feuille ("Feuil2" dans l'exemple) qui devra rester visible et qui aura pour but de recevoir les infos concernant le service. Nous allons également créer un Userform "mot de passe" permettant de récolter ces infos.
Le code pour masquer la feuille à l'ouverture du classeur est donc :

'se déclenche lors de l'événement : ouverture du classeur
Private Sub Workbook_Open()
'on masque très très fort la Feuil1
Sheets("Feuil1").Visible = xlVeryHidden
'on ouvre l'UserForm permettant la saisie du mot de passe
UserForm1.Show
End Sub

Problème : si l'utilisateur n'active pas les macros au démarrage, notre feuille "Feuil1" ne sera pas masquée. Donc, il faut, avant fermeture masquer à nouveau cette feuille.
Soit :
'se déclenche lors de l'événement : avant la fermeture du classeur
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'empêche les messages d'alerte d'Excel (souhaitez vous enregistrer...)
Application.DisplayAlerts = False
'on masque la feuil1
Sheets("Feuil1").Visible = xlVeryHidden
'la feuil2 contenant les infos d'un service, on les supprime
'afin d'éviter que les autres services y aient accès
With Sheets("Feuil2")
    .Range("2:65000").Delete
End With
'et on enregistre ces modifications
ActiveWorkbook.Save
End Sub


2ème partie : afficher les infos.
1- création de l'Userform :
sous VBE : Insertion Userform.
y dessiner : 1 combobox, 1 textbox, 1 bouton de commande.
2- Remplissage de la liste des servicesLa combobox est destinée à recevoir les noms des différents services. On retrouve ces informations colonne C de la feuil1. Il nous faut donc "charger" ces informations dans la combobox, au lancement de l'userform.
Soit le code :
'Lors de l'initialisation de l'userform
Private Sub UserForm_Initialize()
Dim Lign As Long
'on vide la combobox des éventuelles infos qu'elle contient
ComboBox1.Clear
'depuis la feuil2
With Sheets("Feuil1")
    'de la 2nde à la dernière ligne colonne C
    For Lign = 2 To .Range("C" & Rows.Count).End(xlUp).Row
        'on ajoute, à la combo, les infos contenues dans ces cellules
        ComboBox1 = .Range("C" & Lign)
        'en évitant d'y enregistrer les données déjà contenues dans la combo
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem .Range("C" & Lign)
    Next Lign
End With
End Sub

3- La Sub ouverture...
On créé cette procédure, pour n'afficher, dans la "feuil2", que les infos concernant le service définit dans la combobox.
Soit le code :
'Utilisateur, ici en paramètre, va nous permettre de
'tenir compte de la saisie dans la combobox
Sub Ouverture(Utilisateur As String)
Dim Lign As Long
'depuis la feuil1
With Sheets("Feuil1")
'sur toutes les lignes non vides de la colonne C
    For Lign = 2 To .Range("C" & Rows.Count).End(xlUp).Row
        'si le contenu de la colonne C est identique à la valeur
        'choisie dans la combobox
        If .Cells(Lign, 3) = ComboBox1 Then
            'alors on copie toute la ligne de la feuil1 à la feuil2
            .Rows(Lign).Copy Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
        End If
    Next
End With
End Sub

remarques :
- si aucune saisie dans la combobox, il ne se passera pas grand chose puisqu'aucune info ne sera copiée/collée.
- le fait de copier/coller n'altère en rien les infos contenues feuil1...

4- code du bouton "valider" (permettant le choix du mot de passe)
- Si rien n'est saisi dans le champs "mot de passe" : alors on sort de la procédure. Se traduit par :
If TextBox1 = "" Then
    MsgBox "Mot de passe obligatoire"
    Exit Sub
End If

- En fonction du choix de l'utilisateur, on lance la procédure "ouverture" ayant pour paramètre le choix de l'utilisateur, et, donc, le contenu de combobox1. Le code pour le choix "comptabilité" (par exemple) serait donc :
Case "Comptabilité"
    'si la saisie du mot de passe est différente de "compta"
    ' (mot de passe à adapter bien sur!!)
        If TextBox1 <> "compta" Then
        'alors: message à l'utilisateur et sortie de la procédure
            MsgBox "Mot de passe erroné"
            Exit Sub
    'sinon.....
        Else
        'on appelle la procédure "ouverture" 
        'avec le contenu de la combobox en paramètre
            Call Ouverture(ComboBox1.Value)
        End If


On fait la même chose pour tous les cas.
On va même étudier les cas "improbables" de :
- non saisie dans la combobox : Case ""
- ou toute autre possibilité : Case Else.

Ce qui nous donne le code du CommandButton1 quand on clic :
Private Sub CommandButton1_Click()
'teste la saisie d'un mot de passe
If TextBox1 = "" Then
    MsgBox "Mot de passe obligatoire"
    Exit Sub
End If
'étudie les différents cas de saisie dans la combobox
Select Case ComboBox1
    Case ""
        MsgBox "Choisissez votre service"
        Exit Sub
    Case "Comptabilité"
        If TextBox1 <> "compta" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Juridique"
        If TextBox1 <> "jurid" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "RH"
        If TextBox1 <> "ressources" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Technique"
        If TextBox1 <> "techn" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Communication"
        If TextBox1 <> "commu" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Accueil"
        If TextBox1 <> "accueil" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case Else
        MsgBox "Je ne vois pas comment vous en êtes arrivés là"
        Exit Sub
End Select
'ferme l'userform
Unload Me
End Sub


Excuse moi pour l'indigestion consécutive à ce message.
En espérant avoir été clair...
A+
1
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
18 oct. 2011 à 12:40
C'est peut-être mieux si je place ma réponse à la suite te votre post : Re-bonjour,

Merci beaucoup. C'est vraiment un travail très impressionnant.

Mais je réalise que je ne serai pas capable de le reproduire chaque mois lorsque le fichier originel sera généré par le service informatique.

Cela constitue un challenge personnel hyper intéressant, mais que me conseilleriez-vous de privilégier comme solution de court terme ?

Y a-t-il un moyen de dupliquer de façon transparente, et récurrente (chaque mois), cette manip sur les nouveaux fichiers générés ?

Merci d'avance
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
18 oct. 2011 à 12:42
Va voir ma réponse ici
Et évite de poster deux fois la même question ,t'inquiète je te suis...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
17 oct. 2011 à 17:01
Salut,
Regarde cet exemple.

Liste des mots de passe (ça peux servir!!) :
- "Comptabilité" mdp : "compta"
- "Juridique" mdp "jurid"
- "RH" mdp "ressources"
- "Technique" mdp "techn"
- "Communication" mdp "commu"
- "Accueil" mdp "accueil"

De retour demain...
0
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
17 oct. 2011 à 17:40
Bonjour pijaku,

Je suis un peu scotché par :
- ta rapidité
- l'exacte adéquation entre ce que tu proposes et ce que j'espérais.

C'est exactement ce que je souhaitais obtenir comme résultat.

Donc, un grand merci.

Mais du coup, je suis tenté de te demander comment tu y es parvenu. J'ai fait un tour dans les codes VB, mais je ne suis qu'un débutant balbutiant pour voir ce que tu as construit.

Serait-il possible d'avoir des explications afin que j'assimile la manip, et tente de la dupliquer stp ? Car je pense qu'il sera plus pratique que je répète l'opération chaque mois pour diffuser le fichier des nouvelles consommations mensuelles (vu qu'elles sont générées sur un fichier Excel neuf) ?

Je me permets de t'envoyer un petit MP pour cela, au cas où tu ne repasserais pas par ce sujet.

Merci encore,

Bonne soirée,

Jean-Philippe
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
18 oct. 2011 à 11:17
Ouaip! J'me doutais un peu.
Cependant, hier il était déjà 17h00 et donc je n'ai pas pris le temps de décrire le fichier, ce que je vais faire dans un instant.
0
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
18 oct. 2011 à 11:25
Salut,

Super, merci beaucoup.

J'avais bien lu hier soir que tu devais quitter le forum. C'est vraiment sympa de repasser et m'expliquer.

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
18 oct. 2011 à 12:28
Re-bonjour,

Merci beaucoup. C'est vraiment un travail très impressionnant.

Mais je réalise que je ne serai pas capable de le reproduire chaque mois lorsque le fichier originel sera généré par le service informatique.

Cela constitue un challenge personnel hyper intéressant, mais que me conseilleriez-vous de privilégier comme solution de court terme ?

Y a-t-il un moyen de dupliquer de façon transparente, et récurrente (chaque mois), cette manip sur les nouveaux fichiers générés ?

Merci d'avance
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
Modifié par pijaku le 18/10/2011 à 12:43
Oui.
Pour toi, il suffit d'ajouter une macro pour afficher la "Feuil1"... Ensuite, chaque mois, tu :
- affiches la "Feuil1"
- fais un copié/collé des infos transmises par le service informatique
- ferme le fichier pour masquer à nouveau la feuil1...

Pour info, le code d'affichage de la feuil1 est super complexe :
A insérer dans un Module Standard (sous VBE : Insertion/Module)
Sub AfficherFeuil1() 
Sheets("Feuil1").Visible = True 
End Sub

Pour l'utiliser, depuis la feuille de calcul Feuil2 : ALT+F8 choisir : AfficherFeuil1 et exécuter

Avec mot de passe et message d'intimidation :
Sub AfficherFeuil1AvecMotDePasseAdmin() 
Dim Result As String 
Result = InputBox("Saisie : ", "Entrez votre mot de passe") 
If Result = "admin" Then 
    Sheets("Feuil1").Visible = True 
Else 
    MsgBox "Ce classeur va fermer, droits d'administrateurs violés!", vbCritical 
    Application.Quit 
End If 
End Sub

Ci-joint le nouveau fichier
Le mot de passe est, bien sur, admin
0
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
18 oct. 2011 à 16:11
Waow,

Je suis autant admiratif de la proposition qu'inquiet de ma capacité à réaliser tout cela dans mon coin !

S'agissant du "copié/collé", je ne comprends pas vraiment à quoi cela sert. Est-ce la colonne correspondant au nouveau mois ?

Autre chose (si je me permets d'abuser de ton temps) : comment faire pour changer les mots de passe pour accéder aux données des différents services stp ?

Et comment changer le mdp "admin" ?

Enfin, j'essaie d'entrer dans le module VBE, mais lorsque je fais ALT + F11, je tombe sur une page de codes bien moins complexes que celui du masquage de la 'Feuil1'. Je dois me planter de manip. Comment y accéder selon toi ?

Merci encore si tu as un peu de temps.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
18 oct. 2011 à 16:23
Etape par étape :
1- le copié collé. Tous les mois tu reçois, du service informatique, un fichier contenant 1 feuille. Tu copies toutes les infos contenues dans cette feuille et va les coller dans la feuille Feuil1 de mon classeur que tu auras préalablement vidée.
Tu peux aussi ne copier/coller que la dernière colonne.
L'idée est d'avoir en Feuil1 l'équivalant de ce que te transmet le service informatique.

2- ALT+F11 t'amène sous VBE.
De là, dans une petite fenêtre (en haut à gauche de ton écran), tu as les données de ton projet.
- VBAProject (motdepasse ouverture.xls)
- Microsoft Excel Objets
Feuil1(Feuil2)
Feuil2(Feuil1)
ThisWorkbook
- Feuilles
UserForm1
- Modules
Module1
Pour accéder aux différents codes VBA qui régissent chacun de ces objets (feuil1, userform, workbook...) double clic sur leur nom respectif dans cette fenêtre...

3- changer le mot de passe "admin"
- double clic sur Module1
- dans le code :
Sub AfficherFeuil1AvecMotDePasseAdmin()
Dim Result As String
Result = InputBox("Saisie : ", "Entrez votre mot de passe")
If Result = "admin" Then
    Sheets("Feuil1").Visible = True
Else
    MsgBox "Ce classeur va fermer, droits d'administrateurs violés!", vbCritical
    Application.Quit
End If
End Sub

- remplace la ligne :
If Result = "admin" Then

- par :
If Result = "Ton_mot_de_passe_entre_guillemets" Then


4- pour changer les autres mots de passe :
- double clic sur Userform1
- double clic sur le bouton de commande (CommandButton1 ou valider)
- dans le code :
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
    MsgBox "Mot de passe obligatoire"
    Exit Sub
End If
Select Case ComboBox1
    Case ""
        MsgBox "Choisissez votre service"
        Exit Sub
    Case "Comptabilité"
        If TextBox1 <> "compta" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Juridique"
        If TextBox1 <> "jurid" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "RH"
        If TextBox1 <> "ressources" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Technique"
        If TextBox1 <> "techn" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Communication"
        If TextBox1 <> "commu" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case "Accueil"
        If TextBox1 <> "accueil" Then
            MsgBox "Mot de passe erroné"
            Exit Sub
        Else
            Call Ouverture(ComboBox1.Value)
        End If
    Case Else
        MsgBox "Je ne vois pas comment vous en êtes arrivés là"
        Exit Sub
End Select
Unload Me
End Sub

- dans toutes les lignes de ce modèle :
 If TextBox1 <> "blabla" Then

- remplace blabla (Technique)par le mot de passe choisit.
If TextBox1 <> "compta" Then 'remplace compta par.....
If TextBox1 <> "jurid" Then 'remplace jurid par.........
If TextBox1 <> "ressources" Then 'remplace ressources par.......
If TextBox1 <> "techn" Then 'là je crois que tu as compris......
If TextBox1 <> "commu" Then
If TextBox1 <> "accueil" Then
0
etienne06 Messages postés 147 Date d'inscription mercredi 9 janvier 2008 Statut Membre Dernière intervention 23 mars 2015 10
18 oct. 2011 à 17:15
Super, merci, j'ai essayé les différents changements de mdp, et ça marche. Ca me rassure.

Il me vient des questions supplémentaires, si tu as éventuellement un peu de temps encore :

- comment rendre 'la feuil1' invisible ? J'ai essayé, sur un fichier vierge, d'appliquer le moême code VB, mais cela ne produit rien. En fait, je pense faire une confusion entre ce qui est réalisé à partir de ALT + F8 et ce qui l'est à partir de ALT + 11.

- comment éviter que j'aie à rentrer moi-même un mdp correspondant à un des services pour passer l'étape de la boîte de dialogue ?

Si mes questions t'embêtent, n'hésite pas à me le dire. Tu m'as déjà bien aidé, mais je pense ne pas être loin de faire la jonction entre les différentes étapes dans ma petite tête.

Et pour la suite, je prends avec moi un bouquin sur le VBE en guise de livre de chevet pour ce soir !

Merci d'avance
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 oct. 2011 à 08:49
Salut salut,
- comment rendre la feuille Feuil1 invisible :
avec du code VBA!
Sheets("Feuil1").Visible = xlVeryHidden

- comment éviter de passer par un des services : La croix en haut à droite de l'userform ferme celui-ci sans rien affecter au classeur...

Tes questions ne m'embêtent pas, on est là pour ça!
0
vanavana Messages postés 35 Date d'inscription mardi 22 janvier 2013 Statut Membre Dernière intervention 8 juin 2016
8 juin 2016 à 14:13
Bonjour,

Je suis confrontée au même problème, serait il possible d'obtenir le fichier communiqué pour visualiser si je peux l'appliquer à mon soucis ?

Merci d'avance
0