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 :

[E-03] Affecter le contenu d'une textbox à une variable numérique


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut [E-03] Affecter le contenu d'une textbox à une variable numérique
    Bonsoir,

    J'ai un petit problème pour effectuer des calculs avec des nombres saisis dans une textbox.

    Lorsque j'exécute le code en mode pas-à-pas, je me rends compte que j'arrive bien à récupérer la valeur numérique saisie dans une textbox mais je n'arrive pas à l'affecter à une variable numérique.

    Le userform que j'utilise sert à saisir des dimensions pour faire de bêtes calculs de longueurs, surfaces ou volumes.
    Ca ressemble à ça (je sais c'est moche mais au moins c'est simple ):




    Et voici le bout de code en question (j'ai mis en gras la partie qui me sert de test, donc en l'occurrence calculer l'aire d'un rectangle):



    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
    Private Sub Ok_Click()
    
    Dim Result As Single
    
    If OptionLin.Value = True Then
        Result = DimLin
        If OptionCer.Value = True Then
            Result = Pi * Diam / 2
            If OptionRec.Value = True Then
                Result = CSng(LongRec) * CSng(LargRec)
                If OptionTri.Value = True Then
                    Result = (BaseTri * HTri) / 2
                    If OptionTrap.Value = True Then
                        Result = HTrap * (GBase * PBase) / 2
                        If OptionDisc.Value = True Then
                            Result = Pi * DiamDisc ^ 2 / 4
                            If OptionTran.Value = True Then
                                Result = LongTran * LargTran * ProfTran
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End If
        
    Sheets("Feuil1").Select
    ActiveCell.Range("A1") = Result
    
    Unload MS
    
    End Sub
    Donc comme je l'expliquais auparavant quand je teste ce code en mode pas-à-pas et que je suis arrêté sur le End If, je peux voir en passant le curseur sur le code que CSng(LongRec) vaut ce que j'ai saisi, CSng(LargRec) aussi mais Result vaut 0 (LongRec et LargRec sont les noms des textbox).


    Je suis totalement débutant donc soyez cléments avec moi

    Merci d'avance

  2. #2
    Membre régulier Avatar de DidierLoche
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 84
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    Bizarre, chez moi, ça marche bien (Excel 2003). Quelle version d'Excel tu utilises ? Quel séparateur décimal utilises-tu (le point ou la virgule) ? Comment sont définis LongRec et LargRec ?
    J'ai créé un userform et deux textbox (TextBox1 et TextBox2). Le code suivant marche quel que soit le séparateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub toto()
    Dim a As Single
    UserForm1.TextBox1 = "2,9"
    UserForm1.TextBox2 = "8.9"
    a = CSng(UserForm1.TextBox1) * CSng(UserForm1.TextBox2)
    End Sub
    Didier

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'utilise Excel 2003 au boulot et 2007 chez moi (en enregistrant en mode compatibilité 97-2003 mais vu la simplicité du code je ne pense pas que cela change grand chose entre 2007 et 2003).

    Je n'ai même pas rentré de nombres avec des décimales pour le moment...je fais le test en mettant 2 et 3.

  4. #4
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    bonsoir,

    au cas où , rajoute la ligne :
    en haut de ton code .

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par JackOuYA Voir le message
    bonsoir,

    au cas où , rajoute la ligne :
    en haut de ton code .
    => C'est fait, mais à part Pi que j'ai du déclarer comme constante (c'est bête mais je pensais qu'il connaissait) tout est bon et rien n'a changé

  6. #6
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    ok donc les noms de tes variables sont bons, mais peu-être ne passe tu pas où tu devrai essai de rajouter un stop et regarde l'état de tes variables à ce moment la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Result = CSng(LongRec) * CSng(LargRec)
    stop

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'ai déjà essayé...mais il faut que je m'arrête au moins après le dernier End If pour pouvoir lire l'état des variables.
    Avant, il ne m'affiche rien quand je passe le curseur sur les éléments.
    Après, il m'affiche par exemple 2 pour CSng(LongRec), 3 pour CSng(LargRec)
    et toujours 0 pour Result.

  8. #8
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    tu as bien rajouté l'instruction stop ? je pense pas , tu aurai du avoir un autre commentaire

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Ben j'avais fait avec le point rouge à gauche dans la marge...mais avec stop même résultat à la différence près que si je le mets à la ligne Résult=... il ne m'affiche pas le code avec stop surligné en jaune. Alors que si je le place après le dernier End If, le code s'affiche avec stop surligné en jaune

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Bonsoir Sclarck1, DidierLoche, JackOuYA,

    Citation Envoyé par Sclarck1 Voir le message
    J'ai déjà essayé...mais il faut que je m'arrête au moins après le dernier End If pour pouvoir lire l'état des variables.
    Avant, il ne m'affiche rien quand je passe le curseur sur les éléments.
    Après, il m'affiche par exemple 2 pour CSng(LongRec), 3 pour CSng(LargRec)
    et toujours 0 pour Result.
    Pour info, si tu mets un point d'arrêt dans le code (ou utilise l'instruction Stop) et que tu n'as pas la valeur de la variable en bulle d'info, tu peux tout de même obtenir cette valeur en sélectionnant la dite variable et en faisant Maj + F9 (ce qui correspond à menu Débogage / Espion Express). Tu peux même sélectionner une opération de calcul entière et tu obtiendras le résultat correspondant. Ce n'est bien sûr valable, que pour les valeurs situées en amont du point d'arrêt.

    Pour ma part, je pense comme JackOuYA : car visiblement, lors du calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result = CSng(LongRec) * CSng(LargRec)
    ta variable Result doit avoir la bonne valeur (soit 6 pour ton exemple avec 2 et 3). Tout ça, à condition bien sûr que OptionLin, OptionCer et OptionRec soient bien égales à True.

    Mais ton code continue après ce calcul... et je parierais volontiers que "OptionTrap.Value" vaut "True" ensuite. Ce qui implique que ta variable Result subit au moins un autre calcul lui donnant la valeur 0 par la suite...

    Par ailleurs, Pi n'est effectivement pas reconnu par VBA, mais tu peux utiliser Application.Pi

    Cordialement,
    Didier_mDF

  11. #11
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Citation Envoyé par Sclarck1 Voir le message
    Ben j'avais fait avec le point rouge à gauche dans la marge...mais avec stop même résultat à la différence près que si je le mets à la ligne Résult=... il ne m'affiche pas le code avec stop surligné en jaune. Alors que si je le place après le dernier End If, le code s'affiche avec stop surligné en jaune
    non s'il "n'affiche pas le stop en jaune" lorsque tu le place juste aprés ta ligne résult c'est que ton code ne parcours pas cette ligne !

    Il faut revoir ton imbrication de IF ...!

    comme le dit myDearFriend pour que ton code fonctionne il faut:
    Citation Envoyé par myDearFriend! Voir le message
    ...
    Pour ma part, je pense comme JackOuYA : car visiblement, lors du calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result = CSng(LongRec) * CSng(LargRec)
    ta variable Result doit avoir la bonne valeur (soit 6 pour ton exemple avec 2 et 3). Tout ça, à condition bien sûr que OptionLin, OptionCer et OptionRec soient bien égales à True.
    ..
    Le seul probléme c'est que dans ton cas ces variables (OptionLin...) sont des cases à option, et donc tu ne peu en avoir qu'une à true...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Citation Envoyé par JackOuYA Voir le message
    ... Le seul probléme c'est que dans ton cas ces variables (OptionLin...) sont des cases à option, et donc tu ne peu en avoir qu'une à true...
    Arf , tu as tout à fait raison JackOuYa, je n'avais même pas fait attention à l'image du USF !

    Il est donc impossible à "Result = CSng(LongRec) * CSng(LargRec)" d'être interprété. Bravo pour l'analyse.

    Cordialement,

  13. #13
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'ai peur de ne pas vous suivre...

    Dans mon code, je teste successivement la valeur True ou False de tous mes OptionButton pour savoir lequel d'entre eux est coché.
    Comme vous le dites (et ça je l'avais bien en tête du départ), un seul d'entre peut être à 1 alors que tous les autres sont à 0.
    Donc il ne devrait y avoir qu'un seule ligne après les Then qui soit lue et toutes les autres ignorées...et je ne comprends donc pas comment Result ne pourrait pas être "interprété" (pas sûr du sens que vous donnez à ce mot) puisque il n'y a pas d'ambiguïté (seul une seule ligne Result=... devrait être prise en compte).

    Donc apparemment, le problème vient du fait que j'ouvre la condition avec If et que je referme plusieurs lignes de code après mon End If et qu'entre temps il y a d'autres conditions au milieu.
    Mais je ne comprends pas pourquoi les lignes de code "au milieu posent problème puisque elle devraient être ignorées vu que la condition de test est fausse.

    En tout cas un grand merci car en faisant les test juste avec If...Then (donc sans le End If) ça fonctionne

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Re,
    Citation Envoyé par Sclarck1 Voir le message
    J'ai peur de ne pas vous suivre...

    Dans mon code, je teste successivement la valeur True ou False de tous mes OptionButton pour savoir lequel d'entre eux est coché.
    Comme vous le dites (et ça je l'avais bien en tête du départ), un seul d'entre peut être à 1 alors que tous les autres sont à 0.
    Donc il ne devrait y avoir qu'un seule ligne après les Then qui soit lue et toutes les autres ignorées...et je ne comprends donc pas comment Result ne pourrait pas être "interprété" (pas sûr du sens que vous donnez à ce mot) puisque il n'y a pas d'ambiguïté (seul une seule ligne Result=... devrait être prise en compte).

    Enfin j'imagine que je me trompe quelque part dans mon raisonnement et j'aimerais bien savoir où ! Merci d'avance
    Tes If sont imbriqués, cela signifie en particulier que si la première condition ne vaut pas True, alors les autres conditions ne seront même pas lues dans le déroulement du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If OptionLin.Value = True Then  '--> si False, alors on passe directement à End If sans interpréter le code à l'intérieur
        Result = DimLin
        If OptionCer.Value = True Then
            Result = Pi * Diam / 2
            If OptionRec.Value = True Then
                Result = CSng(LongRec) * CSng(LargRec)
    Une solution simple pour toi, est de faire par exemple comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If OptionLin.Value = True Then
        Result = DimLin
    ElseIf OptionCer.Value = True Then
        Result = Pi * Diam / 2
    ElseIf OptionRec.Value = True Then
        Result = CSng(LongRec) * CSng(LargRec)
    ...
    End If
    Cordialement,
    Didier_mDF

  15. #15
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Ok...got it !

    J'ai même fait plus simplement je crois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If OptionLin.Value = True Then Result = CSng(DimLin)
      If OptionCer.Value = True Then Result = Pi * CSng(Diam) / 2
        If OptionRec.Value = True Then Result = CSng(LongRec) * CSng(LargRec)
          If OptionTri.Value = True Then Result = (CSng(BaseTri) * CSng(HTri)) / 2
            If OptionTrap.Value = True Then Result = CSng(HTrap) * (CSng(GBase) + CSng(PBase)) / 2
              If OptionDisc.Value = True Then Result = Pi * CSng(DiamDisc) ^ 2 / 4
                If OptionTran.Value = True Then Result = CSng(LongTran) * CSng(LargTran) * CSng(ProfTran)

    Ca ne devrait pas poser de problème non ?

    Sinon j'ai un autre petit problème (je sais je n'arrête pas )...
    Je voudrais pouvoir aussi rentrer des mesures du style 2+3 dans mes textbox et que ces opérations saisies soient d'abord évaluées numériquement avant d'être réutilisées pour calculer Result (sinon ça plante évidemment).

    On m'avait suggéré d'utiliser Evaluate dans un autre topic mais dans l'aide Excel (d'après ce que j'ai compris) cette méthode s'applique à des noms d'objets

    Une suggestion ??

  16. #16
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox application.Evaluate ("2+3")

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Ok.

    Oui, ta façon d'agencer les If doit être tout à fait recevable. Cela dit, je vais chipoter un peu car sauf erreur :
    • avec les ElseIf, dès qu'une condition sera considérée comme remplie (= True), l'interpréteur passera ensuite directement à End If et ne cherchera pas à évaluer les conditions suivantes.
    • Avec ta façon de faire, tous les If seront testés.
    Quant à Evaluate, je pense que c'est la piste à explorer.

    Par exemple, soit un TextBox1 dans lequel tu saisiras "2 + 3" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Evaluate(TextBox1.Text)
    devrait t'afficher le bon résultat.

    Cordialement,
    Didier_mDF

    EDITION:
    Pardon JackOuYA, je n'avais pas vu ton retour...

  18. #18
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Génial ça fonctionne avec Evaluate, j'avais déjà essayé mais comme je n'avais pas spécifié dans l'argument la propriété .Text de ma textbox ça me renvoyait une erreur

    Ok.

    Oui, ta façon d'agencer les If doit être tout à fait recevable. Cela dit, je vais chipoter un peu car sauf erreur :

    * avec les ElseIf, dès qu'une condition sera considérée comme remplie (= True), l'interpréteur passera ensuite directement à End If et ne cherchera pas à évaluer les conditions suivantes.
    * Avec ta façon de faire, tous les If seront testés.
    J'ai compris...du coup l'éxécution sera plus rapide avec ta syntaxe. Tu as raison de chipoter car je trouve que ces subtilités ont de l'importance.

    En tout cas un grand merci à vous deux car grâce à vous la partie fonctionnelle de mes macros est bonne

    Je vous embêterais peut-être plus tard pour améliorer l'ergonomie.
    Bon weekend.

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

Discussions similaires

  1. Affecter une richtext à une textbox ?
    Par gastoncs dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/10/2011, 03h16
  2. Réponses: 2
    Dernier message: 23/12/2009, 14h33
  3. Lier les données d'une textbox à une autre
    Par Popeye63 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/11/2009, 17h51
  4. Affecter le contenu du presse papier à une variable
    Par riri2938 dans le forum VBA Access
    Réponses: 7
    Dernier message: 14/02/2009, 17h44
  5. Agrandir une bouton, une textbox, .Impossible
    Par Thesum dans le forum Visual Studio
    Réponses: 3
    Dernier message: 28/05/2008, 10h14

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