Partager un fichier
NB : Cette application a été développée sous Excel 2007, Excel s'est amélioré avec les années et actuellement cette surveillance est active lorsque l'on partage un classeur
Pour savoir comment faire suivez ce lien vers la page Microsoft mais ceci reste un excellent exercice VBA
Problème : Partager une application avec plusieurs utilisateurs mais ne leur permettre que de voir certaines informations
- Le chef du personnel (CP) veut partager un fichier Excel avec les 4 sous-chefs de Bureau (SCBx). Ce fichier comporte 5 feuilles de travail, une par département et une dont vous découvrirez l'utilisation.
- Les permissions sont fixées comme ceci
- CP peut voir et manipuler les 4 feuilles de travail
- SCB1 voit et manipule uniquement la feuille 1
- SCB2 voit et manipule uniquement la feuille 2
- SCB3 voit et manipule uniquement la feuille 3
- SCB4 voit et manipule uniquement la feuille 4
Première étape
- Créer un UserForm. Pour cela, se placer sur la mention VBAProject puis via le menu Insertion choisir UserForm
- Placer ensuite les différents contrôles sur le formulaire comme les boutons d'options(SCB1;SCB2;SCB3;SCB4;CP), un cadre qui regroupe les boutons d'options, un bouton de commande(OK), une zone de texte(MP) pour encoder un mot de passe personnalisé, deux étiquettes. Personnalisez toujours les noms des contrôles en modifiant la propriété Name et leur affichage par la propriété Caption
Seconde étape
Que doit effectuer la macro lorsque l'utilisateur presse le bouton OK...Faites un double clic sur le bouton. Dans la fenêtre de code, encodez les instructions suivantes
Private Sub OK_Click()
'Mémorisation du nom de la feuille active
Origine = ActiveSheet.Name
'Recherche de la présence de la feuille Controle
FeuilleControle = 0 'réinitialisation du compteur
For i = 1 To Worksheets.Count
If Worksheets(i).Name = "Controle" Then
FeuilleControle = 1
End If
Next i
'Si le classeur ne contient pas de feuille Contrôle ...
If FeuilleControle = 0 Then
'...introduction (création) d'une feuille Controle
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Controle"
End If
'suivant le choix de l'utilisateur, affiche la feuille appropriée
MonFormulaire.Hide
If SCB1 = True And MP = "MP1" Then
Feuil1.Visible = xlSheetVisible
Feuil2.Visible = xlSheetVeryHidden
Feuil3.Visible = xlSheetVeryHidden
Feuil4.Visible = xlSheetVeryHidden
Feuil5.Visible = xlSheetVeryHidden
Nom = "SCB1" 'Nom = variable que l'on récupère plus loin dans le code
ElseIf SCB2 = True And MP = "MP2" Then
Feuil2.Visible = xlSheetVisible
Feuil1.Visible = xlSheetVeryHidden
Feuil3.Visible = xlSheetVeryHidden
Feuil4.Visible = xlSheetVeryHidden
Feuil5.Visible = xlSheetVeryHidden
Nom = "SCB2" 'Nom = variable que l'on récupère plus loin dans le code
ElseIf SCB3 = True And MP = "MP3" Then
Feuil3.Visible = xlSheetVisible
Feuil1.Visible = xlSheetVeryHidden
Feuil2.Visible = xlSheetVeryHidden
Feuil4.Visible = xlSheetVeryHidden
Feuil5.Visible = xlSheetVeryHidden
Nom = "SCB3" 'Nom = variable que l'on récupère plus loin dans le code
ElseIf SCB4 = True And MP = "MP4" Then
Feuil4.Visible = xlSheetVisible
Feuil1.Visible = xlSheetVeryHidden
Feuil2.Visible = xlSheetVeryHidden
Feuil3.Visible = xlSheetVeryHidden
Feuil5.Visible = xlSheetVeryHidden
Nom = "SCB4" 'Nom = variable que l'on récupère plus loin dans le code
ElseIf CP = True And MP = "MP5" Then
Feuil1.Visible = xlSheetVisible
Feuil2.Visible = xlSheetVisible
Feuil3.Visible = xlSheetVisible
Feuil4.Visible = xlSheetVisible
Worksheets("Controle").Visible = xlSheetVisible
Feuil5.Visible = xlSheetVeryHidden
Nom = "CP" 'Nom = variable que l'on récupère plus loin dans le code
Else
Call PasDAutorisation
End If
'Insertion du nom et de la date dans la première ligne libre de la feuille Controle
Worksheets("Controle").Activate 'Active la feuille appelée Controle
ActiveCell.SpecialCells(xlLastCell).Select 'Sélectionne la dernière cellule remplie
Range("A" & ActiveCell.Row + 1).Select 'Descend d'une ligne
ActiveCell.Value = Nom 'Entre la valeur de la variable Nom
ActiveCell.Interior.ColorIndex = 36 'Met de la couleur à l'intérieur de la cellule
ActiveCell.Font.ColorIndex = 3 'Utilise une couleur pour la police de caractère
ActiveCell.Offset(0, 1).Value = Now() 'Entre la date dans la colonne d'à côté
ActiveCell.Offset(0, 1).Interior.ColorIndex = 36 'Met de la couleur à l'intérieur
ActiveCell.Offset(0, 1).Font.ColorIndex = 3 'Utilise une couleur pour la police de caractère
ActiveCell.Offset(1, 0).Activate 'Descend d'une ligne
'La variable CelluleControle est créée
ActiveWorkbook.Names.Add "CelluleControle", ActiveCell.Address
'La feuille d'origine est activée
'Worksheets(Origine).Activate
Feuil1.Activate 'La feuille 1 est activée
End Sub
J'ai dissocié ici une procédure pour fermer le fichier sans sauvegarde au cas un intrus essaierait d'ouvrir le fichier sans authentification ou pour pouvoir la réutiliser plus tard dans d'autres gestions des erreurs mais vous pourriez l'embarquer dans le Else de la procédure du dessus
Private Sub PasDAutorisation()
Reponse = MsgBox("Vous n'êtes pas autorisé à utiliser ce fichier", vbOKOnly, "Avertissement")
Application.ActiveWorkbook.Close False
End Sub
Enfin, Il nous reste à empêcher l'utilisation de la croix X dans le coin supérieur droit du formulaire, car malheureusement elle sera toujours affichée, mais l'on peut utiliser l'événement qui se produit lorsque l'on clique dessus...Faites un double-clic sur votre formulaire et une fenêtre de code s'ouvre, encodez donc cette formule, son action me semble facile à comprendre
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Pour empêcher l'utilisateur de fermer la fenêtre en appuyant sur la croix
If CloseMode = vbFormControlMenu Then
MsgBox "Vous ne pouvez pas fermer le formulaire comme cela"
Cancel = True
End If
End Sub
Pour que ce formulaire soit actif au chargement du fichier, nous avons besoin d'une procédure spéciale qui s'intitulera Sub Workbook_open()
'Routine qui s'excécute à l'ouverture du fichier
Sub Workbook_open()
'Ouverture du formulaire d'entrée
Load MonFormulaire
MonFormulaire.Show
End Sub
Troisième étape : Les différentes protections
Malgré la procédure précédente, l'utilisateur peut échapper ce formulaire d’accueil, en effet lorsque le fichier s'ouvre l'on reçoit l'invite "Activer ou ne pas activer les macros"; protection mise en place pour se protéger des macros virus, louable en soi mais si l'utilisateur choisit de ne pas activer les macros, il charge, accède au fichier et contourne les aspirations du créateur (à savoir limiter l'accès à certaines données)
Première mesure à prendre, jouer sur l'événement "fermeture du fichier", en effet Excel se souvient du dernier affichage actif, nous allons donc créer une feuille vierge qu'une macro activera juste avant que l'on ferme le fichier; ce sera elle qui sera active au prochain chargement…Bien sûr , à cette même occasion nous masquons les autres feuilles
'Routine qui s'excécute à la fermeture du fichier
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Feuil5.Visible = xlSheetVisible
Feuil1.Visible = xlSheetVeryHidden
Feuil2.Visible = xlSheetVeryHidden
Feuil3.Visible = xlSheetVeryHidden
Feuil4.Visible = xlSheetVeryHidden
Worksheets("Controle").Visible = xlSheetVeryHidden
End Sub
Remarquez le nom de la macro, voyez aussi que l'on affiche la Feuille 5 AVANT de masquer les autres, en effet Excel ne tolère pas que l'on cache toutes les feuilles. A partir de ce moment, si l'utilisateur désactive les macros, il ne verra que cette feuille vierge...
Avant d'activer la prochaine protection, sauvegardez votre travail mais en passant par les options de sauvegarde pour y définir un mot de passe
Enfin certains tenteraient d'accéder au code VB qui régit les macros; pour éviter cela, activez la protection et le partage de fichier,ceci permettra d'utiliser le fichier sur un réseau en mode multi-utilisateurs mais verrouillera également le code VBA
De cette manière l'utilisateur accédera au fichier par un mot de passe général que vous lui communiquerez, ne pourra pas échapper au formulaire d'acceuil, sera obligé de choisir un utilisateur précis, entrera un mot de passe personnel fixé par le créateur en utilisant une zone de texte et dont la propriété "passworchar" est "x".
Quatrième étape : Régler les options de partage
En effet, nous devons nous pencher sur les mises à jour du fichier de manière à ce que tous puissent disposer des informations les plus récentes. Pour cela, ouvrez le menu Outils et suivez les indications sur les vues d'écran comme ci-dessous. L'on regrettera de ne pas pouvoir descendre en dessous des 5 minutes pour une synchronisation parfaite du fichier mais cela est dû à Excel
Les différents mots de passe utilisés dans le fichier fourni en exemple :
Ouverture du fichier : "password" (Bizarrement, dans une nouvelle version d'Excel, il vous sera réclamé 3 fois)
Protection du fichier : "password1" (Pour vous permettre de voir le code VBA)
SCB1 : MP1 (Attention !! en majuscules)
SCB2 : MP2
SCB3 : MP3
SCB4 : MP4
CP : MP5
Télécharger le fichier exemple ExempleUserForm