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 :

Ma macro peut elle poser des problemes sur les fonction de partage?


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut Ma macro peut elle poser des problemes sur les fonction de partage?
    Bonjour,

    Je ne sais pas trop ou poster ma demande.
    Il s'agit de VBA pour libre office...
    J'ai peur que mon post tombe aux oubliettes dans Libroffice car j'ai supposé le forum moins axé sur le VBA...
    D’avance mes excuses aux modérateurs pour l'insolence de mon initiative!

    Voilà j'avais le soucis de devoir protéger et déprotéger une feuille du tableur sans avoir à enlever le partage du fichier.
    Cela ne se fait que par macro...
    J'ai donc ma macro qui fonctionne parfaitement mais avant de la mettre en service auprès de mes collègues, je voudrais m'assurer qu'elle n'impactera pas le fichier.
    A savoir que les fonctions de partage ne seront pas altérées par cette macro...
    Par exemple, les utilisateurs pourront ils toujours modifier de leurs côtés et sauvegarder....

    Je précise que j'ai mis un decalage sur le mot de passe pour ne pas qu'il soit lisible par des novices qui iraient voir la macro...
    Pas optimal comme solution mais, je n'ai pas trouvé mieux...
    Pouvez vous me dire si mon code vous parait bon et non bloquant sur les fonctions de partage je vous prie?
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Sub protege()
        Dim oSheet As Object
        Dim sPassword As String
     
        ' Mot de passe (utilise un décalage de caractères)
        sPassword = "fxjjekr"
        sPassword = DecaleMotDePasse(sPassword, -2)
     
        ' Accède à la feuille spécifique 
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Masquer les colonnes F à M 
        Dim i As Integer
        For i = 5 To 12 ' Index des colonnes F à M
            oSheet.getColumns().getByIndex(i).IsVisible = False
        Next i
     
        ' Si la feuille n'est pas protégée, applique la protection
        If Not oSheet.IsProtected Then
            oSheet.Protect(sPassword)
            MsgBox "Feuille1 verrouillé!"
        Else
            MsgBox "La feuille Feuille1 est déjà protégée."
        End If
    End Sub
     
    Sub deprotege()
        Dim oSheet As Object
        Dim sPassword As String
     
        ' Accède à la feuille spécifique 
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Si la feuille est protégée
        If oSheet.IsProtected Then
            ' Demande à l'utilisateur d'entrer le mot de passe
            sPassword = InputBox("Saisir le mot de passe:")
     
            ' Vérifie si le mot de passe est vide
            If sPassword = "" Then
                MsgBox "Le mot de passe ne peut pas être vide.", vbExclamation
                Exit Sub
            End If
     
            ' Essaye de déprotéger la feuille avec le mot de passe fourni
            On Error GoTo ErreurMotDePasse
            oSheet.Unprotect(sPassword)
     
            ' Afficher les colonnes F à M
            Dim i As Integer
            For i = 5 To 12 ' Index des colonnes F à M
                oSheet.getColumns().getByIndex(i).IsVisible = True
            Next i
     
     
        Else
            MsgBox "La feuille n'est pas protégée."
        End If
     
        Exit Sub
     
    ErreurMotDePasse:
        MsgBox "Mot de passe incorrect.", vbCritical
    End Sub
     
    ' Fonction pour décaler les lettres du mot de passe
    Function DecaleMotDePasse(mdp As String, decalage As Integer) As String
        Dim i As Integer
        Dim resultat As String
        Dim c As String
     
        resultat = ""
     
        ' Boucle sur chaque caractère du mot de passe
        For i = 1 To Len(mdp)
            c = Mid(mdp, i, 1)
            ' Décale chaque lettre dans l'alphabet
            resultat = resultat & Chr(Asc(c) + decalage)
        Next i
     
        DecaleMotDePasse = resultat
    End Function

  2. #2
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Bonjour,
    Bon je ne connais pas VBA pour Libre Office mais je me pose la question : Pourquoi inscrire un mot de passe ? le passer à la moulinette pour ensuite se servir de la gestion d'erreur pour voir si le mot de passe est bon.

  3. #3
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Bonjour Valtrase,
    Ce n'est pas tout à fait le sujet de ma question mais pour répondre à ta question, le fichier est partagé. Les utilisateurs n' ont pas tous les mêmes droits sur les feuilles... D'où le mot de passe...

  4. #4
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Re,
    Nous ne sommes pas sur la même longueur d'onde...
    Dans la procédure Protéger, vous définissez un mot de passe (crypté sommairement). Puis juste dessous vous lancer la procédure pour le décrypter, on peut faire mieux en soit, mais bon.
    Le problème c'est que dans la procédure décrypter, vous ne comparez pas le mot de passe entré avec celui enregistré. D'où ma remarque.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 473
    Par défaut
    Salut,

    Ton code présente plusieurs problèmes.
    1) Il ne fait pas ce qu'il annonce et ne respecte pas le SRP: https://en.wikipedia.org/wiki/Single...lity_principle
    2) Il est bavard, l'utilisateur saura ce qu'il s'est passé (ça lui fera une belle jambe), mais pas le programme lui même.
    3) En cas d'appel en boucle, ca fera autant de messages. du point de vue utilisateur c'est vite lourdingue. Ca fera un utilisateur pas content (Revoie ta copie, ou ton truc va à la poubelle).

    En cas d'erreur, tu as 2 possibilités:
    1) Traiter l'erreur afin de reprendre une exécution normale.
    2) Si l'erreur n'est pas traitable (un message n'est pas un traitement d'erreur), informer la fonction appelante qu'il y a eut un problème.
    Tu as 2 options:
    a) Renvoyer une code retour.
    b) Escalader l'erreur afin que la fonction appelante aie une chance de la traiter.

    Eventuellement, l'erreur remonte jusqu'à la fonction au sommet de la pile des appels, c'est à elle et à elle seule qu'incombe le devoir d'informer l'utilisateur (typiquement: Les gestionnaires d'évènement).

  6. #6
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Je vous remercie grandement pour vos explications.
    Pour le mot de passe, je vais chercher une meilleure solution en effet.
    @Deedolith
    Ta réponse est très formatrice pour moi et enthousiasmante...
    Je vais parfaire tout ça après quelques recherches et si vous voulez bien, je vous représenterais mon projet...

  7. #7
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Bonsoir,

    J'ai positionné les fonctions en début de code en les extrayant de sub...
    J'espère avoir bien organisé toute cela.
    Concernant le bavardage, je l'ai allégé.
    Il faut savoir que mon code ne servira que sur la Feuille1.
    Enfin, pour le mot de passe.
    Je me suis renseigné, il existe des moyens de crypter le mdp semble t il.
    Pour autant ca ferait appel à des bibliothèques qui pourraient ne pas être sur tous les pc si j'ai bien compris...
    Ce n'est donc pas la bonne solution à priori dans mon cas...
    Que pensez vous de tout cela?
    Je vous remercie.


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    ' Fonction pour masquer les colonnes F à M
    Sub MasqueColonnes(oSheet As Object)
        Dim i As Integer
        For i = 5 To 12
            oSheet.getColumns().getByIndex(i).IsVisible = False
        Next i
    End Sub
     
    ' Fonction pour afficher les colonnes F à M
    Sub AfficheColonnes(oSheet As Object)
        Dim i As Integer
        For i = 5 To 12
            oSheet.getColumns().getByIndex(i).IsVisible = True
        Next i
    End Sub
     
    ' Fonction pour décaler les lettres du mot de passe
    Function DecaleMotDePasse(mdp As String, decalage As Integer) As String
        Dim i As Integer
        Dim resultat As String
        Dim c As String
     
        resultat = ""
     
        ' Décaler chaque caractère du mot de passe
        For i = 1 To Len(mdp)
            c = Mid(mdp, i, 1)
            resultat = resultat & Chr(Asc(c) + decalage)
        Next i
     
        DecaleMotDePasse = resultat
    End Function
     
    Sub protege()
        Dim oSheet As Object
        Dim sPassword As String
     
        ' Mot de passe crypté (utilise un décalage de caractères)
        sPassword = "afsref"
        sPassword = DecaleMotDePasse(sPassword, -2)
     
        ' Accéder à la feuille spécifique 
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Masquer les colonnes F à M (index 5 à 12)
        MasqueColonnes oSheet
     
        ' Appliquer la protection si la feuille n'est pas protégée
        If Not oSheet.IsProtected Then
            oSheet.Protect(sPassword)
     
        Else
            MsgBox "La feuille est déjà protégée."
        End If
    End Sub
     
    Sub deprotege()
        Dim oSheet As Object
        Dim sPassword As String
        Dim sStoredPassword As String
     
        ' Mot de passe crypté (décodé)
        sStoredPassword = DecaleMotDePasse("afsref", -2)
     
        ' Accéder à la feuille spécifique 
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Vérifier si la feuille est protégée
        If oSheet.IsProtected Then
            ' Demander à l'utilisateur d'entrer le mot de passe
            sPassword = InputBox("Mot de passe:")
     
            ' Vérifier si le mot de passe est vide
            If sPassword = "" Then
                MsgBox "Le mot de passe ne peut pas être vide.", vbExclamation
                Exit Sub
            End If
     
            ' Comparer le mot de passe saisi avec celui enregistré
            If sPassword = sStoredPassword Then
                ' Essayer de déprotéger la feuille
                On Error GoTo ErreurMotDePasse
                oSheet.Unprotect(sPassword)
     
                ' Rendre visibles les colonnes F à M
                AfficheColonnes oSheet
     
            Else
                MsgBox "Mot de passe incorrect.", vbCritical
            End If
        Else
            MsgBox "La feuille n'est pas protégée."
        End If
     
        Exit Sub
     
    ErreurMotDePasse:
        MsgBox "Erreur lors de la tentative de déprotection.", vbCritical
    End Sub
    [EDIT]
    Ma maigre experience du codage fait que je n'ai peut être pas su comprendre ou exploiter tous vos conseils...
    J'espère avoir tout de même avancé.
    Et côté fonctions de partage?
    Pas d incompatibilités??

  8. #8
    Membre Expert Avatar de Nain porte koi
    Homme Profil pro
    peu importe
    Inscrit en
    Novembre 2023
    Messages
    1 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : peu importe

    Informations forums :
    Inscription : Novembre 2023
    Messages : 1 120
    Par défaut
    Hello,

    Citation Envoyé par benjea06 Voir le message
    J'ai donc ma macro qui fonctionne parfaitement mais avant de la mettre en service auprès de mes collègues, je voudrais m'assurer qu'elle n'impactera pas le fichier.
    A savoir que les fonctions de partage ne seront pas altérées par cette macro...
    Par exemple, les utilisateurs pourront ils toujours modifier de leurs côtés et sauvegarder....
    Pour répondre à cette partie il faudrait tester, donc avoir libre office, un environnement réseau et être au moins 2 à ouvrir le fichier.
    Je ne suis pas sûr que les personnes qui répondent ici aient cet environnement

  9. #9
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Bonjour,
    Oui on avance,
    Pour encore plus sécuriser le mot de passe il serait préférable de le déclarer en tête d'un autre module en constante publique. Avec un autre nom exemple en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const CONTRASENA As String = "afsref"

    Ensuite la procédure DecaleMotDePasse doit porter un autre nom.

    On ne voit pas l'ensemble du classeur.
    Comment est appelée la procédure deproteger ?
    Je demande cela car que se passe t-il si l'utilisateur entre un mot de passe erroné ? Une message box s'affiche , mais après ?
    Pour moi i-y-a un bug ici, il faut, inclure une boucle, soit dans la procédure deproteger, soit dans la procédure qui appelle cette procédure.

    De plus il est conseillé de découper le code en petites fonctions c'est plus lisible. exemple une fonction qui demande le mot de passe et vérifie celui-ci (Renvoie le mot de passe si ok, sinon False si pas bon ou si l'utilisateur a cliqué sur le bouton annuler)
    Les procédures AfficheColonnes et MasqueColonnes peuvent être rassemblées en une seule.

  10. #10
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Erreur de saisie..désolé.

  11. #11
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Bonsoir,
    merci pour ces informations.
    J'ai donc mis le mot de passe dans un autre module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Gestion du code...
    Public Const CODE As String = "afsref"
    Le code a été modifié pour séquencer les fonctions comme vous l'avez évoqué et j'ai regroupé le masquage et démasquage...
    J'ai remplacé le libellé "MotDePasse" par "Code" dans les libellés et dans le codage.
    Il reste présent bien sur dans les msgbox...

    Concernant l'appel du mot de passe.
    Il y a 2 boutons dans la Feuille1 Bouton Protéger et Bouton Déprotéger.
    Ils ne peuvent être lancés que dans la feuille.
    En effet, si on saisit un mauvais mot de passe, on sort de la procédure.
    Ce sera à l'utilisateur de ressaisir le mot de passe après clic sur le bouton déprotéger...
    Ils seront 2, au pire je les informe et ça ira je pense.
    Dites moi que c'est bon!!!!


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    ' Fonction pour afficher ou masquer les colonnes F à N
    Sub GererColonnes(oSheet As Object, action As String)
        Dim i As Integer
        Dim estVisible As Boolean
     
        ' Définir l'action en fonction de l'argument
        If action = "masquer" Then
            estVisible = False
        ElseIf action = "afficher" Then
            estVisible = True
        End If
     
        ' Gérer la visibilité des colonnes F à N (index 5 à 13)
        For i = 5 To 13
            oSheet.getColumns().getByIndex(i).IsVisible = estVisible
        Next i
    End Sub
     
    ' Fonction pour décaler le code
    Function DecaleCode(mdp As String, decalage As Integer) As String
        Dim i As Integer
        Dim resultat As String
        Dim c As String
     
        resultat = ""
     
        ' Décaler chaque caractère du code
        For i = 1 To Len(mdp)
            c = Mid(mdp, i, 1)
            resultat = resultat & Chr(Asc(c) + decalage)
        Next i
     
        DecaleCode = resultat
    End Function
     
    ' Fonction pour demander et vérifier le Code
    Function DemanderCode(storedCode As String) As Variant
        Dim sCode As String
     
        sCode = InputBox("Entrez le mot de passe:")
     
        If sCode = "" Then
            MsgBox "Le mot de passe ne peut pas être vide.", vbExclamation
            DemanderCode = False
            Exit Function
        End If
     
        If sCode = storedCode Then
            DemanderCode = sCode
        Else
            MsgBox "Mot de passe incorrect.", vbCritical
            DemanderCode = False
        End If
    End Function
     
    Sub protege()
        Dim oSheet As Object
        Dim sCode As String
     
        ' Utiliser la constante publique et la fonction pour décoder le Code
        sCode = DecaleCode(CODE, -2)
     
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Masquer les colonnes F à N
        GererColonnes oSheet, "masquer"
     
        ' Protéger la feuille si elle n'est pas déjà protégée
        If Not oSheet.IsProtected Then
            oSheet.Protect(sCode)
        Else
            MsgBox "La feuille est déjà protégée!"
        End If
    End Sub
     
    Sub deprotege()
        Dim oSheet As Object
        Dim sStoredCode As String
        Dim sCode As Variant
     
        ' Utiliser la constante publique pour décoder le Code
        sStoredCode = DecaleCode(CODE, -2)
     
        oSheet = ThisComponent.Sheets.getByName("Feuille1")
     
        ' Vérifier si la feuille est protégée
        If oSheet.IsProtected Then
            ' Demander et vérifier le Code
            sCode = DemanderCode(sStoredCode)
     
            If sCode <> False Then
                On Error GoTo ErreurCode
                oSheet.Unprotect(sCode)
                GererColonnes oSheet, "afficher"           
            End If
        Else
            MsgBox "La feuille n'est pas protégée."
        End If
     
        Exit Sub
     
    ErreurCode:
        MsgBox "Erreur lors de la tentative de déprotection.", vbCritical
    End Sub

  12. #12
    Membre confirmé
    Homme Profil pro
    call center
    Inscrit en
    Janvier 2014
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : call center
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2014
    Messages : 225
    Par défaut
    Merci encore pour vos réponses.

    Concernant ma demande initiale,
    J'ai mis en place la macro, elle fonctionne parfaitement et permet de supprimer la protection d'un onglet sans avoir à ôter le partage de fichier.
    A signaler tout de même que sur les anciennes versions de Calc, si on lance la macro de déprotection de l'onglet, le symbole cadenas ne disparait pas si la protection a été mise en amont manuellement avant la macro.
    Il n'apparaitra pas plus avec la macro s'il la protection n'avait pas été mise...
    Aucun impact sauf visuel...

  13. #13
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Bonjour,
    On avance, on avance...
    Evitons si l'on peut les Exit Sub, Exit Fonctions qui peuvent être remplacés par un If Else End If.
    Prendre l'habitude de déclarer explicitement les procédures et fonctions
    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
    ' Fonction pour demander et vérifier le Code
    Public Function DemanderCode(ByVal storedCode As String) As Variant
        Dim sCode As String
        sCode = InputBox("Entrez le mot de passe:")
     
        If sCode > vbNullString Then
            'TODO: storedCode peut être une fonction pour éviter les déclarations publiques
            If sCode = storedCode Then
                DemanderCode = sCode
            Else
                MsgBox "Mot de passe incorrect.", vbCritical
                DemanderCode = False
            End If
        Else
            MsgBox "Le mot de passe ne peut pas être vide.", vbExclamation
            DemanderCode = False
    '        Exit Function
        End If
    End Function
    Pour éviter les appels aux Méthodes Protect et UnProtect le mieux est de protéger les feuilles à l'ouverture du classeur en utilisant le paramètre UserInterfaceOnly ce qui permet au code d'accéder aux feuilles même protégées.
    Voici un exemple de procédure qui peut être appelée depuis la procédure Workbook_Open :
    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
    '@Description "Protection des feuilles système."
    Public Sub setSheetsProtection(Optional ByRef oWorkbook As Excel.Workbook)
        Const SYSTEM_SHEETS_PREFIX As String = "sys_" ' // A adapter.
     
        Dim localWorkbook As Excel.Workbook
        Set localWorkbook = oWorkbook
        If localWorkbook Is Nothing Then Set localWorkbook = ThisWorkbook
     
        Dim itemSheet As Object
        For Each itemSheet In localWorkbook.Sheets
            ' // Si la feuille est une feuille système
            If itemSheet.CodeName Like SYSTEM_SHEETS_PREFIX & "*" Then
                With itemSheet
                'TODO: Remplacer MY_CODE par une fonction
                    .Protect MY_CODE, UserInterfaceOnly:=True
                    .Visible = xlSheetVeryHidden
                End With
            End If
        Next
    End Sub
    Attention au codage : Dans la procédure GererLesColonnes, si pour le paramètre action on renseigne "Masquer" cela va donner un résultat inattendu.
    En effet le signe = recherche une correspondance exacte dans : If action = "masquer" Then

    Un peu plus bas nous avons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ' Gérer la visibilité des colonnes F à N (index 5 à 13)
        For i = 5 To 13
            oSheet.getColumns().getByIndex(i).isVisible = estVisible
        Next i
    Cela fait beaucoup de fonctions à mon goût. Un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With CodeNameDeLaFeuille ' // choisir la feuille par son codename
            .Columns("E:M").Hidden = estVisible
        End With
    Bonne programmation...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 42
    Dernier message: 27/11/2017, 06h36
  2. Réponses: 0
    Dernier message: 18/02/2016, 13h06
  3. Réponses: 2
    Dernier message: 11/02/2011, 15h04
  4. [VBOs] Des problèmes sur les cartes ATI?
    Par ShevchenKik dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/12/2008, 12h20
  5. Réponses: 19
    Dernier message: 18/10/2006, 11h47

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