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 :

code retour de Unprotect [XL-2002]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut code retour de Unprotect
    bonjour,

    J'utilise la méthode unprotect\protect pour ouvrir des classeurs Excel situé dans une arborescence.
    je souhaiterai pouvoir récupérer le code retour dans le cas ou le mot de passe est faux, afficher le nom du classeur associé à l'erreur et proposer la saisie d'un nouveau mot de passe.

    merci pour toutes vos suggestions

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste avec le code suivant à copier dans un module standard.
    Adaptez, à votre usage, les constantes cernées par des ###
    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
     
    '### Constantes à adapter ###
    Const FILE_OPEN As String = "c:\test unprotect.xls"
    Const NB_ESSAI As Long = 3
    '############################
     
    Sub Launch()
    Dim MotPasse As String
    MotPasse = "faux mot de passe"  'dans l'exemple, le mot de passe est "zaza"
    Call DemandePassword(FILE_OPEN, MotPasse)
    End Sub
     
    Sub DemandePassword(FileOpen As String, PassWord As String)
    Dim WB As Workbook
    Dim NbPasse&
    Dim i&
    Dim A$
    Set WB = Workbooks.Open(FileOpen)
    If WB.ProtectWindows Or WB.ProtectStructure Then
      On Error Resume Next
      WB.Unprotect (PassWord)
        If Err.Number = 1004 Then
          For i& = NB_ESSAI To 1 Step -1
            Err.Clear
            If i& = 1 Then
              A$ = "Il ne vous reste qu'une tentative. "
            Else
              A$ = "Il vous reste " & i& & " tentatives. "
            End If
            PassWord = Application.InputBox( _
              prompt:="Le mot de passe saisi n'est pas valide." & vbCrLf & vbCrLf & _
                  A$ & "Veuillez le saisir à nouveau.", _
              Title:="Mot de passe incorrect.")
            WB.Unprotect (PassWord)
            If Err = 0 Then Exit For
          Next i&
        End If
      If Err <> 0 Then Exit Sub
    End If
    End Sub
    Mettez le classeur "test unprotect.xls" de l'exemple ci-joint dans C:
    Lancez la macro "Launch".

    Cordialement.

    PMO
    Patrick Morange

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut Gestion mot de passe
    bonjour PMO2017

    Merci pour votre code, je souhaiterai adapter le code pour afficher dans le message de mot de passe le nom du fichier (je travaille au niveau du répertoire) de plus je dois récupérer le mot de passe valide pour reprotéger le document à la fin de mon traitement.

    merci pour vos suggestions

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour réaliser ce que tu veux je passerais par les collections en associant mot de passe et nom de classeur.
    Pour la proposition d'un nouveau mot de passe en cas d'erreur, une simple boucle Tant que Mot de passe pas bon on propose une nouvelle saisie ou un abandon pur et simple. Pour la saisie d'un mot de passe tu as de nombreux exemples sur le forum et dans la FAQ. Je viens de retrouver ça.
    Pour les collections, si tu as besoin d'explication, tu dis.
    A+

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut Présentation collection
    bonjour ouskel'n'or

    je suis preneur pour une explication des collections en vue d'avancer sur mon souci.

    Cordialement

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour le principe
    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
    Sub Test()
    Dim Collect as New Collection, NomFich as String, rep as String
    Dim MotDePasse as String, i as Byte 'etc.
        rep = "D:\Classeurs\"
        NomFich = Dir(rep & "*.xls")
        Do While NomFich <> ""
            Workbooks.Open Ret & NomFich
            'appel de l'userform Logon par exemple
            'MotDePasse = InputBox("Mot de Passe") -> Récup du mot de passe
            Collect.Add MotDePasse, NomFich
            NomFich = Dir
        Loop
     
        'Récupération du mot de passe de chaque classeur pour rétablir la protection :
        For i = 1 To Application.Workbooks.Count
            NomDuClasseur = Workbooks(i).Name
            MotDePasse = Collect(NomDuClasseur)
            'Workbooks (NomDuClasseur).Protect... etc
        Next
    End Sub
    Toujours pour le principe, un exemple de récupération des objets de la collection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub UserDuneCollection()
     Dim Collect  As New Collection
        ' Remplit la collection
        Collect.Add "Et alors ? ", "Un"
        Collect.Add "C'est ", "Deux"
        Collect.Add "quoi ", "trois"
        Collect.Add "ton problème ?", "Quatre"
        'Affichage
        MsgBox Collect("Un") & Collect("Deux") & Collect("trois") & Collect("Quatre")
    End Sub
    Tu sauras adapter ?
    A+

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour tous,
    Une autres approche pour gérer des codes passes;
    Je ne peu pas mettre le classeur en pièce jointe, il est trop volumineux.
    mais il est sur ce lien
    Il est peut-être un peu trop complet mais à toi de voir.
    A+

  8. #8
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut unprotect
    j'aurai besoin de quelques précisions:

    serait il possible d'avoir une explication sur:
    " l'appel de l'userform Logon "

    La collection crée permet de stocker uniquement sur deux colonnes en mémoire?
    Cordialement

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le fichier "Logon.xls" n'est pas protégé. Tu retrouves le code dans l'éditeur VB.

    Comme je ne connais pas le but de la déprotection (déprotection par un utilisateur autorisé ou nécessité d'une modification du classeur par macro) il est difficile de t'aider plus...
    Pour les collections, je suppose que tu veux parler de dimensions ainsi qu'on les rencontre dans les tableaux... En effet, une collection ne concerne que des objets indexés dont les index sont des strings.
    Par contre, ces objets peuvent être des concaténations formatés de strings (un séparateur fait l'affaire, ici le point-virgule)
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Collect as new collection, i as byte, lemot as string, tablo as variant
        lemot = "coucou; " & "c'est; " & "moi; " & "avec; " & "mes; " & "gros; " & "sabots"
        Collect.add LeMot, "un"
     
        'récupération des strings concaténés
        Tablo = split(Collect("un"),";")
        For i = 1 to ubound(Tablo)
             msgbox tablo(i)
        next

  10. #10
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut unprotect
    je n'ai pas de fichiers logon.xls(excel 2002).
    le but de la déprotection est de lancer un programme pour modification des données des fichiers xls puis de reprotéger les classeurs avant fermeture de ces derniers.

    Cordialement

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu connais donc les mots de passe de tous les classeurs et tu veux que la macro déprotège les classeurs afin d'effectuer les modifs sans intervention de l'utilisateur ?
    Si c'est ça, alors c'est beaucoup plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Proteger()
        ActiveWorkbook.Protect Password:="blabla" ', Structure:=True, Windows:=False
    End Sub
     
    Sub Deproteger()
        ActiveWorkbook.Unprotect "blabla"
    End Sub
    Mais si ce n'est pas ça essaie d'être clair.
    Pour les mots de passe, si tu dois les mettre en clair dans la procédure, alors protège également le code -> Dans l'éditeur VB -> Outils -> Propriété de VBAProject -> Onglet Protection
    Ce n'est pas terrible comme protection mais c'est mieux que rien
    A+

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

Discussions similaires

  1. Execution programme et récupération du code retour
    Par Dr_GonZO dans le forum Langage
    Réponses: 5
    Dernier message: 12/07/2005, 15h20
  2. Récupérer le code retour d'un batch
    Par mick84m dans le forum Linux
    Réponses: 4
    Dernier message: 11/05/2005, 17h09
  3. CODE RETOUR GENERE PAR PL/SQL POUR SHELL UNIX
    Par mimi_été dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/11/2004, 08h32
  4. code retour UNIX sur erreur ORA
    Par vinz_07 dans le forum Administration
    Réponses: 7
    Dernier message: 25/08/2004, 11h04
  5. [commande DOS] Récupérer le code retour d'un programme
    Par bobunny dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 04/06/2004, 15h51

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