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 :

Userform - Boutons d'Options - association cellules


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut 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 actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Points : 234
    Points
    234
    Par défaut
    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é Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    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.)

    Nom : Capture d’écran 2020-08-01 à 14.13.08.png
Affichages : 383
Taille : 57,1 Ko


    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 habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    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é Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    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 habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonsoir,

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

    Cordialement,
    jp

  7. #7
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    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 habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    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.

    Nom : forum rmg.jpg
Affichages : 352
Taille : 30,7 Ko

    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 chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    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 habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    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 chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    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 habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    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

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

Discussions similaires

  1. [XL-2016] repérer le bouton d'option activé dans un userform
    Par koeuf dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/04/2020, 14h54
  2. Userform avec boutons d'options
    Par goninph dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 23/08/2019, 23h19
  3. Sélectionner Bouton d'option avec un userform
    Par steeeve34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/04/2012, 22h42
  4. [WD-2003] UserForm VBA-Bouton d'option-Garder dernier click
    Par Francine222 dans le forum VBA Word
    Réponses: 5
    Dernier message: 02/09/2009, 19h50
  5. Bouton Option associé à du texte.
    Par rsoul dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2008, 11h37

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