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 :

Est-ce un bug ou un erreur dans un userform ? [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut Est-ce un bug ou un erreur dans un userform ?
    Bonjour a vous,


    J'ai fais un userform avec compteur afin d'avisé l'utilisateur qu'il y a des champs manquant qu'il aurais dû remplir. Lorsqu'un champs est vide, on augmente de 1 le compteur. Si le compteur est a 0, on exécute le code si le compteur est plus grand que 1, on ouvre un msgbox en avisant le nombre de champs a remplir


    J'ai un probleme avec les boutons options. J'ai dans un cadre, 2 boutons options, 1 pour oui et 1 pour non.


    Si j'exécute mon code sans avoir coché un des deux options, mon code compte 1 et tout va sur des roulettes. Si je coche le non, le code ne le compte pas et tous fonctionne a merveille. Si je selectionne le oui, il le compte malgré dû fait qu'il ne devrais pas ajouté.


    voici le code en question

    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
    Private Sub cmdOK_Click()
     
    Dim compteur As Integer
     
    [nom_dossier] = txtNom_dossier
    [numero_dossier] = txtNumero
    [nom_precedent] = textNom_anterieur
    [date_demarrage] = DTPDate_rencontre
    [nom_conseiller] = cmbNom_conseiller
    [nom_technicien] = cmbNom_tech
    [nom_chef] = cmbNom_chef
    [type_de_dossier] = cmbType_dossier
    [porte_du_dossier] = cmbPortee
     
    If optOui = True Then
        [premiere_fois] = "OUI"
    ElseIf optNon = True Then
        [premiere_fois] = "NON"
    End If
     
     If txtNom_dossier = Empty Then
     compteur = compteur + 1
     End If
     
     If txtNumero = Empty Then
    compteur = compteur + 1
     End If
     
     If textNom_anterieur = Empty Then
    compteur = compteur + 1
     End If
     
     If DTPDate_rencontre = Empty Then
    compteur = compteur + 1
     End If
     
     If cmbNom_conseiller = Empty Then
    compteur = compteur + 1
     End If
     
     If cmbNom_tech = Empty Then
    compteur = compteur + 1
     End If
     
     If cmbNom_chef = Empty Then
    compteur = compteur + 1
     End If
     
     If cmbType_dossier = Empty Then
    compteur = compteur + 1
     End If
     
    If cmbPortee = Empty Then
    compteur = compteur + 1
     End If
     
    If optOui And optNon = False Then
    compteur = compteur + 1
     End If
     
    If compteur > 1 Then
    MsgBox "Il manque" & Chr(32) & compteur & Chr(32) & "champ(s) a remplir", vbCritical
    Else
    Unload Me
    End If
     
    End Sub

    Nom : Capture.JPG
Affichages : 183
Taille : 45,9 Ko




    merci pour votre aide !!!!!

  2. #2
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Sur la structure du code.
    Plutôt balayer les contrôles à partir d'un array et en incrémentant ainsi le compteur.

    Sur ta difficulté.
    Je ne comprends pas
    Si je selectionne le oui, il le compte malgré dû fait qu'il ne devrais pas ajouté.
    Dans ton code, tu sembles compter une erreur si OptOui = True et OptNon = False.
    (Au passage, même si cela paraît redondant, affecter la valeur True est parfois utile à la lisibilité du code)
    Je ne vois pas pourquoi.

    L'array te serait d'autant plus utile pour alimenter ta feuille de travail.
    A une condition : que tes noms de contrôle et que les noms de ta feuille soient homogènes.
    Dans mes développements,
    Les contrôles se nomment Txt_lacellulemarcel
    Dans ma feuille de travail, ma cellule informée se nomme lacellulemarcel.
    Une fois cette discipline réalisée, l'alimentation devient plus claire donc plus facile.
    Ce en bouclant sur un array comportant, entre autres, "lacellulemarcel"

    Reviens si nécessaire

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Plutôt qu'un compteur, pourquoi ne pas rendre les contrôles obligatoires avec un code du style :

    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
    Private Sub cmdOK_Click()
    With txtNom_dossier
        If .Value = "" Then
        MsgBox "Vous devez remplir le champ " & Chr(34) & "Nom du dossier" & Chr(34) & " !"
        .SetFocus
        Exit Sub
    End With
     
    If optOUI.Value = False And optNON = False Then
        MsgBox "Vous devez choisir l'option " & Chr(34) & "oui" & Chr(34) & " ou l'option " & Chr(34) & "non" & Chr(34) & " !"
        optOUI.SetFocus
        Exit Sub
    End If
    'faire pareil avec les autres contrôles txtNumero, textNom_anterieur, DTPDate_rencontre, cmbNom_conseiller, cmbNom_tech, cmbNom_chef, cmbType_dossier, cmbPortee
     
    'chaque fois qu'un contrôle sera vide, il prendra le focus (le curseur sera dans lui) et le code s'arrêtera
     
    'si tous les contrôles obligatoires sont remplis les données sont renvoyées dans l'onglet
    [nom_dossier] = txtNom_dossier
    [numero_dossier] = txtNumero
    [nom_precedent] = textNom_anterieur
    [date_demarrage] = DTPDate_rencontre
    [nom_conseiller] = cmbNom_conseiller
    [nom_technicien] = cmbNom_tech
    [nom_chef] = cmbNom_chef
    [type_de_dossier] = cmbType_dossier
    [porte_du_dossier] = cmbPortee
    Unload Me
    End Sub

  4. #4
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Salut Thautheme,

    Personnelement, dans ta proposition, je placerais un Exit Sub si une condition s'avère vraie.
    Car inutile de passer à la suivante.

    D'autre part, multiplier les conditions me semble lourd.
    Je privilégierais le balayage d'un Array avec un Exit For si l'un des contrôles balayés n'étaient pas informés.

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    MErci beaucoup pour vos réponses


    il fallait que je spécifie également optOui = False



    Pour la array, je vais faire un test car effectivement, c'Est redondant les conditions !!!

  6. #6
    Expert confirmé
    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 : 67
    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
    Billets dans le blog
    7
    Par défaut
    Une indication;
    Tu déclares ton array en lui affectant une variable.
    Cette précaution te servira au balayage, mais aussi à l'alimentation de ta feuille à la condition que j'ai évoquée plus haut.

    Tu reviens si nécessaire.

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Bonjour MArcel,


    Pour etre honete avec vous, je n'ai jamais travailler avec les array ... J'ai posté un post a ce sujet mais bref ca viré dans un autre solution.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_obligatoire = Array(txtNom_dossier, txtNumero, txtNom_anterieur, DTPDate_rencontre, cmbNom_conseiller, cmbNom_tech, cmbType_dossier, cmbPortee)
    JE dois faire un For each (je ne sais pas comment dire ou dois je faire une variable) in liste_obligatoire

    if (je ne sais pas comment dire, un element est false) then





    gros merci pour votre aide et instruction et formation !!!

  8. #8
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,


    Citation Envoyé par MarcelG Voir le message
    Personnelement, dans ta proposition, je placerais un Exit Sub si une condition s'avère vraie.
    Car inutile de passer à la suivante.
    Oui t'as certainement raison ... Problème de lunettes sans doute.

    Je persiste à penser, avec un Array ou pas, que je trouve un compteur inutile et qu'il vaudrait mieux arrêter le code chaque fois qu'un contrôle, qui nécessite l'édition de l'utilisation, est vide. Ce n'est qu'à la fin que les données seront renvoyées dans l'onglet.

  9. #9
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Bonjour Marcel,


    Étant donné que j'ai des combo box, et que je veux garder les préfixes, devrais-je ajouté une condition ou un autre solution serais plus envisageable ???



    en vous remerciant !!!

  10. #10
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Voici la tentative de modification mais j'ai un erreur -2147024809(80070057): Objet spécifié introuvable

    à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Controls("txt" & ctr).Value = "" Then


    du 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
    Private Sub cmdOK_Click()
     
    Dim listetxt As Variant
    Dim listecmb As Variant
    Dim ctr As Variant
    Dim cmb As Variant
    Dim compteur As Byte
    Dim lefocus As Variant
     
    If optOui = True Then
        [premiere_fois] = "OUI"
    ElseIf optNon = True Then
        [premiere_fois] = "NON"
    End If
     
    listetxt = Array([nom_dossier], [numero], [nom_anterieur])
    listecmb = Array([nom_conseiller], [nom_tech], [nom_chef], [type_dossier], [portee], [nom_anterieur])
     
     
    compteur = 0
     
    For Each ctr In listetxt
            If Controls("txt" & ctr).Value = "" Then
                compteur = compteur + 1
            End If
            If compteur = 1 Then
            lefocus = ctr
            End If
    Next ctr
     
    For Each cmb In listecmb
            If Controls("cmb" & cmb).Value = Empty Then
                compteur = compteur + 1
            End If
            If compteur = 1 Then
            lefocus = cmb
            End If
    Next cmb
     
    If compteur > 0 Then
            MsgBox "Il vous reste " & compteur & " champ(s) à compléter"
            Controls("Txt_" & lefocus).SetFocus
            Exit Sub
    Else
            For Each ctr In listetxt
                    Worksheets("Form. démarrage").Range(ctr).Value = Controls("txt" & ctr).Value
            Next ctr
            For Each cmb In listecmb
                    Worksheets("Form. démarrage").Range(cmb).Value = Controls("cmb" & ctr).Value
            Next cmb
            MsgBox "Traitement OK"
            Unload Me
    End If
     
    End Sub

    merci beaucoup !!!

    (Je trouve cela plus complexe que mon code et plus de boucle...)

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

Discussions similaires

  1. [XL-2007] Gestion Erreur dans un userform - CDate
    Par mouftie dans le forum Excel
    Réponses: 4
    Dernier message: 31/03/2014, 13h01
  2. [AJAX] bug ajax ou erreur dans mon code?
    Par tapoutapou dans le forum AJAX
    Réponses: 2
    Dernier message: 06/08/2010, 21h19
  3. Pb pour insérer une msgbox d'erreur dans un userform merci de votre aide
    Par Vincent23 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/08/2008, 16h45
  4. Réponses: 5
    Dernier message: 14/05/2006, 22h41

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