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

Word Discussion :

Verrouiller un menu déroulant Word


Sujet :

Word

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Verrouiller un menu déroulant Word
    Bonjour,

    On me demande de créer un formulaire incluant des menus déroulant. Toutefois ces menus ne doivent être modifiable (sélectionner une valeur) que par ma direction et pas par les destinataires. Mes menus déroulants sont inséré et mon document est protégé. Tout fonctionne.

    Mais comment faire en sorte que seul moi ou un collègue puisse sélectionner une valeur dans le menu déroulant.

    Comment?

    Merci,

    François Racine

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Malheureusement, un formulaire reste un formulaire.

    Pour que seules deux personnes puissent attribuer une valeur, je pense qu'il faut créer un nouveau document pour figer les choix dans le texte et plus dans une liste.

    Et pour cette manipulation seul le VBA fera l'affaire.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Salut,

    Malheureusement, un formulaire reste un formulaire.

    Pour que seules deux personnes puissent attribuer une valeur, je pense qu'il faut créer un nouveau document pour figer les choix dans le texte et plus dans une liste.

    Et pour cette manipulation seul le VBA fera l'affaire.
    Bonjour,

    Est-ce qu'en VBA, je pourrais forcer un "mot de passe" ce qui empêcherait de modifier la valeur du menu déroulant par n'importe qui?

    Si oui, avez-vous une suggestion pour m'orienter?

    Merci,

    François Racine

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    On peut verrouiller le déroulant en VBA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.FormFields(1).Enabled = False
    Mais ce serait sans mot de passe, sachant qu'un mot de passe doit être utilisé pour verrouiller le formulaire.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Salut,

    On peut verrouiller le déroulant en VBA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.FormFields(1).Enabled = False
    Mais ce serait sans mot de passe, sachant qu'un mot de passe doit être utilisé pour verrouiller le formulaire.
    Ne pourrait-on faire en sorte que lorsqu'un utilisateur sélectionnerait le menu, un vba demanderait un mot de passe bidon?

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    On peut le faire.

    Il faut stocker la valeur du contrôle et la restituer si le mot de passe n'est pas bon.

    C'est sur la récupération que je rencontre un problème, la nuit porte conseil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MotDePasse()
    Dim stTemp As String
    stTemp = ActiveDocument.FormFields(1).Result
    Debug.Print stTemp
    If InputBox("Introduisez votre mot de passe !") <> "Moi" Then
    ActiveDocument.FormFields(1).Result = stTemp
    ActiveDocument.FormFields(2).Select
    ActiveDocument.FormFields(1).Enabled = False
    Debug.Print stTemp
    End If
    End Sub
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Salut,

    On peut le faire.

    Il faut stocker la valeur du contrôle et la restituer si le mot de passe n'est pas bon.

    C'est sur la récupération que je rencontre un problème, la nuit porte conseil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MotDePasse()
    Dim stTemp As String
    stTemp = ActiveDocument.FormFields(1).Result
    Debug.Print stTemp
    If InputBox("Introduisez votre mot de passe !") <> "Moi" Then
    ActiveDocument.FormFields(1).Result = stTemp
    ActiveDocument.FormFields(2).Select
    ActiveDocument.FormFields(1).Enabled = False
    Debug.Print stTemp
    End If
    End Sub
    Intéressant. J'attend de tes nouvelles.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    [QUOTE=Heureux-oli;7589280]Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [Sub MotDePasse()
    Dim stTemp As String
    stTemp = ActiveDocument.FormFields(2).Result
    Debug.Print stTemp
    If InputBox("Introduisez votre mot de passe !") <> "Moi" Then
    ActiveDocument.FormFields(2).Result = stTemp
    ActiveDocument.FormFields(2).Select
    ActiveDocument.FormFields(2).Enabled = False
    Debug.Print stTemp
    End If
    End Sub
    J'ai testé cette macro et je note trois problématiques.
    1. La valeur de départ n'est pas stocké mais seulement la valeur sélectionnée
    2. J'ai plus d'un formfield et je ne parviens pas à coder comment déterminer le nom ou le no du formfield qui aura déclenché la macro.
    3. J'ai testé ta macro en sortie du menu déroulant mais il semble que celle-ci ne se déclenche que lorsque le focus du menu déroulant est perdu.

    C'est un beau cas mais complexe. SVP ne me lâche pas.

    Merci,

    François Racine

  9. #9
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'étais parti du principe que la macro serait déclenchée à l'entrée du contrôle, mais c'est la nouvelle valeur qui est prise en compte.

    Il faut donc une autre macro pour stocker cette valeur dans une propriété du document.

    Pour le FormField, le nom à utiliser est le nom du signet qu'il reçoit ou qu'on lui donne à la création.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Citation Envoyé par Heureux-oli Voir le message
    Salut,

    J'étais parti du principe que la macro serait déclenchée à l'entrée du contrôle, mais c'est la nouvelle valeur qui est prise en compte.

    Il faut donc une autre macro pour stocker cette valeur dans une propriété du document.

    Pour le FormField, le nom à utiliser est le nom du signet qu'il reçoit ou qu'on lui donne à la création.
    J'ai finalement progressé.

    La routine plus bas est exécuté au démarrage de Word:
    Elle énumère toutes les valeurs par défaut et les sauvegardes dans un fichier texte.
    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
    Sub autoopen()
    Dim Arrdefaut() As String
    Dim N As String
    Dim StrTemp As String
    Dim strfichier As String
    Dim StrNomauLong As String
    Dim TestFichierexiste As Boolean
    Dim Fichierexiste As Object
    Dim fso As Object
    'Dim stream
    'Dim aFile As TextStream
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    i = 1
    N = 0
    StrTemp = Environ("temp") 'Pour obtenir la variable d'environnement Temp
    strfichier = "Reddition.txt" 'Nom du fichier qui contiendra les variables de base
    StrNomauLong = StrTemp & "\" & strfichier 'Nom du fichier avec le chemin
    Set Fichierexiste = CreateObject("Scripting.FileSystemObject")
    TestFichierexiste = Fichierexiste.FileExists(StrNomauLong) 'Test de l'existence du fichier
    If TestFichierexiste Then SupprimeFichier (StrNomauLong) 'Si le fichier existe alors on le supprime.
     
    Set aFile = fso.CreateTextFile(StrNomauLong, True)
     
     
    'On définit la taille du tableau
    For Each afield In ActiveDocument.FormFields
        If afield.Type = wdFieldFormDropDown Then
            N = N + 1 'On compte les menu déroulants
            'Tableau à 2 dimensions
            ReDim Arrdefaut(1 To N, 1 To 2) As String
        End If
    Next afield
    'On alimente le tableau
    N = 0
    For Each afield In ActiveDocument.FormFields
        If afield.Type = wdFieldFormDropDown Then
            N = N + 1 'On compte les menu déroulants
            Arrdefaut(N, 1) = afield.Name 'Inscrit le nom du champs dans un tableau
            Arrdefaut(N, 2) = afield.Result 'Inscrit le résultat du champs dans un tableau
     
            aFile.write (N) 'Inscrit le no de la première ligne du tableau dans un fichier texte
            aFile.write (",") 'Inscrit une virgule dans un fichier texte
            aFile.write (afield.Name) 'Inscrit le nom du tableau déroulant dans un fichier texte
            aFile.write (";") 'Inscrit une virgule dans un fichier texte
            aFile.write (afield.Result) 'Inscrit la valeur initiale du menu déroulant dans un fichier texte
     
            aFile.WriteLine 'Ajoute un retour de chariot dans un fichier texte
     
        End If
    Next afield
     
    aFile.Close
     
    'MsgBox "There are " & N & " Drop down menu in this document"
    'ActiveDocument.SaveAs FileName:=StrNomauLong, FileFormat:=wdFormatText 'Sauvegarde du fichier
     
    End Sub

    Cette routine valide la valeur sélectionnée dans le menu déroulant et la compare à celle sauvegardé précédemment.
    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
    Sub MotDePasse()
     
    Dim stTemp As String
    Dim StrTemp As String
    Dim strfichier As String
    Dim StrNomauLong As String
    Dim TestFichierexiste As Boolean
    Dim Fichierexiste As Object
    Dim fso As Object
    Dim NomListe As String
    Dim StrLine As String
    Dim Strresultat As String
    Dim intPositionligne As Integer
    Dim intPositionvaleur As Integer
    Dim intpositionPV As Integer
    Dim Valeurdefaut As String
     
     
    'Dim stream
    'Dim aFile As TextStream
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    i = 1
    N = 0
     
    'Pour déterminer le nom de la liste déroulante
    'If Selection.FormFields.Count = 1 Then
    'no text box but a checkbox or drop-down
    '   Call MsgBox(Selection.FormFields(1).Name)
    'ElseIf Selection.FormFields.Count = 0 And _
    '       Selection.Bookmarks.Count > 0 Then
    '       Call MsgBox(Selection.Bookmarks(Selection.Bookmarks.Count).Name)
    'End If
    NomListe = Selection.Bookmarks(Selection.Bookmarks.Count).Name 'Quel est le nom du menu déroulant sélectionné?
    Strresultat = ActiveDocument.FormFields(NomListe).Result
     
    'Ouverture du fichier texte
    StrTemp = Environ("temp") 'Pour obtenir la variable d'environnement Temp
    strfichier = "Reddition.txt" 'Nom du fichier qui contient les variables de base
    StrNomauLong = StrTemp & "\" & strfichier 'Nom du fichier avec le chemin
     
    Set Fichierexiste = CreateObject("Scripting.FileSystemObject")
    TestFichierexiste = Fichierexiste.FileExists(StrNomauLong) 'Test de l'existence du fichier
    If TestFichierexiste Then Open StrNomauLong For Input As 1 'Ouvre le fichier en lecture http://warin.developpez.com/access/fichiers/
     
    'Lecture du fichier texte et comparaison
    While Not EOF(1) 'Nous lisons le fichier
     
        Line Input #1, strligne 'Chaque ligne est inscrite dans la variable strligne
        intPositionligne = InStr(strligne, NomListe)
        intPositionvaleur = InStr(strligne, Strresultat)
        If intPositionligne > 0 And intPositionvaleur = 0 Then 'On a trouvé la bonne ligne dans le
        'mais la valeur a changé
            intpositionPV = InStr(strligne, ";")
            Valeurdefaut = Mid(strligne, intpositionPV + 1, Len(strligne))
            If InputBox("SVP inscrivez le mot de passer pour autoriser le changement de valeur!") <> "incident" Then
                ActiveDocument.FormFields(NomListe).Result = Valeurdefaut
            End If
     
        End If
     
    Wend
    Close 1 'Fermeture du fichier texte
     
    End Sub
    Cette routine supprime un fichier.
    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
    '============================================
    '============================================
    Private Sub SupprimeFichier(SFichier)
    Dim fs As Object
    Dim f As Object
     
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(SFichier)
    If f Is Nothing Then
        Exit Sub
    Else
        On Error Resume Next
        f.Delete
        If Err.Number <> 0 Then
            MsgBox "Il y a un problème à supprimer le fichier: " & SFichier
            End
        End If
    End If
    Set fs = Nothing
     
    End Sub

    Ce n'est pas parfait car je remarque que si une personne choisit un item d'un menu déroulant, il peut aller dans les différents menu de Word 2002 sans déclencher la validation de la macro.
    Merci,

    François

  11. #11
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,


    il est possible de ne pas devoir passer par un fichier texte, simplement dans une des prorpiétés du document, une propriété utilisateur et un Split pour les retrouver.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2013
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Salut,


    il est possible de ne pas devoir passer par un fichier texte, simplement dans une des prorpiétés du document, une propriété utilisateur et un Split pour les retrouver.
    1. Intéressant mais on ferait cela comment?
    2. Le problème qui me reste est que la macro de sortie n'est déclenché que lorsque le menu perd le focus. Ainsi, si je sélectionne un item dans un menu, la macro ne se déclenche que lorsqu'on sélectionne un second menu. C'es dommage et bizarre.

  13. #13
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai un tuto qui en parle.
    http://heureuxoli.developpez.com/office/word/variables/

    Dans les CustomProperties.

    La fonction Split permet de créer un tableau à une dimension au départ d'une chaîne pour autant que cette chaîne contienne un caractère récurrent.


    Par exemple : "un|deux|trois|quatre"

    Utilisé avec la fonction Split

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub UtilisationSplit()
    Dim monTab() As String
    Dim intI As Integer
     
     
    monTab = Split("un|deux|trois|quatre", "|")
     
    For intI = 0 To UBound(monTab)
    Debug.Print monTab(intI)
    Next intI
     
    End Sub
    La ligne Debug.Print monTab(intI) va successivement donner les valeurs du tableau issues de la chaîne de départ.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

Discussions similaires

  1. [WD-2010] Macros dans un menu déroulant Word 2010
    Par matzeb dans le forum Word
    Réponses: 3
    Dernier message: 31/01/2012, 11h00
  2. [WD-2007] Lien case à cocher et menu déroulant Word
    Par Xav... dans le forum VBA Word
    Réponses: 1
    Dernier message: 03/11/2010, 21h54
  3. menu déroulant sur word
    Par dimmu dans le forum Word
    Réponses: 1
    Dernier message: 08/04/2009, 22h08
  4. Menu déroulant dans Word
    Par k-eisti dans le forum VBA Word
    Réponses: 3
    Dernier message: 22/05/2007, 12h57

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