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 :

Userform - Boutons d'Options - association cellules


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Userform - Boutons d'Options - association cellules
    Bonjour,

    Un tableau A1:B5
    Colonne A : des dates (issues de formules)
    Colonne B : des numéros (liés aux dates de la colonne A)

    Objectif : récupérer le numéro dans la macro quand l'utilisateur sélectionne l'option correspondant à la date.
    Moyen : UF Contrôle Bouton d'Option
    Contraintes : les dates (et donc les numéros) sont dynamiques et doivent donc s'actualiser dans le UF

    Est-il possible :
    1 - Que le libellé du bouton d'Option récupère la valeur d'une cellule (date) ? (Si j'associe une cellule à la propriété Caption du UF ça ne fonctionne pas)
    2 - D'utiliser la fonction Offset pour récupérer le numéro correspondant à la date sélectionnées ? (l'utilisateur ne voit que les dates)

    En vous remerciant par avance pour vos lumières,
    Cordialement,
    jp

  2. #2
    Membre habitué
    Bonjour,
    De manière générale les propriétés ne font pas d'action. Le fait d'être blond ne t'aide pas à te coiffer... De même que le fait d'être rouge n'aide pas ta voiture à rouler.
    Par contre les évènements et les actions de l'utilisateur peuvent aider. Le fait de prendre un peigne ou d'acheter de l'essence par exemple.

    Tu ne peux pas associer une cellule à une propriété par contre les évènements sont fait pour ça.
    Das l'évènement Initialize du UserForm tu peux décider que le caption de ton Button aura la valeur (texte) d'une cellule.
    Tu peux décider qu'au moment ou tu vas cliquer sur le bouton sa caption va changer et prendra une autre valeur.
    A+

  3. #3
    Membre expérimenté
    Bonjour, Chez vous ça ne marche pas? Chez moi ça marche voir pièce jointe. par ailleurs, on peut entrer cette valeur autrement qu'avec Initialise.
    Attention de rajouter la parentalité de la feuille et du UserForm(ce que je n'ai pas fait sur l'exemple ci-dessous.)




    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  4. #4
    Membre régulier
    Bonjour,

    Merci, j'ai tiré partie de ces explications (finalement, je n'ai plus besoin de recourir à Offset)

    J'imagine qu'il est possible de nettement simplifier ce code (hormis pour la déclaration des variables que je préfère en colonne ) ?!

    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
    Option Explicit
    Private Sub Bouton_Annulation_Click()
        Unload UserForm1
    End Sub
    Private Sub Bouton_OK_Click()
    Dim Option1 As Integer
    Dim Option2 As Integer
    Dim Option3 As Integer
    Dim Option4 As Integer
    Dim Option5 As Integer
     
        Option1 = Range("ABY7")
        Option2 = Range("ABY8")
        Option3 = Range("ABY9")
        Option4 = Range("ABY10")
        Option5 = Range("ABY11")
     
        If OptionButton1 Then Col_Déb_Impress = Option1
        If OptionButton2 Then Col_Déb_Impress = Option2
        If OptionButton3 Then Col_Déb_Impress = Option3
        If OptionButton4 Then Col_Déb_Impress = Option4
        If OptionButton5 Then Col_Déb_Impress = Option5
     
        Unload UserForm1
        Call CreerPDF
     
        Col_Déb_Impress = Option1 '?? (si clic sur Ok sans avoir sélectionné une Option, je veux que ça soit celle-ci par défaut
     
    End Sub
    Private Sub Userform_Initialize()
        OptionButton1.Caption = Range("ABX7")
        OptionButton2.Caption = Range("ABX8")
        OptionButton3.Caption = Range("ABX9")
        OptionButton4.Caption = Range("ABX10")
        OptionButton5.Caption = Range("ABX11")
    End Sub


    PS :
    1. Col_Déb_Impress est déclarée comme Variable Public (dans un autre module)
    2. J'ai un doute sur la réinitialisation sur l'Option1 (cf. plus haut dans le code). Sans doute une propriété à mettre à True ?!
    3. Transitoire, tu dis
      on peut entrer cette valeur autrement qu'avec Initialize
      , mais c'est bien ce que tu proposes ici ?!


    Cordialement,
    jp

  5. #5
    Membre expérimenté
    J'ai simplement donné un exemple avec initialize du UserForm.
    Nous pourrons avoir une Macro appelé Test sur un module normal et qui serait lancée par un événement quelconque et qui modifierais le Caption
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
    UserForm1.OptionButton1.caption = Worksheets("Feuil1").range("B3").text 
    End Sub


    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  6. #6
    Membre régulier
    Bonsoir,

    Certes mais cela optimise-t-il le code ? A mon niveau cela ne me paraît pas flagrant.

    Cordialement,
    jp

  7. #7
    Membre expérimenté
    Bonsoir,
    Citation Envoyé par jpma75 Voir le message
    Certes mais cela optimise-t-il le code ? A mon niveau cela ne me paraît pas flagrant.
    Pour simplifier ton code je te propose ceci :
    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
    Option Explicit
    Dim idx As Integer
    Private Sub Bouton_Annulation_Click()
        Unload UserForm1
    End Sub
    Private Sub Bouton_OK_Click()
    Dim Col_Déb_Impress As String
        Col_Déb_Impress = Range("ABX7") '(si clic sur Ok sans avoir sélectionné une Option, je veux que ça soit celle-ci par défaut
        For idx = 1 To 5
            If Me.Controls("OptionButton" & idx) Then Col_Déb_Impress = Me.Controls("OptionButton" & idx).Caption
        Next idx
        Unload UserForm1
        Call CreerPDF (Col_Déb_Impress)
    End Sub
    Private Sub Userform_Initialize()
        For idx = 1 To 5
            Me.Controls("OptionButton" & idx).Caption = Range("ABX" & idx + 6)
        Next idx
    End Sub

  8. #8
    Membre régulier
    Bonjour,

    Merci anasecu pour cette proposition qui fonctionne parfaitement pour l'affichage des Options (ça force mon admiration).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Dim Col_Déb_Impress As String
        Col_Déb_Impress = Range("ABX7")


    J'étais surpris de voir que la déclaration de variable était String ; en fait, mes Options sont en colonne ABY (et non X) et ce sont des nombres.



    Pour infos et à toutes fins utiles, la cellule ABY7 (ici 431), est le résultat de la formule : =EQUIV(AUJOURDHUI();$3:$3;1)

    En conséquence, cette boucle ne renvoie pas un nombre même si je modifie le code initial comme suit : Col_Déb_Impress = Range("ABY7")

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For idx = 1 To 5
            If Me.Controls("OptionButton" & idx) Then Col_Déb_Impress = Me.Controls("OptionButton" & idx).Caption
        Next idx
        Unload UserForm1
        Call CreerPDF (Col_Déb_Impress)
    End Sub


    Par ailleurs, pourquoi faut-il ajouter (Col_Déb_Impress) après Call CreerPDF ?

    (Col_Déb_Impress est déclarée en variable Public)

    A+ ?
    Cordialement,
    jp

  9. #9
    Membre expérimenté
    Bonjour,
    Citation Envoyé par jpma75 Voir le message
    J'étais surpris de voir que la déclaration de variable était String ...En conséquence, cette boucle ne renvoie pas un nombre même
    Comme je n'avais pas la définition de Col_Déb_Impress, je n'ai pas bien supposé
    Ton caption sera un string de toute façon, alors comme ceci tu devrais avoir ton nombre :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    For idx = 1 To 5
            If Me.Controls("OptionButton" & idx) Then Col_Déb_Impress = Me.Controls("OptionButton" & idx).Caption * 1
        Next idx


    Citation Envoyé par jpma75 Voir le message
    Par ailleurs, pourquoi faut-il ajouter (Col_Déb_Impress) après Call CreerPDF ?
    Tu n'es pas obligé mais si c'est la seule utilité de ta variable publique, cela l'évites, sinon tu peux bien sûr l'utiliser, c'était une suggestion que tu as bien remarquée.

  10. #10
    Membre régulier
    Bonjour,

    Ça bug sur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Col_Déb_Impress = Me.Controls("OptionButton" & idx).Caption * 1


    J'ai naïvement ajouté :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Col_Déb_Impress = Me.Controls("OptionButton" & idx).Offset(0, 1)


    Et même :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Col_Déb_Impress = Me.Controls("OptionButton" & idx).Offset(0, 1).Caption * 1


    Mais ça ne fonctionne pas ! Arghh

    Faut-il rester sur Col_Déb_Impress = Range("ABX7") ?

    Cordialement,
    jp

  11. #11
    Membre expérimenté
    Bonjour,
    Citation Envoyé par jpma75 Voir le message
    Ça bug sur ...
    Mais c'est bien sûr j'ai oublié que tu veux la colonne suivante du caption, comme ceci cela devrait aller mieux
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
        For idx = 1 To 5
            If Me.Controls("OptionButton" & idx) Then Col_Déb_Impress = Range("ABY" & idx + 6)
        Next idx

  12. #12
    Membre régulier
    Bonjour,

    Parfait ! Merci beaucoup ++

    En résumé, ça donne ceci :
    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
    Option Explicit
    Dim idx As Integer
    Private Sub Bouton_Annulation_Click()
        Unload MenuPrint
    End Sub
    Private Sub Bouton_OK_Click()
     
        Col_Déb_Impress = Range("ABX7")
     
        For idx = 1 To 5
            If Me.Controls("OptionButton" & idx) Then Col_Déb_Impress = Range("ABY" & idx + 6)
        Next idx
     
        MsgBox Col_Déb_Impress
        Unload MenuPrint
        Call CreerPDF
     
    End Sub
    Private Sub Userform_Initialize()
        For idx = 1 To 5
            Me.Controls("OptionButton" & idx).Caption = Range("ABX" & idx + 6)
        Next idx
    End Sub


    Outre sa lisibilité, la simplification (factorisation ?) du code est une source de délectation Merci donc pour ton aide précieuse.

    Cordialement,
    jp

###raw>template_hook.ano_emploi###