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 :

problème de zéro [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut problème de zéro
    Bonjour, voici un petit code qui fonctionne (presque):
    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
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
        'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
        TextBox_ht = IIf(IsNumeric(TextBox_ht), Format(TextBox_ht, "###0.00"), "")
     
    End Sub
     
    Private Sub TextBox_ht_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entré
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_ht) = 1 And TextBox_ht = "." Then TextBox_ht = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_ht.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_ht.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_ht.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_ht.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_ht.Value, ".") <> 0 And Len(TextBox_ht.Value) > InStr(TextBox_ht.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub
    Le souci c'est qui si j'ai le malheur de tapé par exemple 13.2 et que j'appuie sur "entré" ou "tab" il me vide ma textbox au lieu de me mettre 13.20.

    Donc mon code complète bien mon entier avec deux 0 mais pas mon chiffre à virgule lorsque il en faut un à la fin.

    Une idée?

  2. #2
    Membre actif Avatar de Duddy
    Homme Profil pro
    Agent de maitrise
    Inscrit en
    Novembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Agent de maitrise
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 257
    Points : 237
    Points
    237
    Par défaut
    Bonsoir le forum,

    La textbox retourne un STRING.

    Il faut donc convertir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
        'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
        TextBox_ht = IIf(IsNumeric(TextBox_ht), Format(TextBox_ht, "###0.00"), "")
     
    End Sub
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
        'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
        Dim vResult As Variant
        TextBox_ht = "13.2"
        vResult = Replace(TextBox_ht, ".", ",")
        vResult = CDbl(vResult)
        TextBox_ht = IIf(IsNumeric(vResult), Format(vResult, "###0.00"), "")
        TextBox_ht = Replace(TextBox_ht, ",", ".")
     
    End Sub
    J'ai testé sur mon PC, ça a fonctionné, mais je deviens prudent quand à la certitude.

    Teste et tu nous diras.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut
    En rentrant en dur la valeur, ça doit marcher. mais comme ma valeur n'est pas fixe ( 13.2 étant une valeur exemple) cela ne fonctionne pas car j'ai une erreur au niveau de la conversion de ma textbox en double.

    Je vais essayé de passé par une variable.
    Par ailleurs je ne cherche pas à remplacer mon point par une virgule ce que font tes lignes replace si je ne me trompe pas.

    Apparemment c'est un problème de conversion de type.

    après tests, avec une valeur en dur j'ai mon 0 qui s'affiche à la fin de ma valeur de type xx.x (ex: 12.30 à l'arrivée) avec une valeur non fixe j'ai bien mon 00 quand c'est un tpe xx (ex:12.00 à l'arrivée).

    Mais toujours pas de moyen pour avoir un ou deux zéro à l'arrivé d'un nombre quelconque.

    bon je laisse tomber par contre je voudrais bien une solution pour éviter que ma valeur disparaisse lorsque je valide ou change de textbox.

  4. #4
    Membre actif Avatar de Duddy
    Homme Profil pro
    Agent de maitrise
    Inscrit en
    Novembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Agent de maitrise
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 257
    Points : 237
    Points
    237
    Par défaut
    Bonjour le forum,

    Je gérerai la saisie, non pas avec une procédure
    "_KeyPress"
    mais plutôt avec une procédure
    "_Change"
    cela pourrait peut-être éviter, que l'action sur la touche entrée, alors que tu es toujours sur la textbox, ne soit prise en compte.

    Cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_ht.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
    je la gérerai ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_ht.Value, ".") <> 0 And Chr(KeyAscii) = "." Then TextBox_ht.Value=TextBox_ht.Value
    Ainsi que celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If InStr(TextBox_ht.Value, ".") <> 0 And Len(TextBox_ht.Value) > InStr(TextBox_ht.Value, ".") + 1 Then TextBox_ht.Value=TextBox_ht.Value
    Teste et dis-nous.

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    L’expression retournée par ta TextBox n’est pas interprétée comme un nombre, ce qui explique que la valeur disparait lorsque tu quittes la TextBox.

    J’ai adapté ton code pour que le point soit remplacé par une virgule.
    J’ai effectué le test et le résultat me semble correct.
    Par contre, je ne suis pas parvenu à obtenir un résultat probant en modifiant le séparateur décimal dans les options avancées.

    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
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
        TextBox_ht = IIf(IsNumeric(TextBox_ht), Format(TextBox_ht, "###0.00"), "")
    End Sub
    Private Sub TextBox_ht_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entré
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_ht) = 1 And TextBox_ht = "." Then TextBox_ht = "0,"
     
        'Si le caractère saisi est un point, on le remplace par une virgule
        If Chr(KeyAscii) = "." Then KeyAscii = 44
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_ht.Value, ",") <> 0 And Chr(KeyAscii) = "," Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_ht.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_ht.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_ht.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_ht.Value, ",") <> 0 And Len(TextBox_ht.Value) > InStr(TextBox_ht.Value, ",") + 1 Then KeyAscii = 0
     
    End Sub
    A ton tour de tester.
    Cordialement.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut
    Mettre _change à la place d'un _keypress ne servira pas à grand chose car je peux retourner dans ma textbox même si je valide le résultat car je sors de mon formulaire pas un bouton.

    Les lignes que tu m'as donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If InStr(TextBox_ht.Value, ".") <> 0 And Len(TextBox_ht.Value) > InStr(TextBox_ht.Value, ".") + 1 Then TextBox_ht.Value=TextBox_ht.Value
    ne résolve pas mon souci.

    Je ne veux pas changer mon point par une virgule, et je pense pas que ce soit la solution pour obtenir un zéro dans le cas d'un nombre du style 12.3

    J'ai vu hier soir que j'avais false dans le retour de IsNumeric(textbox_...)

    J'ai mon résultat qui passe sans le zéro à la fin en le passant dans une variable mais je perds aussi les deux 00 automatique lors de la mise d'un entier dans ma textbox.

    Au pire avec un seul chiffre pas de souci ma colonne devrait le gérer mais pas si j'ai plusieurs valeurs


    Aucun affichage dans ma cellule avec le passage par variable string. Vu que la conversion d'un string ne marche pas je me retrouve dans une impasse. J'ai vraiment plus aucune idée.

  7. #7
    Membre actif Avatar de Duddy
    Homme Profil pro
    Agent de maitrise
    Inscrit en
    Novembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Agent de maitrise
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 257
    Points : 237
    Points
    237
    Par défaut
    Bonjour le forum,

    Je me suis créé un formulaire tout simple sur lequel j'ai placé une TEXTBOX et un BOUTON.

    J'ai posé ton code comme 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
    24
    25
    26
    27
    28
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        'Si la valeur de textbox_ht est un nombre sans virgule alors on rajoute la virgule et deux 0
        Dim vResult As Variant
        'TextBox_ht = "13.2"
        vResult = Replace(TextBox_ht.Value, ".", ",")
        vResult = CDbl(vResult)
        TextBox_ht = IIf(IsNumeric(vResult), Format(vResult, "###0.00"), "")
        TextBox_ht = Replace(TextBox_ht, ",", ".")
     
    End Sub
     
    Private Sub TextBox_ht_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        'Seule une valeur numérique peut être entré
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_ht) = 1 And TextBox_ht = "." Then TextBox_ht = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_ht.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_ht.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_ht.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_ht.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_ht.Value, ".") <> 0 And Len(TextBox_ht.Value) > InStr(TextBox_ht.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub
    J'ai saisi :

    • 0 et "tabuler" => le résultat dans la textbox a été 0.00

    • 12.3 et "entrée" => le résultat dans la textbox a été 12.30


    J'ai ensuite posé un label :

    Après appui sur la touche "ENTREE" puis clic sur le bouton le label a affiché la même info que ci-dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
        Me.Label1.Caption = TextBox_ht.Value
    End Sub
    Je ne vois pas comment tu ne peux obtenir la même chose, tu dois avoir autre chose qui ne va pas.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut
    J'ai passé tout mon code en commentaire sauf la partie sur mon textbox et même avec ton code (mis à part le bouton puisque avant de valider dans ma cellule je cherche quand même à pouvoir ma valeur) ça ne fonctionne pas (même excel mais sous seven chez moi)

    effectivement si je tape 0 j'ai 0.00 mais cela le fait avec n'importe quelle entier de 0 à 9999999....

    par contre pour 12.3 j'obtiens rien ma valeur disparaît comme avant que j'appuie sur "tab" ou "entrée".

    mon bouton ne sert qu'à envoyer tout mes champs dans les cellules désignées avant (mais actuellement il ne fait rien puisque tout est en commentaire)

  9. #9
    Membre actif Avatar de Duddy
    Homme Profil pro
    Agent de maitrise
    Inscrit en
    Novembre 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Agent de maitrise
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2007
    Messages : 257
    Points : 237
    Points
    237
    Par défaut
    Bonjour le forum,

    Je suis surpris, car comme je te l'ai dit sur le formulaire que j'ai créé pour tester ton code l'action sur "TAB" ou "ENTREE" réalise bien ce que tu demandes. Je suis sur 2007.

    Si tu essaies de faire comme moi dans un nouveau fichier cela fonctionne-t-il?

    J'ai été au plus simple Formulaire Textbox CMD et label

  10. #10
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Voici un code qui fonctionne quel que soit le séparateur de décimale (point ou virgule).

    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
    Private Sub TextBox_ht_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If TextBox_ht <> "" Then
        'Si le séparateur décimal déclaré est le point, on le remplace par une virgule
        If Application.International(xlDecimalSeparator) = Chr(46) Then TextBox_ht = Replace(TextBox_ht, ".", ",")
        TextBox_ht = Format(CDbl(TextBox_ht), "###0.00")
        'Copie dans une cellule pour vérifier le format
        Range("A1") = CDbl(TextBox_ht) ' A adapter
    End If
    End Sub
     
    Private Sub TextBox_ht_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        KeyAscii = ControleSaisie(TextBox_ht, KeyAscii)
    End Sub
     
    Function ControleSaisie(Textbox As MSForms.Textbox, ByVal Char As Integer)
    Dim SepaDeci As String
        'On relève le séparateur décimal utilisé (virgule ou point)
        SepaDeci = Application.International(xlDecimalSeparator)
        'Si le caractère saisi est une virgule ou un point
        If Char = 44 Or Char = 46 Then
            'Si le caractère saisi est identique au séparateur décimal déclaré
            If Chr(Char) = SepaDeci Then
                'Si un autre séparateur décimal est présent, on annule la saisie
                If InStr(1, Textbox, SepaDeci, vbTextCompare) > 0 Then
                    ControleSaisie = 0
                Else
                    'S'il s'agit du premier caractère, on ajoute un zéro avant le séparateur
                    If Len(Textbox) = 1 Then
                        ControleSaisie = "0" & Asc(SepaDeci)
                    'Sinon, on enregistre la saisie
                    Else
                        ControleSaisie = Asc(SepaDeci)
                    End If
                End If
            'Sinon, on remplace le séparateur saisi par le séparateur déclaré
            Else
                ControleSaisie = Asc(SepaDeci)
            End If
        Else
            If Char < 48 Or Char > 58 Then
                ControleSaisie = 0
            Else
                ControleSaisie = Char
            End If
        End If
    End Function
    Dans la procédure Sub TextBox_ht_Exit, j’ai rajouté une ligne de code pour vérifier le fonctionnement de la copie du résultat dans une cellule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1") = CDbl(TextBox_ht) ' A adapter
    Cordialement.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut
    @ duddy : j'ai suivi ton conseille pris ton code et créé un formulaire tout simple et effectivement cela marche.

    Du coup je ne vois pas pourquoi cela ne marche pas dans mon projet vu que tout est en commentaire.


    Maintenant je viens de le retester dans mon code en enlevant tout puis en remettant tout et finalement ça marche donc c'est mon code dans la textbox qui est foireux mais je ne sais pas pourquoi.

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Points : 95
    Points
    95
    Par défaut
    je m'excuse de rouvrir le topic mais j'ai une incompatibilité de type alors que ce code et 4 fois le même et sans souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Sub TextBox_ttc_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        
        'Si la valeur de textbox_ttc est un nombre sans virgule alors on rajoute la virgule et deux 0
        Dim vResult_ttc As Variant
        
        vResult_ttc = Replace(TextBox_ttc.Value, ".", ",")
        vResult_ttc = CDbl(vResult_ttc)arrêt du code iciavec écrit incompatibilité de type
        TextBox_ttc = IIf(IsNumeric(vResult_ttc), Format(vResult_ttc, "###0.00"), "")
        TextBox_ttc = Replace(TextBox_ttc, ",", ".")
        
    End Sub
    s'il y a un souci quelque part je le vois pas. Et vous? C'est bon c'était un problème au niveau remplissage de la ligne qui était ailleurs.

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

Discussions similaires

  1. [PROC] Import : problème de zéros
    Par doudou29 dans le forum SAS Base
    Réponses: 1
    Dernier message: 06/05/2013, 22h40
  2. Problème de zéro binaire dans un record
    Par thefifou dans le forum C
    Réponses: 7
    Dernier message: 23/06/2010, 12h39
  3. [MySQL] Problème différenciation entre valeur null et zéro
    Par stefsas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/03/2010, 16h44
  4. Problème de zéro
    Par alexandrebergercyr dans le forum Access
    Réponses: 3
    Dernier message: 07/02/2007, 21h42
  5. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41

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