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

  1. #1
    Membre à l'essai
    Macro Word et liste déroulante à sélection multiple avec cases à cocher
    Salut à tous,

    Je n'y connais rien en Macro Word et je cherche à créer un truc en apparence simple : dans un document Word, je veux une case, quand tu cliques dessus ça te déroule une liste de cases à cocher, et quand tu coches des cases ça t'écris la phrase correspondante.

    Genre tu déroules ta liste, tu as :
    - Case 1
    - Case 2
    - Case 3
    Tu coches les cases 1 et 3 et ça t'écris :
    Phrase de la case 1
    Phrase de la case 3

    ___________________________

    J'ai cru que c'était possible sur Word 2019 avec une liste déroulante :
    Ficher > Options > Personnaliser le ruban.
    Dans la partie droite "Onglets principaux", cochez "Développeur" > OK

    Dans l'onglet "Développeur", cliquez sur "Mode Création".
    Dans votre feuille Word, cliquez là où vous voulez mettre la liste déroulante.
    Puis cliquez sur "Contrôle du contenu de liste déroulante", c’est l’un des petits boutons qui se trouve à côté de "Mode Création".

    Une case apparaît avec écrit "Choisissez un élément". Cliquez droit dessus puis sur "Propriétés".
    Cliquez sur "Ajouter… " pour ajouter vos différents choix. Ensuite recliquez sur "Mode création" pour le désélectionner.

    Ce que l'on constate, c’est qu'on peut juste sélectionner le "Nom complet" (Display name) dans la liste, quand on le sélectionne, il n’est pas remplacé par la "Valeur" (Value). Pour cela, il faut passer par une Macro VBA.
    Et c'est là que mes compétences s'arrêtent.

    Quelqu'un peut-il m'aider svp ?

    Ce topic existe peut-être déjà sur le forum, car ce doit être un problème courant, mais je n'ai pas trouvé. Peut-être que j'utilise les mauvais mots-clés ?

  2. #2
    Expert éminent sénior
    Citation Envoyé par Celestus Voir le message

    Bonjour,

    Regardez si cette discussion peut vous aider : Remplir-plusieurs-combo-boxes-listes-dependent-checkboxes
    Voire celle-ci : Context-menu-cascade
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  3. #3
    Membre à l'essai
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Regardez si cette discussion peut vous aider : Remplir-plusieurs-combo-boxes-listes-dependent-checkboxes
    Voire celle-ci : Context-menu-cascade
    Merci beaucoup, mais ça ne m'a pas beaucoup aidé.

    Pour l'instant, j'en suis là.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ComboBox1_DropButtonClick()
        If ComboBox1.ListCount = 0 Then
            With ComboBox1
                .AddItem "Titre 1"
                .AddItem "Titre 2"
                .AddItem "Titre 3"
            End With
        End If
    End Sub


    Ce que je veux, c'est que "Titre 1", "Titre 2" et "Titre 3" deviennent des cases à cocher, mais DANS la ComboBox, pas en dehors.
    Est-ce seulement possible ?

    Et enfin, ce que je veux, c'est que quand je sélectionne plusieurs titres, la ComboBox soit "remplacée" par les phrases correspondantes. Du coup il faudrait que la ComboBox ait un bouton "OK" pour valider les bases à cocher...

    Il faudrait un truc genre :
    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
    Private Sub ComboBox1_DropButtonClick()
        If ComboBox1.ListCount = 0 Then
            With ComboBox1
                .AddItem.Titre_1 "Titre 1"
                .AddItem.Titre_2 "Titre 2"
                .AddItem.Titre_3 "Titre 3"
            End With
            If ComboBox1.SelectedItem.Titre_1 = True Then
                    ComboBox1.Write.Titre_1 "Phrase liée au Titre 1"
            End If
            If ComboBox1.SelectedItem.Titre_2 = True Then
                    ComboBox1.Write.Titre_2 "Phrase liée au Titre 2"
            End If
            If ComboBox1.SelectedItem.Titre_3 = True Then
                    ComboBox1.Write.Titre_3 "Phrase liée au Titre 3"
            End If
        End If
    End Sub


    Je ne sais pas comment écrire ça en VBA...

  4. #4
    Expert éminent sénior
    Citation Envoyé par Celestus Voir le message

    Bonjour,

    Pour changer le style de votre Combobox, utilisez la propriété ListStyle, mais je crains que cela ne vous apporte pas grand chose. Sauf erreur de ma part, et à la différence d'un contrôle ListBox, une Combobox n'a pas de propriété MultiSelect.

    Sinon, dans la discussion Remplir-plusieurs-combo-boxes-listes-dependent-checkboxes, vous n'avez pas dû voir la façon dont on se servait des événements sur les contrôles ActiveX dans la partie ThisDocument pour lancer une macro où pour dans votre cas, injecter directement du texte dans l'objet Selection.

    De mon point de vue, s'il s'agit de sélectionner un à plusieurs items, le mieux est de vous servir d'un Userform et d'utiliser une ListBox qui contiendra tout votre phrasier et un bouton de validation. Ce userform pourra être lancé facilement au moyen d'un bouton dans la barre d'accès rapide.

    Mais, il y a sans doute d'autres solutions plus efficaces.
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  5. #5
    Membre à l'essai
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Pour changer le style de votre Combobox, utilisez la propriété ListStyle, mais je crains que cela ne vous apporte pas grand chose. Sauf erreur de ma part, et à la différence d'un contrôle ListBox, une Combobox n'a pas de propriété MultiSelect.

    Sinon, dans la discussion Remplir-plusieurs-combo-boxes-listes-dependent-checkboxes, vous n'avez pas dû voir la façon dont on se servait des événements sur les contrôles ActiveX dans la partie ThisDocument pour lancer une macro où pour dans votre cas, injecter directement du texte dans l'objet Selection.

    De mon point de vue, s'il s'agit de sélectionner un à plusieurs items, le mieux est de vous servir d'un Userform et d'utiliser une ListBox qui contiendra tout votre phrasier et un bouton de validation. Ce userform pourra être lancé facilement au moyen d'un bouton dans la barre d'accès rapide.

    Mais, il y a sans doute d'autres solutions plus efficaces.
    Merci, pour l'instant j'ai produit ce code.
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Private Sub ComboBox1_DropButtonClick()
    	' Macro liée à la ComboBox nommée ComboBox1
     
    	' Déclaration des variables
    	Dim titre_0 As String
    	Dim titre_1 As String
    	Dim titre_1_texte_1 As String
    	Dim titre_1_texte_2 As String
    	Dim titre_1_texte_3 As String
    	Dim titre_2 As String
    	Dim titre_2_texte_1 As String
    	Dim titre_3 As String
    	Dim titre_3_texte_1 As String
    	Dim titre_4 As String
    	Dim titre_4_texte_1 As String
     
    	' Initialisation des variables
    	titre_0 = "Veuillez sélectionner une phrase"
    	titre_1 = "Titre 1"
    	titre_1_texte_1 = "Texte du titre 1 partie 1 "
    	titre_1_texte_2 = "partie 2 en gras rouge"
    	titre_1_texte_3 = " et partie 3 en normal"
    	titre_2 = "Titre 2"
    	titre_2_texte_1 = "Texte du titre 2"
    	titre_3 = "Titre 3"
    	titre_3_texte_1 = "Texte du titre 3"
    	titre_4 = "Titre 4"
    	titre_4_texte_1 = "Texte du titre 4"
     
    	' On donne 2 colonnes à la liste
    	ComboBox1.ColumnCount = 2
    	' On définit la taille des colonnes, la première a 100 points et la seconde est sans limite
    	ComboBox1.ColumnWidths = "100;-1"
     
    	' Remplissage de la liste
    	If ComboBox1.ListCount = 0 Then
    		With ComboBox1
    			.AddItem titre_1
    			.List(0, 1) = titre_1_texte_1 & titre_1_texte_2 & titre_1_texte_3
    			.AddItem titre_2
    			.List(1, 1) = titre_2_texte_1
    			.AddItem titre_3
    			.List(2, 1) = titre_3_texte_1
    			.AddItem titre_4
    			.List(3, 1) = titre_4_texte_1
    		End With
    	End If
     
    	' Si le titre_1 est sélectionné
    	If (ComboBox1.Value = titre_1) Then
    		' On vide la ComboBox et on la réinitialise
    		ComboBox1.Clear
    		ComboBox1.Value = titre_0
    		' On affiche un message contenant un retour à la ligne classique : Chr(13) Chr(10) = 0D0A
    		' Call MsgBox("La ComboBox sera remplacée par le texte correspondant." & Chr(13) & Chr(10) & "Pressez plusieurs fois CTRL+z pour annuler.")
    		' On formate le texte à écrire
    		With Selection
    			' N'est pas en caractère gras
    			.Font.Bold = False
    			' Police en Arial
    			.Font.Name = "Arial"
    			' Couleur du texte, les choix sont ici : https://docs.microsoft.com/fr-fr/office/vba/api/word.wdcolorindex
    			.Font.ColorIndex = wdAuto
    			' Alignement du texte, à gauche, à droite, centré : https://docs.microsoft.com/fr-fr/office/vba/api/word.wdparagraphalignment
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			' L'espacement après le paragraphe est ici à 0 points (classiquement on peut le mettre à 12)
    			.ParagraphFormat.SpaceAfter = 0
    			' On remplace la ComboBox par le texte
    			.TypeText titre_1_texte_1
    		End With
    		With Selection
    			.Font.Bold = True
    			.Font.Name = "Arial"
    			.Font.ColorIndex = wdRed
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			.ParagraphFormat.SpaceAfter = 0
    			.TypeText titre_1_texte_2
    		End With
    		With Selection
    			.Font.Bold = False
    			.Font.Name = "Arial"
    			.Font.ColorIndex = wdAuto
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			.ParagraphFormat.SpaceAfter = 0
    			' On ajoute un retour à la ligne spécifique à Word :Chr(11) = 0B
    			.TypeText titre_1_texte_3 & Chr(11)
    		End With
    	End If
     
    	If (ComboBox1.Value = titre_2) Then
    		ComboBox1.Clear
    		ComboBox1.Value = titre_0
    		With Selection
    			.Font.Bold = False
    			.Font.Name = "Calibri"
    			' On écrit cette phrase en vert
    			.Font.ColorIndex = wdGreen
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			.ParagraphFormat.SpaceAfter = 0
    			' On ne met pas de retour à la ligne après
    			.TypeText titre_2_texte_1
    		End With
    	End If
     
    	If (ComboBox1.Value = titre_3) Then
    		ComboBox1.Clear
    		ComboBox1.Value = titre_0
    		With Selection
    			.Font.Bold = False
    			.Font.Name = "Times New Roman"
    			.Font.ColorIndex = wdAuto
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			.ParagraphFormat.SpaceAfter = 0
    			.TypeText titre_3_texte_1 & Chr(11)
    		End With
    	End If
     
    	If (ComboBox1.Value = titre_4) Then
    		ComboBox1.Clear
    		ComboBox1.Value = titre_0
    		With Selection
    			.Font.Bold = False
    			.Font.Name = "Verdana"
    			.Font.ColorIndex = wdAuto
    			.ParagraphFormat.Alignment = wdAlignParagraphLeft
    			.ParagraphFormat.SpaceAfter = 0
    			TypeText titre_4_texte_1 & Chr(11)
    		End With
    	End If
    End Sub


    Il fait grossièrement ce que je veux, j'ai l'impression que mettre plusieurs cases à cocher devient vite très difficile.

    Un truc qui pourrait être amélioré, ce serait de ne mettre qu'un seul ".TypeText" pour ajouter plusieurs segments de phrase en même temps, mais formatés différemment.
    Mais il faudrait "coller" un formatage à une variable. C'est possible de faire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    titre_4_text_1.Font.Bold = False

    alors que je n'ai pas définit "titre_4_text_1" en tant qu'objet ?

###raw>template_hook.ano_emploi###