Astuce pour ameliorer la securité d'accés aux données et au code d'un fichier excel

Description

ATTENTION L'UTILISATION DE CETTE SOURCE DEMANDE UNE BONNE MAÎTRISE DU VBA. Une mauvaise maîtrise vous interdiras l’accès à plusieurs fonctions d'excel.

Ce fichier regroupe plusieurs petites ou grosses astuces pour améliorer la sécurité d’accès aux données et au code d'un fichier excel.
Dans cette source je montre comment:

- Interdire l’accès à certain bouton de la barre Visual basic. Sur ce point j'utilise une classe qui permet de détecter le clic sur les boutons de la barre visual basic.

- Interdire l’accès à la boite à outils macro.

- Interdire l'utilisation des raccourcis Alt+F11 et Alt+F8 qui permettent respectivement d'ouvrir l’éditeur VBE et la boite Lancer Macro

- Interdire l'utilisation de la touche [Maj] à l'ouverture du fichier. Touche qui comme vous le savez déjà permet d'ouvrir un fichier excel en mode création ce qui a pour effet de désactiver les macros lors de l'ouverture.

- Interdire l'accés au fichier donc aux feuilles si les macros non pas été activées. La methode utilisé ici est differente de la methode classic qui consiste à cacher les feuilles avec l'option XlVeryHidden.

