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 VBA pour password sur VBE [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut code VBA pour password sur VBE
    salut à tous,

    petite question TRES simple pour les spécialistes que vous êtes.

    peut-on, via le code VBA, activer/désactiver un mot de passe sur un projet VBA comme on peut le faire manuellement via l'interface?



    pour l'explication:
    -> je voudrais protéger le code pour éviter que n'importe qui aille y farfouiller au risque de supprimer des trucs et faire planter mon appli...

    -> MAIS, comme je génère du code dynamiquement via des fonctions perso, si je protège directement le projet via l'interface, ça plante étant donné que la génération dynamique de code ne marchera pas!

    -> l'idée: gérer l'activation/désactivation à la demande d'un password directement via le code source:
    * enlever le password AVANT un traitement particulier
    * le remettre une fois terminer

    maintenant il y a peut être aussi une autre solution que celle-ci.

    bref, tout avis sera bon à prendre!

    merci.
    @+

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    J'ai parcouru un peu internet. Apparemment, tu ne peux le faire qu'en utilisant SendKeys. Voici le code que j'ai trouvé (c'est en anglais, fais attention aux références à ajouter) :

    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
    'need reference To VBA Extensibility 
    'need To make sure that the target project Is the active project 
    Sub test() 
        UnprotectVBProject Workbooks("ABook.xls"), "password" 
    End Sub 
     
    Sub UnprotectVBProject(WB As Workbook, ByVal Password As String) 
        ' 
        ' Bill Manville, 29-Jan-2000 
        ' 
        Dim VBP As VBProject, oWin As VBIDE.Window 
        Dim wbActive As Workbook 
        Dim i As Integer 
     
        Set VBP = WB.VBProject 
        Set wbActive = ActiveWorkbook 
     
        If VBP.Protection <> vbext_pp_locked Then Exit Sub 
     
        Application.ScreenUpdating = False 
     
        ' Close any code windows To ensure we hit the right project 
        For Each oWin In VBP.VBE.Windows 
            If InStr(oWin.Caption, "(") > 0 Then oWin.Close 
        Next oWin 
     
        WB.Activate 
        ' now use lovely SendKeys To unprotect 
        Application.OnKey "%{F11}" 
        SendKeys "%{F11}%TE" & Password & "~~%{F11}", True 
     
        If VBP.Protection = vbext_pp_locked Then 
            ' failed - maybe wrong password 
            SendKeys "%{F11}%TE", True 
        End If 
     
        ' leave no evidence of the password 
        Password = "" 
        ' go back To the previously active workbook 
        wbActive.Activate 
     
    End Sub 
     
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    Sub ProtectVBProject(WB As Workbook, ByVal Password As String) 
     
        Dim VBP As VBProject, oWin As VBIDE.Window 
        Dim wbActive As Workbook 
        Dim i As Integer 
     
        Set VBP = WB.VBProject 
        Set wbActive = ActiveWorkbook 
     
        ' Close any code windows To ensure we hit the right project 
        For Each oWin In VBP.VBE.Windows 
            If InStr(oWin.Caption, "(") > 0 Then oWin.Close 
        Next oWin 
     
        WB.Activate 
        ' now use lovely SendKeys To unprotect 
        Application.OnKey "%{F11}" 
        SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & Password & "~" 
        Application.VBE.CommandBars(1).FindControl(Id:=2578, recursive:=True).Execute 
        WB.Save 
    End Sub 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Super, merci je testerai ça demain.

    J'ai aussi passé beaucoup de temps à chercher, mais sans résultats probants jusque là.

    Dans tous les cas, je mettrai le post à jour, OK ou KO.


  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, voir ici

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    hello!

    ok, grace aux différentes infos trouvées ici, j'ai trouvé quelque chose me convenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ProtectVBProject(WB As Workbook, ByVal Password As String)
        Dim vbProj As Object
        Set vbProj = WB.VBProject
     
        If vbProj.Protection = 1 Then Exit Sub
        Set Application.VBE.ActiveVBProject = vbProj
     
        Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
        SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & Password & "~", True
     
        WB.Save
    End Sub
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
        Dim vbProj As Object
        Set vbProj = WB.VBProject
     
        If vbProj.Protection <> 1 Then Exit Sub
        Set Application.VBE.ActiveVBProject = vbProj
     
        SendKeys Password & "~~"
        Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
    End Sub
    MAIS, mais mais... ben oui sinon ce ne serait pas drôle...

    1.) pourquoi ProtectVBProject nécessite un save, alors que UnprotectVBProject est efficient immédiatement, sans save?
    -> d'un point de vue logique d'abord
    -> mais surtout aussi parce que le save génère le classique message d'avertissement

    -> pas glop en plein milieu des traitements de mon appli...

    2.) donc peut-on le trapper?
    -> j'ai déjà essayé avec un sendkeys ENTER inefficace (j'ai du me louper dans la syntaxe je suppose!)


  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Est-ce que tu as essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DisplayAlerts = False
    A remettre à True après usage.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    nickel pour l'avertissement!

    par contre, si la dé-protection fonctionne bien, je viens de me rendre compte que la re-protection elle nécessite la fermeture du fichier pour être prise en compte....

    pas gagné...

    c'est ça aussi que j'ai du mal à capter, que dans un sens l'effet soit immédiat et pas dans l'autre.....

    je ne peux pas fermer le fichier en plein milieu de mes traitements.

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok, merci pour la modif du code!

    par contre LA question maintenant :
    -> y a-t-il un moyen de prendre en compte la re-protection sans avoir à fermer le classeur (wb.save & wb.close)?

    chaque pas en avant soulève de nouveaux freins/problèmes...

  9. #9
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,
    Citation Envoyé par steph68b Voir le message
    y a-t-il un moyen de prendre en compte la re-protection sans avoir à fermer le classeur (wb.save & wb.close)?
    Non, que tu protèges le projet manuellement ou par code, la protection ne sera effective qu'à la réouverture du classeur.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    alors c'est mort!
    mais je n'arrive pas à capter POURQUOI la protection nécessite une forcément fermeture alors que la de-protection est immédiatement effective(??????)...........

  11. #11
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par steph68b Voir le message
    mais je n'arrive pas à capter POURQUOI
    Parce que c'est conçu comme ça...
    Il y a-t-il vraiment nécessité de créer du code dynamiquement ? Quel est le but ?
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    suivant qu'il existe déjà ou non, je crée dynamiquement un onglet qui recevra des data, plus:

    -> la sub Worksheet_Change associée à cet onglet (pour un formatage conditionnel)

    -> un bouton de mise en page & sa macro associée

  13. #13
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Si cette feuille que tu ajoutes, tu lui donnes toujours le même nom, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub ajout_feuille()
    Dim NewSh As Worksheet
        Set NewSh = Sheets.Add
        NewSh.Name = "Data"
    End Sub
    tu peux mettre un bout de code "en dur" dans le module ThisWorkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        If ActiveSheet.Name = "Data" Then
            MsgBox "coucou"
        End If
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok, je verrai ça mardi au bureau, si je peux l'appliquer à mon cas.
    merci.

    par contre même si ça fonctionne pour lem format conditionnel, el problème reste le même pour le bouton et sa macro "commandbutton_click" associé...

    bon dimanche.

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok, cela m'a demandé quelques ajustements et des tests supplémentaires mais ça fonctionne bel et bien pour le Worksheet_Change() de l'onglet DATA crée dynamiquement dans le code.


    par contre maintenant le problème reste le même pour générer la macro CommandButton1_Click() qui traite l'action de cliquer sur le bouton que je crée sur cet onglet DATA...

    donc est-il possible d'affecter au bouton de DATA, une macro d'un autre onglet?
    -> je tâtonne
    -> mais je n'ai pas trouvé la bonne instruction pour le moment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub creerBoutonMacro()
     
        'crée le bouton
        Set obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=0.75, Top:=16.5, Width:=146, Height:=24)
        obj.Name = "CommandButton1"
     
        'texte du bouton
        ActiveSheet.OLEObjects("CommandButton1").Object.Caption = "mise en page"
     
        'lier le clic du bouton à Sheets("paramètres").MiseEnPage
        ??????????????
     
    End Sub

  16. #16
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Tu as un exemple de création de feuille avec bouton là --> http://silkyroad.developpez.com/VBA/...icEditor/#LV-A
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    oui c'est exactement ce que j'ai pour le moment MAIS inutilisable dans MON cas avec la problématique du mot de passe (début du post...)

    c'est bien pour cela que je cherche une autre solution...........
    -> encore faut-il que les prop/méthodes de ActiveSheet.OLEObjects(1).Object le permettent!

    -> ce qui est toute la question puisque je ne trouve pas de liste en ligne

  18. #18
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Désolé mais tu ne trouveras pas d'autre solution, un contrôle créé dynamiquement impose que l'on crée également dynamiquement son code et le problème de mot de passe est incontournable.

    Seule solution est de repenser le projet autrement, au lieu d'insérer les contrôles sur une feuille, tu crées dynamiquement une barre de menu sur laquelle tu insères le(s) bouton(s) et ces boutons là ont une propriété "OnAction" qui permet d'exécuter une macro existante. A la fermeture du classeur on peut supprimer cette barre de menu.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  19. #19
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  20. #20
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    un truc étrange: en consultant l'aide d'excel sur OnAction je suis tombé là dessus:
    OnAction, propriété

    Voir*aussiS'applique*àExempleDétails

    Cette propriété renvoie ou définit le nom d'une macro exécutée quand l'objet spécifié est sélectionné. Type de données String en lecture-écriture.

    Note

    Définir cette propriété pour un élément de menu remplace toutes les informations d'aide personnalisées de cet élément par les informations de la macro assignée.

    Exemple

    Cet exemple montre comment paramétrer Microsoft*Excel pour qu'il exécute la procédure ShapeClick chaque fois que la forme*1 est sélectionnée.

    Worksheets(1).Shapes(1).OnAction = "ShapeClick"
    ce qui laisserait penser que finalement c'est faisable puisque là on affecte bien une fct (peu importe laquelle) à un shape (un bouton dans mon cas)

    problème: ce joli exemple, pourtant fourni, ne fonctionne pas.......

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [AC-2010] Erreur sur Code VBA pour enregistrement d'un document publiposté word
    Par AudREN dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/09/2014, 13h22
  2. Réponses: 6
    Dernier message: 18/11/2013, 17h48
  3. Code vba pour ouverture en mode calcul sur ordre
    Par ciambe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/05/2013, 13h01
  4. [XL-2010] Code VBA pour trier sur combobox
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2011, 17h56
  5. [XL-2007] code vba pour cliquer sur un bouton dans internet explorer
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/01/2011, 20h21

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