Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2011, 16h24   #1
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
Par défaut problème de zéro

Bonjour, voici un petit code qui fonctionne (presque):
Code :
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?
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 23h25   #2
Membre actif
 
Avatar de Duddy
 
Homme Marc
Agent de maitrise
Inscription : novembre 2007
Messages : 243
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 45
Localisation : France

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

Informations forums :
Inscription : novembre 2007
Messages : 243
Points : 186
Points : 186
Bonsoir le forum,

La textbox retourne un STRING.

Il faut donc convertir:
Code :
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 :
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.
__________________
Bon courage à toi.
Duddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 12h22   #3
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
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.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 11h48   #4
Membre actif
 
Avatar de Duddy
 
Homme Marc
Agent de maitrise
Inscription : novembre 2007
Messages : 243
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 45
Localisation : France

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

Informations forums :
Inscription : novembre 2007
Messages : 243
Points : 186
Points : 186
Bonjour le forum,

Je gérerai la saisie, non pas avec une procédure
Citation:
"_KeyPress"
mais plutôt avec une procédure
Citation:
"_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 :
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 :
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 :
    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.
__________________
Bon courage à toi.
Duddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 14h08   #5
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
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 :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 15h37   #6
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
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 :
 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.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 18h13   #7
Membre actif
 
Avatar de Duddy
 
Homme Marc
Agent de maitrise
Inscription : novembre 2007
Messages : 243
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 45
Localisation : France

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

Informations forums :
Inscription : novembre 2007
Messages : 243
Points : 186
Points : 186
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 :
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 :
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.
__________________
Bon courage à toi.
Duddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 10h19   #8
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
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)
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 11h22   #9
Membre actif
 
Avatar de Duddy
 
Homme Marc
Agent de maitrise
Inscription : novembre 2007
Messages : 243
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 45
Localisation : France

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

Informations forums :
Inscription : novembre 2007
Messages : 243
Points : 186
Points : 186
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
__________________
Bon courage à toi.
Duddy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 14h50   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

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

Code :
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 :
Range("A1") = CDbl(TextBox_ht) ' A adapter
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 14h42   #11
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
@ 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.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 11h51   #12
Membre du Club
 
Homme
Inscription : janvier 2004
Messages : 239
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations forums :
Inscription : janvier 2004
Messages : 239
Points : 63
Points : 63
Envoyer un message via MSN à Chicard
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 :
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.
Chicard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h26.


 
 
 
 
Partenaires

Hébergement Web