- Fermer l'editeur VBE automatiquement si celui-ci est ouvert au moment de l'ouverture du fichier excel. Ceci plus les interdits listés plus haut permettent d'interdire l'accés au VBE. Fonctionne pour Xl2002, Xl2003 à confirmer pour Xl2007.(Vous devrez télécharger le fichier pour voir la méthode mais n'est pas renseignées !)

- Excel ne peut être fermé tant que le fichier est ouvert

Touts ceci n'est valable que pour le fichier lui meme, mais peut ajouter quelques limitations aux autres fichiers tant que celui-ci est ouvert comme par exemple l'accés au macros via la barre visual basic ou les racourcis clavier. Il suffit de le fermer pour que tout rentre dans l'ordre.

Il n'est apparemment pas possible d'interdire l'accés au code si les macros n'ont pas été activées sauf par mot de passe.

Je ne suis pas utopiste, excel est une passoire et reste une passoire malgré tout, mais ici je donne des solutions pour renforcer la securité par rapport a un utilisateur de base voir un utilisateur deja bien initié. En tout cas ceci ajouté aux mots de passe peut en rebuter plus d'un.

Mais attention ceci a sont revers en effet avec ce type de protection l'utilisateur n'a plus d'autre choix que d'activer les macros pour acceder au fichier. Autrement dit vous l'obligez à baisser sa garde donc à ce mettre en danger.

Source / Exemple :


Dans le code du ThisWorkBook:

'Macro Créée par : BigFish (Philippe E)
'le :06-11-2008
'Mis à jour le : 03/09/2010
'V1.3
'

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Cancel = True
    HideSheets
    WBkSave (SaveAsUI)
End Sub

Private Sub Workbook_Open()
    Dim CmdBs As CommandBar
    'si les macros on ete activées les feuilles cachées seront affichées
    'dans le cas contraire elle resteront cachées et un message d'erreur apparaitra.
    'j'ai laissé cette option qui fonctionne si ce fichier n'est pas enregistré avec
    'l'option IsAddin a vrai. Dans le cas contraire cela ne sert a rien
    Application.Run ("Opening")
    'desactive la barre "Boîte à outils Contrôles"
    For Each CmdBs In Application.CommandBars
        Select Case CmdBs.Name
            Case "Control Toolbox", "Boîte à outils Contrôles" 'cas Anglais ou Français
                CmdBs.Enabled = False
        End Select
    Next
    'initialisation de la classe
    Set XlAppli.XL = Excel.Application
    Call XlAppli.InitClass
    'on interdit l'utilisation des racourcis Alt+F11 et Alt+F8
    Application.OnKey "%{F11}", "MessageDeLimitation"
    Application.OnKey "%{F8}", "MessageDeLimitation"
    DoEvents
    'ce fichier a été sauvé avec l'option IsAddin a vrai donc on le passe a false
    'pour lui redonner toutes ses fonctions de Workbook classic
    If ThisWorkbook.IsAddin = True Then ThisWorkbook.IsAddin = False
    'si le VBE est ouvert on le ferme mais pour que cela fonctionne l'option
    'de securite "Faire confiance au projet Visual Basic" doit etre cochée.
    On Error Resume Next
    If Application.VBE.MainWindow.Visible = True Then Application.VBE.MainWindow.Visible = False
    MyFileIsOpen = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
        'une partie de ce qui suit ne sert qu'a gerer le passage IsAddin = True de ce fichier si
        'l'utilisateur veut sauver avant de fermer
        'Pour cela on vas substituer au message d'excel notre propre message ce qui
        'permet de gerer le cas du bouton cancel
        If MyFileIsOpen = True Then Exit Sub
        Dim Reponse As VbMsgBoxResult
        If ThisWorkbook.Saved = True Then
            'retour a la normale
            Defaut
            'on vide la classe
            Call XlAppli.EmptyClass
        Else
            Cancel = True
            'ici notre message perso:
            On Error Resume Next
            Reponse = MsgBox("Voulez-vous sauver les modifications effectuées dans '" & ActiveWorkbook.Name & "' ? ", vbExclamation + vbYesNoCancel)
            Select Case Reponse
                Case vbYes 'l'utilisateur veut sauver avant de fermer le fichier
                    HideSheets
                    Application.EnableEvents = False 'pour eviter de passer par l'evenement Workbook_BeforeSave
                    ThisWorkbook.IsAddin = True
                    ThisWorkbook.Save
                    ThisWorkbook.Saved = True
                    Application.EnableEvents = True
                    Application.DisplayAlerts = True
                    Application.ScreenUpdating = True
                    Cancel = False
                Case vbNo 'l'utilisateur ne veut pas sauver. Pour cela:
                    'retour a la normale
                    Defaut
                    'on vide la classe
                    Call XlAppli.EmptyClass
                    'on laisse croire excel que le fichier a été sauvé
                    ThisWorkbook.Saved = True
                    'on autorise la fermeture
                    Cancel = False
            End Select
        ' si cancel rien ne ce passe
        End If
End Sub
-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Dans le module nomé module1

'Macro Créée par : BigFish (Philippe E)
'le :15-11-2008
'Mis à jour le : 03/09/2010
'V1.4
'
Option Explicit

Public XlAppli As New ClasseAppli, MyFileIsOpen As Boolean
Sub Defaut()
    Dim CmdBtn As office.CommandBarButton, CmdBs As CommandBar
    'Retablit l'utilisation des raccourcis Alt+F11 et Alt+F8
    Application.OnKey "%{F11}"
    Application.OnKey "%{F8}"
    'Active la barre "Boîte à outils Contrôles"
    For Each CmdBs In Application.CommandBars
        Select Case CmdBs.Name
            Case "Control Toolbox", "Boîte à outils Contrôles"
                CmdBs.Enabled = True
        End Select
    Next
End Sub
Sub viderclass()
    Call XlAppli.EmptyClass
End Sub
Sub HideSheets()
    'Cache toute les feuilles a l'exception de la feuille starting notice
    'j'ai laissé cette option qui fonctionne si ce fichier n'est pas enregistré avec
    'l'option IsAddin a vrai. Dans le cas contraire cela ne sert a rien
    Dim MySheet As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    If Sheets("starting notice").Visible = xlVeryHidden Then Sheets("starting notice").Visible = True
    For Each MySheet In ThisWorkbook.Worksheets
        If Not MySheet.Name = "starting notice" Then
            MySheet.Visible = xlVeryHidden
        End If
    Next
End Sub
Sub Opening()
    Dim MySheet As Worksheet
    'Affiche toute les feuilles a l'exception de la feuille starting notice
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    ThisWorkbook.IsAddin = False
    For Each MySheet In ThisWorkbook.Worksheets
        If Not MySheet.Name = "starting notice" Then
            MySheet.Visible = True
        End If
    Next
    If Sheets("starting notice").Visible = True Then Sheets("starting notice").Visible = xlVeryHidden
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    ThisWorkbook.Saved = True
End Sub
Sub WBkSave(ByVal SaveAsUI As Boolean)
    'ici on prend en charge les sauvegardes pour pouvoir gerer l'option IsAddin
    Dim FileSaveName As String, Reponse As VbMsgBoxResult
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    If SaveAsUI = False Then 'sauvegarde direct
        ThisWorkbook.IsAddin = True
        ThisWorkbook.Save
    Else 'sauver sous
        FileSaveName = Application.GetSaveAsFilename(ThisWorkbook.Name)
        If Not FileSaveName = "False" Then 'si l'utilisateur n'a pas utilisé le bouton Cancel
            If Not Dir(FileSaveName) = "" Then 'si le fichier existe deja
                Reponse = MsgBox("le fichier '" & Dir(FileSaveName) & "' existe déjà. voulez-vous remplacer le fichier existant ? ", vbExclamation + vbYesNo)
                If Reponse = vbYes Then
                    ThisWorkbook.IsAddin = True
                    ThisWorkbook.SaveAs Filename:=FileSaveName, AddToMru:=True
                End If
            Else 'si le fichier n'existe pas
                ThisWorkbook.IsAddin = True
                ThisWorkbook.SaveAs Filename:=FileSaveName, AddToMru:=True
            End If
        End If
    End If
    Application.EnableEvents = True
    DoEvents 'on donne les moyens a excel de faire la sauvegarde avant de passer a la suite
    Opening
End Sub
Sub MessageDeLimitation()
    MsgBox "Vos droits sur ce fichier ne vous permettent pas d'acceder à ces fonctions !", vbExclamation
End Sub
Sub ClosingThisFile()
    MyFileIsOpen = False
    ThisWorkbook.Close
End Sub
-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Dans le module de classe nomé ClasseAppli

'Macro Créée par : BigFish (Philippe E)
'Macro Créée par : BigFish (Philippe E)
'le :15-11-2008
'Mis à jour le : 03/09/2010
'V1.2
'
Option Explicit

Public WithEvents XL As Excel.Application
Dim ClassCmdBrBtn() As ClasseCommandeBarBouton, NbButton As Integer
'Permet de vider la classe
Public Sub EmptyClass()
    Dim i As Integer
    For i = 1 To NbButton
        On Error Resume Next
        Set ClassCmdBrBtn(i).BoutonBarre = Nothing
    Next
End Sub
 'Remplissage de la classe
Public Sub InitClass()
    Dim i As Integer, MyCmdBar As CommandBar
    NbButton = Application.CommandBars("Visual Basic").Controls.Count
    'on determine le nombre de bouton et on dimensionne la variable tableau
    ReDim Preserve ClassCmdBrBtn(NbButton)
    'on Ajoute a la classe chaque bouton de la barre Visual Basic
    For i = 1 To NbButton
        Set ClassCmdBrBtn(i) = New ClasseCommandeBarBouton
        Set ClassCmdBrBtn(i).BoutonBarre = Application.CommandBars("Visual Basic").Controls(i)
    Next
End Sub
Private Sub XL_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        'interdit la fermeture de ce classeur ou d'excel tant qu'il est ouvert
        If Wb.Name = ThisWorkbook.Name And MyFileIsOpen = True Then
            Cancel = True
        End If
End Sub
-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Dans le module de classe nomé ClasseCommandeBarBouton

'Macro Créée par : BigFish (Philippe E)
'le :05-11-2008
'V1.1
'
Option Explicit

Public WithEvents BoutonBarre As office.CommandBarButton

Private Sub BoutonBarre_Click(ByVal Ctrl As office.CommandBarButton, CancelDefault As Boolean)
    Select Case Ctrl.Caption
        'Version Anglaise jusqu'a Xl2003
        Case "&Design Mode", "&Visual Basic Editor", "Control T&oolbox", "&Record New Macro...", "&Macros..."
            CancelDefault = True
            Action
            
        'Version Française jusqu'a Xl2003
        Case "Nouv&elle macro...", "&Visual Basic Editor", "&Boîte à outils Contrôles", "Mode &Création"
            CancelDefault = True
            Action
            
        'Version Française A partir de Xl2007
        Case "Mo&de Création"
            CancelDefault = True
            Action
    End Select
End Sub
Sub Action()
    MsgBox "Vos droits sur ce fichier ne vous permettent pas d'acceder à ces fonctions !", vbExclamation
End Sub
-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
Dans le code de la feuille "Sheet1"

'Macro Créée par : BigFish (Philippe E)
'le 03/09/2010
'V1.0
'

'Bouton [Fermer ce fichier] de la feuille "Sheet1"
Private Sub CommandButton1_Click()
    ClosingThisFile
End Sub

Conclusion :


l'avantage dans tout ce que je propose ici, est qu' excel n'est en aucun cas diffèrent tant en apparence que dans son fonctionnement.

Merci de votre visite.

3ddI7IHd

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.