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 :

Un UserForm n'affiche pas la bonne valeur d'une variable publique [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut Un UserForm n'affiche pas la bonne valeur d'une variable publique
    Bonjour,

    J'utilise une variable publique (nb) pour passer un nombre dans un UserForm, qui revient dans une boucle, mais ce dernier n'affiche pas le bon nombre (i). En général, il affiche le nombre précédent, voir le nombre attribué lors de la dernière exécution, alors que la variable est initialisée au début...

    L'extrait de macro:
    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
    Public nb As Long
    Public txt As String
     
    Sub test
     
        nb = 0
     
    For i = 3 to 100
     
        Application.Goto Range("B" & i), True
     
        nb = i
        UF_OuiNonAnnuler.Show False
        While UF_OuiNonAnnuler.Visible
            DoEvents
        Wend
     
        Select Case txt
        Case "Oui": GoTo LigneSuivante
        Case "Annuler": Exit Sub
        End Select
     
        'ici code exécuté si on clique sur "Non"
     
    LigneSuivante:
     
    Next
     
    End Sub
    Le code du UserForm:
    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
    Private Sub UserForm_Initialize()
     
        TextBox1.Value = nb
     
    End Sub
     
    Private Sub CommandButton1_Click()
     
        txt = "Oui"
     
        Unload Me
     
    End Sub
     
    Private Sub CommandButton2_Click()
     
        Unload Me
     
    End Sub
     
    Private Sub CommandButton3_Click()
     
        txt = "Annuler"
     
        Unload Me
     
    End Sub
    Toute aide est bienvenue.

    Cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    J'ai la très "mauvaise" habitude de sérier les problèmes.
    Je viens donc de le faire ainsi, puisque la question était d'affecter une valeur à une textbox d'un userform.
    ma macro test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public nb As Long
     
    Sub test()
      nb = 10
      UserForm1.Show False
    End Sub
    et le code de mon userform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
     
        TextBox1.Value = nb
     
    End Sub
    Tout se passe fort bien.
    Conclusion logique : ce n'est pas le passage d'une valeur, qui est ton problème, mais autre chose et bien en amont : la valeur elle-même que tu passes. Et ce problème-là n'a absolument rien à voir avec le fait que tu passes ou non cette valeur à un userform.

    Une "petite" idée : quelle valeur passes-tu en mode pas-à-pas ?
    Si pas la bonne : c'est autre chose que la procédure de passage, qui est à corriger. C'est la détermination de la valeur elle-même.
    Tu suis la logique du pauvre vieillard que je suis ?

    EDIT : et j'ai d'énormes difficultés à comprendre la finalité de ces 3 lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While UF_OuiNonAnnuler.Visible
            DoEvents
     Wend
    Tu veux bien me l'exposer ?

    EDIT 2 : ah oui ! autre chose d'extrêmenent fondamental :
    L'évènement Initialize d'un userform ne s'exécute qu'une seule fois ( à l'initialisation, comme l'indique son nom) . Il ne se redéclenche pas par la méthode Show. La valeur antérieure reste donc celle de l'Initialize antérieur, pardi.
    Un userform subit d'autres évènements (dont l'évènement Activate)

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    J'ajouterais à ce que mentionne unparia (Salut...), les variables Public sont dans le code la feuille ou dans un module ?

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub ouvre_userform()
     
    with mon_userform
    .show 0
    .controls("textbox1").value= "trucbidule"
    end with 
    'pas de variable ca passe directe
    end sub
    et rien dans le initialyse
    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

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    A Dédé6621

    Sois certain (je le suis en ce qui me concerne) que si tu expliquais avec précision la raison de cet étrange mécanisme (tenants et aboutissants) , une solution de type moins "usine" que celle que je devine te serait proposée.
    Je t'ai parlé deux fois de ces Doevents en boucle. Il mettent à mal ton processeur (et son ventilateur dans la foulée), notamment si tu t'attardes un peu trop longtemps sur ton Userform.

  6. #6
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut
    Citation Envoyé par unparia Voir le message
    EDIT 2 : ah oui ! autre chose d'extrêmenent fondamental :
    L'évènement Initialize d'un userform ne s'exécute qu'une seule fois ( à l'initialisation, comme l'indique son nom) . Il ne se redéclenche pas par la méthode Show. La valeur antérieure reste donc celle de l'Initialize antérieur, pardi.
    Un userform subit d'autres évènements (dont l'évènement Activate)
    Bravo! Tu as trouvé d'où vient le souci!
    J'ai essayé avec l'événement Activate et ça marche!


    Citation Envoyé par patricktoulon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub ouvre_userform()
     
    with mon_userform
    .show 0
    .controls("textbox1").value= "trucbidule"
    end with 
    'pas de variable ca passe directe
    end sub
    et rien dans le initialyse
    Autre solution qui marche aussi. Merci. J'ai encore appris quelque chose.


    Citation Envoyé par unparia Voir le message
    Une "petite" idée : quelle valeur passes-tu en mode pas-à-pas ?
    Si pas la bonne : c'est autre chose que la procédure de passage, qui est à corriger. C'est la détermination de la valeur elle-même.
    Tu suis la logique du pauvre vieillard que je suis ?
    En pas-à-pas, comme en exécution normale, la valeur passée est i, c'est-à-dire le numéro de chacune des lignes de 3 à 100.
    Oui, je suis ta logique qui n'est certainement pas à plaindre. Je suis aussi pour diviser les difficultés "en autant de parcelles qu'il se pourrait, et qu'il serait requis pour les mieux résoudre" (René DESCARTES, Méth. II, 8).


    Citation Envoyé par unparia Voir le message
    j'ai d'énormes difficultés à comprendre la finalité de ces 3 lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While UF_OuiNonAnnuler.Visible
            DoEvents
     Wend
    Tu veux bien me l'exposer ?
    Citation Envoyé par unparia Voir le message
    Je t'ai parlé deux fois de ces Doevents en boucle. Il mettent à mal ton processeur (et son ventilateur dans la foulée), notamment si tu t'attardes un peu trop longtemps sur ton Userform.
    ... et je t'avais déjà répondu que cette boucle sert à suspendre l'exécution du code en attendant que nous, pauvres humains, prenions notre temps à cliquer sur l'un ou l'autre des boutons du UserForm. Sans elle, en non modal, le code continuerait sa course folle, ce qui poserait quelques problèmes. Mais peut-être qu'une mise en attente sans DoEvents est possible? Avec un "contrôle Timer" apparemment" (entrée "DoEvents, fonction" de l'aide VBA)?
    Ce DoEvents, m'interloque depuis ma 1ère question. Il "passe la main au système d'exploitation", ok. Mais concrètement, qu'est-ce que cela entraîne?


    Citation Envoyé par unparia Voir le message
    Sois certain (je le suis en ce qui me concerne) que si tu expliquais avec précision la raison de cet étrange mécanisme (tenants et aboutissants) , une solution de type moins "usine" que celle que je devine te serait proposée.
    Comment aurais-je pu connaître "la raison de cet étrange mécanisme"? Je l'ignorais et c'est la raison pour laquelle j'ai ouvert cette discussion.
    Je fais mon possible pour être le plus précis possible, mais si tu penses que j'aurais pu mieux faire, je suis toujours ouvert aux suggestions.


    Citation Envoyé par parmi Voir le message
    les variables Public sont dans le code la feuille ou dans un module ?
    Les variables Public sont dans un module à part.



    Un grand merci à vous! Le problème a disparu


  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 162
    Billets dans le blog
    53
    Par défaut
    Bonjour Unparia;
    EDIT 2 : ah oui ! autre chose d'extrêmenent fondamental :
    L'évènement Initialize d'un userform ne s'exécute qu'une seule fois ( à l'initialisation, comme l'indique son nom) . Il ne se redéclenche pas par la méthode Show. La valeur antérieure reste donc celle de l'Initialize antérieur, pardi.
    Un userform subit d'autres évènements (dont l'évènement Activate)
    Tout dépend de la manière dont on ferme le UserForm
    Ce que tu dis est vrai si l'on utilise Me.Hide mais avec l'instruction Unload Me ce que personnellement j'utilise toujours.

    Code dans le UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton1_Click()
     Unload Me
    End Sub
    Private Sub UserForm_Activate()
     MsgBox "Activate"
    End Sub
    Private Sub UserForm_Initialize()
     MsgBox "Initialize"
    End Sub
    Code dans le module qui lance le UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Main()
     UserForm1.Show
     MsgBox "Ok pour un nouveau lancement"
     UserForm1.Show
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Philippe Tulliez
    Regarde bien le premier message du demandeur. Il met en exergue l'existence d'un mécanisme de "va-et-vient" entre feuille et userform, ce dernier étant toujours bien "vivant".
    Ce qui tend à expliquer la boucle while que je remets d'ailleurs en cause en raison de tout ce qu'elle inflige dans certains cas au processeur.

    C'est la raison pour laquelle j'invitais notre ami à exposer les tenants et aboutissants de son mécanisme. De sorte à lui en suggérer un autre plus sage et efficace.

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 162
    Billets dans le blog
    53
    Par défaut
    Bonjour Unparia,
    Regarde bien le premier message du demandeur. Il met en exergue l'existence d'un mécanisme de "va-et-vient" entre feuille et userform, ce dernier étant toujours bien "vivant"
    Je n'ai pas lu cette discussion ma remarque ne visait que la partie EDIT 2 de ton message.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. Requete qui n'affiche pas les bonnes valeurs
    Par snips67 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/01/2010, 10h54
  2. Pourquoi ce code ne m'affiche pas la bonne valeur ?
    Par Mr. X dans le forum Débuter
    Réponses: 20
    Dernier message: 19/09/2008, 09h48
  3. Réponses: 19
    Dernier message: 12/12/2007, 09h10
  4. Réponses: 1
    Dernier message: 10/05/2007, 17h14
  5. [SQL] Pb Mysql n'insert pas les bonnes valeur dans la bdd
    Par potao dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 11/02/2007, 03h12

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