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 avec boutons d'options


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut Userform avec boutons d'options
    Bonjour,

    J'ai 6 boutons d'options dans une Frame qui renseigne la même cellule.
    Lors de l'initialisation, si la cellule est vide, aucun bouton d'option n'est TRUE, ce qui est normal, j'aimerai que lorsque tous les boutons sont FALSE ouvrir une msgbox pour rendre attentif l'utilisateur qu'il doit faire un choix avant de sortir.

    Merci pour votre aide
    Philippe

    Nom : 2019-08-19_17-35-15.png
Affichages : 8196
Taille : 16,3 Ko

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Il suffit de mettre cette vérification dans la macro qui est déclenchée par le bouton "Ok".
    Si les données sont impropres, envoyer un avertissement en MsgBox et ne pas fermer le UF.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    tu peux utiliser un booléen, et une boucle, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim result as Boolean
    result = False
    dim i as integer
    For i=1 to 6
    if Me.Controls("chk" & i).Value Then
    result= True
    Next i
    Msgbox result
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je travaille avec la propriété GroupName que tu peux associer aux optionbutton.

    Nom : 2019-08-19_192151.png
Affichages : 6615
Taille : 30,7 Ko

    La propriété GroupName permet d'associer les boutons d'option qui doivent "jouer" ensemble. Tu peux alors boucler sur les contrôles du userform au sein d'une fonction de ce dernier qui, au vu de ta demande initiale, renvoie True si une option est choisie et False si aucune n'est choisie.

    Voici le code de la fonction qui teste cela, et qui est utilisée par le bouton de commande.
    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 CommandButton1_Click()
      If OptionSelected Then
        Me.Hide
      Else
        MsgBox "Vous devez choisir une option"
      End If
    End Sub
     
    Function OptionSelected() As Boolean
      Dim c As msforms.Control
      Dim Counter As Long
     
      Counter = 0
      Do While Counter < Me.Controls.Count And Not OptionSelected
        Set c = Me.Controls(Counter)
        If TypeName(c) = "OptionButton" Then
          If c.GroupName = "Test" Then OptionSelected = c.Value
        End If
        Counter = Counter + 1
      Loop
    End Function



    Normalement, l'ergonomie Windows "impose" que dans le cas de boutons d'options, il y en ai toujours un par groupe qui soit sélectionné, même à l'ouverture d'un formulaire. Perso, pour respecter cette ergonomie et ne pas perturber l'utilisateur, j'aurais ajouté une option "Aucun choix" qui serait coché par défaut. Vérifier qu'on a fait un choix reviendrait à vérifier que cette option n'est pas True.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Hello Pierre Fauconnier,

    Superbe ça fonctionne à merveille.

    Merci et bonne nuit
    Meilleures salutations
    Philippe

  6. #6
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous,

    Hé salut Pierre!

    Une variante m'est venue à l'idée suite à un précédent post de .... Pierre Fauconnier.
    Piloter le formulaire à distance en gérant une propriété qui lui est définie (Property Get).

    Soit.

    Dans le code associé au formulaire, en utilisant comme tu le proposes la propriété GroupName.

    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
    Option Explicit
     
    Private Sub btnValidate_Click()
      Me.Hide
    End Sub
     
    Property Get optionchoisie() As Boolean
     
      Dim c As msforms.Control
      Dim Counter As Byte
     
      Counter = 0
      Do While Counter < Me.Controls.Count And Not optionchoisie
        Set c = Me.Controls(Counter)
        If TypeName(c) = "OptionButton" Then
          If c.GroupName = "Test" Then optionchoisie = c.Value
        End If
        Counter = Counter + 1
      Loop
     
    End Property
    Et dans un formulaire standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Sub Testoptions()
      With UserForm1
        .Show
        Do While .optionchoisie = False
          MsgBox Prompt:="Vous devez choisir une option"
        .Show
      Loop
      End With
      Unload UserForm1
    End Sub
    Ton avis (ou celui de quelque autre lecteur)?.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  7. #7
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Hello,

    Il y a une erreur : next sans For

    Help.

    Merci
    Philippe



    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    tu peux utiliser un booléen, et une boucle, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim result as Boolean
    result = False
    dim i as integer
    For i=1 to 6
    if Me.Controls("chk" & i).Value Then
    result= True
    Next i
    Msgbox result

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Les lignes if Me.Controls("chk" & i).Value Then et result= True doivent ne former qu'une seule ligne...

    if Me.Controls("chk" & i).Value Then result= True


    La ligne 2 Result = False est inutile car c'est la valeur par défaut d'un boolean lors de la déclaration
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Hello Pierre Fauconnier,

    En fait à la fin de la macro je lance la correction orthographique avec la ligne de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Cells.CheckSpelling SpellLang:=1036 'Lancer le correcteur orthographique
    Mais depuis que j'ai ajouter votre macro, la boite de dialogue de la correction s'ouvre, détecte la faute, mais ne elle ne répond plus.
    Le cas se produit uniquement si il n'y a aucun bouton d'option sélectionné.

    Merci et bonne nuit
    Meilleures salutations
    Philippe





    Citation Envoyé par goninph Voir le message
    Hello Pierre Fauconnier,

    Superbe ça fonctionne à merveille.

    Merci et bonne nuit
    Meilleures salutations
    Philippe

  10. #10
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Qu'est ce que le chk ?

    Merci
    Philippe



    Citation Envoyé par Pierre Fauconnier Voir le message
    Les lignes if Me.Controls("chk" & i).Value Then et result= True doivent ne former qu'une seule ligne...

    if Me.Controls("chk" & i).Value Then result= True
    La ligne 2 Result = False est inutile car c'est la valeur par défaut d'un boolean lors de la déclaration

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Jean-Philippe t'a donné un code qui tient compte du nom des optionbutton, qui doit commencer par chk... Attention au passage au risque de confusion entre Optionbutton et checkbox...

    Perso, je n'aime pas cette méthode car elle me contraint à utiliser des noms qui ne sont pas parlants, alors que la propriété GroupName que j'emploie dans ma solution permet justement de s'affranchir de cette obligation. Qui plus est, GroupName permet aussi de s'affranchir du frame, puisque cette propriété fait jouer ensemble les optionbutton d'un même groupname. Ca permet d'avoir des groupes d'optionbutton qui jouent chacun dans leur groupe sans devoir alourdir le userform avec des frames.

    Attention aussi que, même si ici on ne boucle que sur 6 boutons, il me semble intéressant de sortir de la boucle dès qu'on n'a plus besoin de boucler, autrement dit, dès qu'on a un optionbutton sélectionné. C'est pour cela que je choisis la boucle Do While avec une condition de sortie plutôt que For... Next qui oblige à boucler sur tous les contrôles (ici de 1 à 6, ce qui me semble étonnant car il y a plus que 6 contrôles dans le userform).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Bonsoir Pierre Fauconnier,

    Compris.

    Avec votre prosition j'ai un soucis :

    En fait à la fin de la macro je lance la correction orthographique avec la ligne de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Cells.CheckSpelling SpellLang:=1036 'Lancer le correcteur orthographique
    Mais depuis que j'ai ajouter la macro, la boite de dialogue de la correction s'ouvre, détecte la faute, mais ne elle ne répond plus.
    Le cas se produit uniquement si il n'y a aucun bouton d'option sélectionné.

    Merci et bonne nuit
    Meilleures salutations
    Philippe

    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 CommandButton1_Click()
      If OptionSelected Then
        Me.Hide
      Else
        MsgBox "Vous devez choisir une option"
      End If
    End Sub
     
    Function OptionSelected() As Boolean
      Dim c As msforms.Control
      Dim Counter As Long
     
      Counter = 0
      Do While Counter < Me.Controls.Count And Not OptionSelected
        Set c = Me.Controls(Counter)
        If TypeName(c) = "OptionButton" Then
          If c.GroupName = "Test" Then OptionSelected = c.Value
        End If
        Counter = Counter + 1
      Loop
    End Function




    Citation Envoyé par Pierre Fauconnier Voir le message
    Jean-Philippe t'a donné un code qui tient compte du nom des optionbutton, qui doit commencer par chk... Attention au passage au risque de confusion entre Optionbutton et checkbox...

    Perso, je n'aime pas cette méthode car elle me contraint à utiliser des noms qui ne sont pas parlants, alors que la propriété GroupName que j'emploie dans ma solution permet justement de s'affranchir de cette obligation. Qui plus est, GroupName permet aussi de s'affranchir du frame, puisque cette propriété fait jouer ensemble les optionbutton d'un même groupname. Ca permet d'avoir des groupes d'optionbutton qui jouent chacun dans leur groupe sans devoir alourdir le userform de frame.

    Attention aussi que, même si ici on ne boucle que sur 6 boutons, il me semble intéressant de sortir de la boucle dès qu'on n'a plus besoin de boucler, autrement dit, dès qu'on a un optionbutton sélectionné. C'est pour cela que je choisis la boucle Do While avec une condition de sortie plutôt que For... Next qui oblige à boucler sur tous les contrôles (ici de 1 à 6, ce qui me semble étonnant car il y a plus que 6 contrôles dans le userform).

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Une chose à la fois, sinon on ne va plus s'y retrouver...

    Normalement, une procédure/fonction fait une seule chose. Donc, tu ne peux pas avoir une macro qui gère une saisie de dates pour calculer le nombre de jours entre deux dates et qui fait en même temps du checkspelling dans une cellule.

    Découper le code en petits morceaux digestes qui ont une seule responsabilité permet de mieux contrôles les imbrications de tes différentes "briques". Ca permet aussi assez souvent d'éviter les collisions et les problèmes comme celui dont tu parles (checkspelling).

    Résous d'abord le problème de la saisie des dates, et après, il sera temps de se pencher sur le checkspelling.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    La collision et les problèmes (checkspelling) sont en conflit avec le lancement du correcteur orthographique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Cells.CheckSpelling SpellLang:=1036 'Lancer le correcteur orthographique
    Depuis que j'ai ajouter le (checkspelling) , la boite de dialogue de la correction s'ouvre, détecte la faute, mais ne elle ne répond plus.
    Le cas se produit uniquement si il n'y a aucun bouton d'option sélectionné.

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Dans le code que tu donnes, je ne vois cette ligne nulle part... Difficile donc de dire ce qui pose problème... Où est placée cette ligne dans ton code? Serait-ce dans un événement Change? Auquel cas, il risque effectivement d'y avoir collision puisqu'au sein de ta macro, tu rends la main à l'interface Excel pour appeler la fenêtre de correction. Si c'est le cas, tu devras désactiver la gestion des événements (puis la restaurer) et lancer le checkspelling après avoir refermé les userforms (je suppute des userforms en cascade puisque tu parles d'un userform calendar, ce qui complique encore la donne, évidemment).

    Cela dit: activecell.checkspelling suffit comme code, pas besoin de activecell.cells.checkspelling.


    NB: Coder, ce n'est pas "pisser du code", mais c'est normalement la dernière étape d'une étude correcte du processus à mettre en oeuvre...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par MarcelG Voir le message
    [...]
    Ah, j'apprécie que tu rappelles cette solution. Merci à toi. Elle permet de dissocier les vérifications "informatiques" des vérifications "métier", permettant d'isoler les codes informatique et métier dans leurs couches respectives, à savoir la couche de présentation et la couche métier (Presentation Layer et Business Layer, dans le jargon de l'architercture trois-tiers), même si je n'utilise pas les Property à cette fin.

    Pour dissocier les vérifications informatiques (si on attend une date, est-ce bien une date) qui doivent être contenues dans le userform (couche de présentation) des vérifications métiers (la date saisie respecte-t-elle les règles de gestion) qui doivent être contenues dans la couche métier (donc hors du userform), je me sers plutôt d'une proprieté publique du userform qui renseigne la fonction de vérification métier qui sera appelée lors du clic sur le bouton de validation.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Voici le 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
    Private Sub BT_OK_Click()
    Dim Date_début As Date
    Dim Date_Fin As Date
      If OptionSelected Then
            ActiveCell = TextBoxPVchantier
            ActiveCell.Offset(rowOffset:=0, columnOffset:=1) = TextBoxDuree.Value
            ActiveCell.Offset(rowOffset:=0, columnOffset:=6) = Now
                    If LabelDateDebut = "" Then
                        ActiveCell.Offset(rowOffset:=0, columnOffset:=2).Value = ""
                    Else
                        Date_début = LabelDateDebut
                        ActiveCell.Offset(rowOffset:=0, columnOffset:=2).Value = Date_début 'Variable obligatoire pour avoir la date au format date dans excel
                    End If
                    If LabelDateFin = "" Then
                        ActiveCell.Offset(rowOffset:=0, columnOffset:=3) = ""
                    Else
                        Date_Fin = LabelDateFin
                        ActiveCell.Offset(rowOffset:=0, columnOffset:=3) = Date_Fin 'Variable obligatoire pour avoir la date au format date dans excel
                    End If
                ActiveCell.CheckSpelling SpellLang:=1036 'Lancer le correcteur orthographique
                ActiveCell.Offset(rowOffset:=0, columnOffset:=-3).Select
            Unload Me
        Else
            MsgBox "Vous devez choisir une option"
        End If 'de OptionSelected_Avancement
    End Sub
    Function OptionSelected() As Boolean
      Dim c As msforms.Control
      Dim Counter As Long
      Counter = 0
      Do While Counter < Me.Controls.Count And Not OptionSelected
        Set c = Me.Controls(Counter)
        If TypeName(c) = "OptionButton" Then
          If c.GroupName = "Avancement" Then OptionSelected = c.Value
        End If
        Counter = Counter + 1
      Loop
    End Function


    Citation Envoyé par Pierre Fauconnier Voir le message
    Dans le code que tu donnes, je ne vois cette ligne nulle part... Difficile donc de dire ce qui pose problème... Où est placée cette ligne dans ton code? Serait-ce dans un événement Change? Auquel cas, il risque effectivement d'y avoir collision puisqu'au sein de ta macro, tu rends la main à l'interface Excel pour appeler la fenêtre de correction. Si c'est le cas, tu devras désactiver la gestion des événements (puis la restaurer) et lancer le checkspelling après avoir refermé les userforms (je suppute des userforms en cascade puisque tu parles d'un userform calendar, ce qui complique encore la donne, évidemment).

    Cela dit: activecell.checkspelling suffit comme code, pas besoin de activecell.cells.checkspelling.


    NB: Coder, ce n'est pas "pisser du code", mais c'est normalement la dernière étape d'une étude correcte du processus à mettre en oeuvre...

  18. #18
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Je pense que tu ne fais pas les choses dans le bon ordre, et comme dit plus haut, tu devrais scinder ton code en différents morceaux.

    Au clic, tu appelles une fonction booléenne qui vérifie que la saisie est correcte (par exemple DatasAreOk). Si cette fonction renvoie True, tu fermes le userform, tu transfères tes données dans les cellules, tu décharges le userform puis seulement tu appelles le checkspelling. Du coup, plus de collisions.

    Regarde la toute première solution que j'ai donnée, elle illustre que la vérifications des données au clic a été déportée dans une autre fonction. Chaque bloc de code (procédure ou fonction) a ainsi une responsabilité unique, tu évites les collisions, et en plus, tu as des petits bouts de code que tu testes facilement.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  19. #19
    Membre habitué Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 725
    Points : 184
    Points
    184
    Par défaut
    Ok, merci pour toutes ces infos
    Bonne soirée et superbe assistance, génial.
    Philippe



    Citation Envoyé par Pierre Fauconnier Voir le message
    Je pense que tu ne fais pas les choses dans le bon ordre, et comme dit plus haut, tu devrais scinder ton code en différents morceaux.

    Au clic, tu appelles une fonction booléenne qui vérifie que la saisie est correcte (par exemple DatasAreOk). Si cette fonction renvoie True, tu fermes le userform, tu transfères tes données dans les cellules, tu décharges le userform puis seulement tu appelles le checkspelling. Du coup, plus de collisions.

    Regarde la toute première solution que j'ai donnée, elle illustre que la vérifications des données au clic a été déportée dans une autre fonction. Chaque bloc de code (procédure ou fonction) a ainsi une responsabilité unique, tu évites les collisions, et en plus, tu as des petits bouts de code que tu testes facilement.

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    @Marcel

    je suis perplexe avec ceci avec le (do/loop)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Sub Testoptions()
      With UserForm1
        .Show
        Do While .optionchoisie = False
          MsgBox Prompt:="Vous devez choisir une option"
        .Show
      Loop
      End With
      Unload UserForm1
    End Sub
    a moins qu'il soit impératif que le UserForm soit non modal ca n'est pas nécessaire

    exemple

    la sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub testx()
        With UserForm1
            .Show
            If .optionchoisie = False Then
                MsgBox Prompt:="Vous devez choisir une option"
                testx 'on rappelle la sub 
            Else
                MsgBox "vous avez choisi l'option " & .optionchoisie
            End If
        End With
        Unload UserForm1
    End Sub
    dans le module du UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public optionchoisie As Variant
     
    Private Sub CommandButton1_Click()
    If aucun.Value = True Then
    optionchoisie = False: Me.Hide
    Else
    For i = 1 To 6
    If Me.Controls("OptionButton" & i).Value = True Then optionchoisie = i: Me.Hide
    Next
    End If
    End Sub
    apercu
    Nom : Capture.JPG
Affichages : 5858
Taille : 44,6 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. [AC-2010] Problème de choix multiples avec boutons d'options.
    Par Axe_Débutant dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/03/2015, 10h59
  2. [XL-2003] Macro de recherche dans un userform avec bouton et textbox
    Par guilo49 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/11/2009, 14h38
  3. [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, 18h50
  4. UPDATE avec bouton d'option
    Par Seb981 dans le forum Langage
    Réponses: 2
    Dernier message: 23/07/2007, 11h58
  5. [vb6] Frames avec boutons d'option
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 21/07/2006, 15h57

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