Textbox et problème de validation

olivepao

XLDnaute Occasionnel
Textbox numérique et problème de validation

Salut à tous les connectés et futurs connectés du forum :p

Dans un Userform, je rencontre deux petits problèmes avec des Texbox qui ne doivent avoir qu'une valeur numérique entière (sans décimales).

J'ai donc deux Textbox appelés SaisieTauxOccup et SaisieTauxDesir. Ces deux Textbox sont à l'intérieur d'une Frame.

1er problème

Les décimales sont parfois acceptées parfois non . . . allez savoir pourquoi !

2ème problème

Lorsque je sors du deuxième Textbox le resultat du test (s'il y a une erreur de saisie) qui doit s'afficher dans un Msgbox ne s'affiche pas.

De plus je n'ai pas de controle sur d'autres Textbox ou OptionButton ou CheckBox.

Tout rendre dans l'ordre si je fais un clic avec la sours dans la Frame de ces deux Textbox.

Merci à tous les connectés qui voudront bien m'aider. Je ne peux pas joindre de fichier car ce dernier est trop lourd. Mais j'espère que les fortiches s'en sortiront avec les deux procédures ci-dessous.

Code:
Private Sub SaisieTauxOccup_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' <-- Validité du %age Occupation - Numérique entier obligatoire et % compris entre 40 et 100
On Error Resume Next

If Not IsNumeric(Right(SaisieTauxOccup, 1)) Then
    MsgBox "Veuillez saisir un nombre entier   !" + Chr$(13) + Chr$(13), _
                vbOKOnly + vbExclamation, "                        -  ERREUR DE SAISIE  -          "
    SaisieTauxOccup = Left(SaisieTauxOccup, Len(SaisieTauxOccup) - 1)
    Cancel = True
    SaisieTauxOccup.Value = ""
    SaisieTauxOccup.SetFocus
    Exit Sub
End If

If SaisieTauxOccup.Value > 100 Or SaisieTauxOccup.Value < 40 Then
                         MsgBox "Veuillez saisir un taux d'occuption correct svp." + Chr$(13) + Chr$(13) _
                                   & "Le taux est compris entre 40 et 100 %   !         " + Chr$(13) + Chr$(13), _
                                   vbOKOnly + vbExclamation, "                        -  ERREUR DE SAISIE  -          "
                           Cancel = True
                           SaisieTauxOccup.Value = ""
                           SaisieTauxOccup.SetFocus
End If

End Sub


Code:
Private Sub SaisieTauxDesir_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' <-- Validité du %age Désiré - Numérique entier obligatoire et % compris entre 10 et non supérieur à Occupation
On Error Resume Next

If Not IsNumeric(Right(SaisieTauxDesir, 1)) Then
    MsgBox "Veuillez saisir un nombre entier   !" + Chr$(13) + Chr$(13), _
                vbOKOnly + vbExclamation, "                        -  ERREUR DE SAISIE  -          "
    SaisieTauxDesir = Left(SaisieTauxDesir, Len(SaisieTauxDesir) - 1)
    Cancel = True
    SaisieTauxDesir.Value = ""
    SaisieTauxDesir.SetFocus
    Exit Sub
End If

If SaisieTauxDesir.Value < 10 Or SaisieTauxDesir.Value > SaisieTauxOccup.Value Then
                         MsgBox "Veuillez saisir un taux désiré correct svp. " + Chr$(13) + Chr$(13) _
                                   & "Le taux est compris entre 10 % et le taux d'occupation réel   !   " + Chr$(13) + Chr$(13), _
                                   vbOKOnly + vbExclamation, "                        -  ERREUR DE SAISIE  -          "
                           Cancel = True
                           SaisieTauxDesir.Value = ""
                           SaisieTauxDesir.SetFocus
End If
End Sub

A++ et Bon App à ceux qui vont faire comme moi !
 
Dernière édition:

olivepao

XLDnaute Occasionnel
Re : Textbox numérique et problème de validation

Bonsoir le forum ou plutôt bonne nuit, vue l'heure matinalement tardive. :)

J'ai résolu en grande partie mon problème que j'ai posté jeudi soir.

Le 1er problème concernant les décimales est complètement résolu. J'ai

ajouté le code ci-dessous qui reconnait la virgule et le point comme une décimale :

Code:
Textbox1.Text = Replace(Textbox1.Text, ".", ",")  ' <-- la virgule et le point sont le séparateur décimal

Le 2ème problème est également résolu. J'ai remplacé les procédures

Private Sub SaisieTauxOccup_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Private Sub SaisieTauxDesir_Exit(ByVal Cancel As MSForms.ReturnBoolean)

par les procédures

Private Sub SaisieTauxOccup_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

Private Sub SaisieTauxDesir_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

Tout va bien me direz-vous ! Hé bien non je me retrouve avec un petit problème que je vous décris :

La deuxième procédure qui est quasi identique à la première me cause un petit soucis sur l'affichage des Msgbox. Si je fais une erreur de saisie, le message d'erreur adéquat s'affiche normalement. Lorsque je clique sur le OK de la Msgbox, le deuxième message de l'autre possibilité d'erreur s'affiche ou boucle une deuxième fois sur le premier.

J'informe que rien de tel ne se passe dans la première procédure.

Je poste à nouveau mes procédures que j'ai légèrement modifiées mais qu'il est certainement utile de remettre.


Code:
Private Sub SaisieTauxOccup_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
' <-- Validité du %age Occupation - Numérique entier obligatoire et % compris entre 40 et 100
On Error Resume Next

SaisieTauxOccup.Text = Replace(SaisieTauxOccup.Text, ".", ",")  ' <-- la virgule et le point sont le séparateur décimal

If Not IsNumeric(Right(SaisieTauxOccup, 1)) Then
        MsgBox "SVP Veuillez saisir un nombre entier   !" + Chr$(13) + Chr$(13), _
        vbOKOnly + vbExclamation, "                            -  ERREUR DE SAISIE  -"
    SaisieTauxOccup = Left(SaisieTauxOccup, Len(SaisieTauxOccup) - 1)
    Cancel = True
    SaisieTauxOccup = ""
    SaisieTauxOccup.SetFocus
    Exit Sub
Else
    Cancel = False
End If

If SaisieTauxOccup > 100 Or SaisieTauxOccup < 40 Then
        MsgBox "SVP Veuillez saisir un taux d'occuption correct." + Chr$(13) + Chr$(13) _
        & "Le taux d'occupation est compris entre 40 et 100 %   !" + Chr$(13) + Chr$(13), _
        vbOKOnly + vbExclamation, "                                          -  ERREUR DE SAISIE  -"
    Cancel = True
    SaisieTauxOccup = ""
    SaisieTauxOccup.SetFocus
End If

End Sub


Code:
Private Sub SaisieTauxDesir_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
' <-- Validité du %age Désiré - Numérique entier obligatoire et % compris entre 10 et non supérieur à Occupation
On Error Resume Next

SaisieTauxDesir.Text = Replace(SaisieTauxDesir.Text, ".", ",")  ' <-- la virgule et le point sont le séparateur décimal

If Not IsNumeric(Right(SaisieTauxDesir, 1)) Then
        MsgBox "SVP Veuillez saisir un nombre entier2   !" + Chr$(13) + Chr$(13), _
        vbOKOnly + vbExclamation, "                            -  ERREUR DE SAISIE  -"
    SaisieTauxDesir = Left(SaisieTauxDesir, Len(SaisieTauxDesir) - 1)
    Cancel = True
    SaisieTauxDesir = ""
    SaisieTauxDesir.SetFocus
    Exit Sub
Else
    Cancel = False
End If

If SaisieTauxDesir < 10 Or SaisieTauxDesir > SaisieTauxOccup Or SaisieTauxDesir > 99 Then
        MsgBox "Veuillez saisir un taux désiré correct svp. " + Chr$(13) + Chr$(13) _
        & "Le taux est compris entre 10 % et le taux d'occupation réel   !   " + Chr$(13) + Chr$(13), _
        vbOKOnly + vbExclamation, "                              -  ERREUR DE SAISIE  -"
    Cancel = True
    SaisieTauxDesir.Value = ""
    SaisieTauxDesir.SetFocus
    Exit Sub
End If

End Sub


Un grand merci à ceux et celles qui m'aideront car je retourne ça dans tous les sens sans trouver la soluce.

A++
 

jp14

XLDnaute Barbatruc
Re : Textbox numérique et problème de validation

Bonjour

Bonsoir le forum ou plutôt bonne nuit, vue l'heure matinalement tardive. :)

Code:
If Not IsNumeric(Right(SaisieTauxOccup, 1)) Then
    .........................
    [COLOR="red"]Cancel = True [/COLOR]
    SaisieTauxOccup = ""
    SaisieTauxOccup.SetFocus
    Exit Sub
Else
    Cancel = False
End If
    [COLOR="red"]if Cancel = false then  [/COLOR]
If SaisieTauxOccup > 100 Or SaisieTauxOccup < 40 Then
        .......................
End If
    [COLOR="red"]end if  [/COLOR]

A++[/QUOTE]

Une première réponse
La variable booléenne n'est pas géré. Cf ci dessus.

JP
 

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Bonsoir JP14 Bonsoir le forum

Merci pour ta réponse.

Mon problème ne se situe pas dans la procédure SaisieTauxOccup mais dans la procédure SaisieTauxDesir.

J'ai adapté ta proposition sur la seconde procédure mais je rencontre tjs le problème des Msgbox qui double.

Si je rentre de l'alphanumérique, la Msgbox SVP Veuillez saisir un nombre entier2 apparait normalement mais elle double quand je fais OK.


Si je rentre du numérique avec décimale ou du numérique erronné, la Msgbox Veuillez saisir un taux désiré correct svp ... apparait puis lorsque je fais OK, la Msgbox SVP Veuillez saisir un nombre entier2 apparait.


Mon erreur doit se situer au niveau des If ou d'un Exit Sub

J'ai repris mon code et tout ce que j'essaye fait que rien dechange ou que la procédure plante.

Merci d'avance si le forum a une idée.

A++
 

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Re tout le monde :)

Je viens de faire le test suivant !

J'ai sorti mes Textbox de la Frame et les tests fonctionnent.

Si quelqu'un a une soluce pour que je puisse garder mes Frames, car je les avais mises pour la présentation.

A++
 

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Bonjour JP14 Bonjour le forum :) :)

Suite au message privé de JP14, je poste mon fichier réduit au max de chez max.

Vous constaterez que le dernier Textbox de chaque Frame pose un problème sur les différents tests de validation.

J'ai fais des recherches sur le net et je suis tombé sur des articles en anglais concernant ce problème, apparemment connu de Microsoft sous le N° Q210734. Il fait état de Textbox dans des Frame mais suivi de CommandButtton. J'ai essayer d'adapter, mais sans succès.

Merci d'avance

A++
 

Pièces jointes

  • USF Textbox.zip
    37.1 KB · Affichages: 52

jp14

XLDnaute Barbatruc
Re : Textbox et problème de validation

Bonjour

elle double quand je fais OK.
A++

Le problème provient de la "réentrance" dans la procédure :
Le code SaisieTauxDesir.Value = "" met à jour la variable et de ce fait réactive la procédure :
Private Sub SaisieTauxDesir_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
ce qui déclenche l'affichage du message.

Pour corriger il faut utiliser un "flag"
Déclaration en entête
Dim flag as boolean

première ligne du code dans la procédure
If flag = true then exit sub
flag = true
................. corps de la procédure
flag = false
End sub

Pour mettre en évidence ce type d'erreur il faut mettre un point d'arrêt au début de la procédure et utiliser la touche F8 pour suivre la procédure en pas à pas.

J'ai rajouté une procédure pour mettre à jour les "CheckBox" de la feuille.
J'ai renommé les CheckBox : CheckBox_adresse de la case associée.
La procédure utilise cette adresse pour affecter la variable true ou false.

Il faut utiliser la commande importer un fichier dans l'éditeur VBA pour obtenir l'usf et le code

A tester

JP
 

Pièces jointes

  • USF_Saisie.zip
    6.4 KB · Affichages: 36
  • USF_Saisie.zip
    6.4 KB · Affichages: 33
  • USF_Saisie.zip
    6.4 KB · Affichages: 35
Dernière édition:

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Bonsoir JP14 Bonsoir le forum :) :)

Je te remercie de t'être penché sur mon problème et même plus.

J'étais entrain de chercher une solution pour mes Checkbox, tu m'as ôter une sacrée épine du pied sans que je demande de l'aide. Un très grand merci pour cette aide.


En ce qui concerne le problèmr des Textbox ...

Une partie du problème est résolu, il n'y a plus de "réentrance" dans la procédure et donc plus de double message.

Un problème demeure :

Si je rentre une valeur numérique erronée ou une valeur non numérique j'ai bien le message correspondant à l'erreur mais le SetFocus ne revient pas dans le Textbox SaisieTauxDesir et le curseur passe sur le Optionbutton de la Frame suivante. Si je repositionne le SetFocus avec la souris dans le Textbox SaisieTauxDesir et que je fais une saisie erronée, la saisie est acceptée quoi que l'on saisisse.

J'ai essayé de faire quelques adaptations mais sans succès, je sors toujours du Textbox SaisieTauxDesir et je perds leSetFocus.
 

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Re JP14 Re le forum :) :)

J'avais pensé effectivement à ta proposition et je l'avais testée.

Je retrouve le SetFocus dans la Texbox SaisieTauxDesir mais les Msgbox d'erreur se redouble comme avant ta proposition du Flag.

Je vais encore essayer de chercher le sucre fondu au fond de mon café . . . si quelqu'un à une cuillère pour débrasser et reconstituer le sucre fondu, en morceau . . .

A++
 

jp14

XLDnaute Barbatruc
Re : Textbox et problème de validation

Bonjour

Une proposition à tester :

Procédure
Dans les procédure BeforeUpdate on positionne le sémaphore : flag à vrai

Code:
Private Sub SaisieTauxDesir_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
' <-- Validité du %age Désiré - Numérique entier obligatoire et % compris entre 10 et non supérieur à Occupation
On Error Resume Next
If flag = True Then Exit Sub
flag = True
...........................

On autorise les entrées dans les procédures dans les procédures exit
flag = faux
Code:
Private Sub SaisieTauxDesir_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If SaisieTauxDesir.Value = "" Then Cancel = True
flag = False
End Sub

A priori le système fonctionne.

JP
 

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Bonsoir JP14 Bonsoir le forum :) :)

Merci JP14 pour ta proposition, je viens de la tester et il n'y a pas
de changement.

J'ai essayer de supprimer (il y avait très peu d'espoir) des Flag = False
ou de les déplacer mais sans succès.



Je joints la traduction Google du problème Q210734 décrit par Microsoft et dont je parlais dans un précédent message.

OFF2000: Sortir de l'événement pour TextBox dans un cadre ne fonctionne pas correctement

Le cas de sortie pour un contrôle TextBox ne s'exécute pas lorsque vous cliquez sur un autre contrôle sur votre UserForm, ou la sortie évènement se UserForm après la fermeture.


Ce problème se produit lorsque vous ajoutez un contrôle TextBox à un cadre dans un UserForm, et vous assignez une sortie événement de la zone de texte. La sortie événement se déroulera à l'heure exacte que lorsque vous cliquez sur un autre contrôle dans le cadre.

Microsoft fournit des exemples de programmation à des fins d'illustration uniquement, sans garantie explicite ou implicite. Cela inclut, mais n'est pas limité à, les garanties implicites de qualité marchande ou d'adéquation à un usage particulier. Cet article suppose que vous êtes familier avec le langage de programmation est présenté et les outils utilisés pour créer et déboguer des procédures. Techniciens du support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne modifieront pas ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques. Pour lancer la sortie d'activité pour le contrôle TextBox, mettre l'accent à nouveau sur un autre de contrôle dans le cadre. Pour ce faire, utilisez la méthode SetFocus de tout autre contrôle à l'intérieur du cadre.

L'exemple de macro ci-dessous illustre la façon d'exécuter une sortie événement de TextBox1 lorsque TextBox1 est dans un cadre, et CommandButton1 est en dehors du cadre. Quand TextBox1 a l'accent et que vous cliquez sur CommandButton1, la sortie événement de la zone de texte fonctionne avant de la boîte de message apparaît dans CommandButton1_Click. Si vous n'avez pas détourner l'attention de Frame1, la sortie événement de TextBox1 court après la boîte de message apparaît pour CommandButton1_Click.

Cet exemple suppose un objet UserForm qui contient un cadre de contrôle, deux contrôles TextBox à l'intérieur du cadre, et un contrôle CommandButton à l'extérieur du cadre.



Code:
 Private Sub CommandButton1_Click() Private Sub CommandButton1_Click () 
     TextBox2.SetFocus 
     MsgBox "Button Click" MsgBox "bouton" 
 End Sub End Sub 

 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean) 
     MsgBox "Box 1 exit" MsgBox "Box 1 sortie" 
 End Sub End Sub



Quand un objet UserForm contient un cadre avec un ou plusieurs contrôles TextBox de sortie qui contiennent des événements, les événements ne vont pas au bon moment lorsque vous cliquez en dehors du cadre. Par exemple, considérez un UserForm qui contient deux contrôles TextBox, TextBox1 et textBox2, dans un Frame1 de contrôle, et un CommandButton1 en dehors du cadre. La sortie événement de TextBox1 ne s'exécute pas lorsque vous cliquez sur CommandButton1.Pour corriger ce problème, définissez le focus sur textBox2 dans votre CommandButton1_Click sous-routine, comme illustré dans la section "Contournement" de cet article.

Je ne sais pas si cela peut être utile, mais on ne sais jamais.

Merci encore et A++
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Textbox et problème de validation

Bonjour

Ci joint l'userform et les procédures.
J'ai contourné le problème en supprimant les procédures incriminées.

J'utilise le code suivant pour lancer les test de conformité des valeurs
Code:
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If SaisieTauxOccup.Value <> "" Then Call controle(1)
If SaisieTauxDesir.Value <> "" And SaisieTauxOccup.Value <> "" Then Call controle(2)
End Sub

L'inconvénient ce sont des procédures qui sont actives en permanence.

J'ai rajouté une procédure pour utiliser uniquement des valeurs numériques.
Code:
Dim init As Boolean
Dim val1 As Integer
If SaisieTauxDesir.SelStart = 0 Then
init = True
Else
init = False
End If
val1 = KeyAscii
Call controldonnenumerique(val1, init)
KeyAscii = val1

Je voulais utiliser cet appel: Call controldonnenumerique(KeyAscii, init),
mais j'ai obtenu une erreur je suis preneur des idées pour modifier cet appel cela simplifierait le code.

Code:
Private Sub controldonnenumerique(£valeurnum As Integer, £init As Boolean)
Static £virgule As Boolean
If £init = True Then £virgule = False  ' pour initialiser la variable virgule au début de la saisie

    Select Case £valeurnum
    Case 46
        If £virgule = False Then ' un seule virgule par valeur numérique
            £valeurnum = 44
            £virgule = True
        Else
            £valeurnum = 0
        End If
    Case Is < 48, Is > 57
        £valeurnum = 0
    End Select
End Sub

J'ai rajouté un contrôle avant l'enregistrement.


J'ai modifié la procédure pour mettre une majuscule en début de texte et après un signe de ponctuation en utilisant les propriétés du code ascii (écart de 20(hexa) entre minuscule et majuscule)

A tester

JP
 

Pièces jointes

  • USF_Saisie.zip
    6.6 KB · Affichages: 34
  • USF_Saisie.zip
    6.6 KB · Affichages: 33
  • USF_Saisie.zip
    6.6 KB · Affichages: 36
Dernière édition:

olivepao

XLDnaute Occasionnel
Re : Textbox et problème de validation

Bonsoir JP14 :) Bonsoir le forum :)

Je te remercie de t'être pencher encore une fois sur mon problème.

Je viens de tester tes modifications et je t'apporte mes premières observations.

Si je rentre une valeur numérique avec une virgule, ou si je rentre une valeur qui n'est pas dans les balises, le message erreur met
1mn 35 s pour s'afficher.

Etant béotien, je désire comprendre :

1) le pourquoi du signe £ devant certaines variables ?

2) les variables init et val1 peuvent-elles être déclarées en Option Explicit ?

3) dans la procédure Private Sub SaisieTauxOccup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger), on fait référence SaisieTauxDésir, y a t'il une raison ?

Je me suis rendu compte que les derniers Textbox dans les autres Frame échappent au contrôle de saisie. Je vais essayer :)eek:) d'adapter le contrôle de sortie avec la procédure Private Sub controle(nucontrole As Byte).

Je vais m'attaquer à toutes ces modifications . . .

A++
 

jp14

XLDnaute Barbatruc
Re : Textbox et problème de validation

Bonsoir
Bonsoir JP14 :) Bonsoir le forum :)

1) le pourquoi du signe £ devant certaines variables ?
les variables init et val1 peuvent-elles être déclarées en Option Explicit ?

dans la procédure Private Sub SaisieTauxOccup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger), on fait référence SaisieTauxDésir, y a t'il une raison ?

Une première réponse.

J'utilise £ devant le nom des variables des sous programmes pour éviter des conflits au niveaux des variables qui sont déclarés en entête de module.
Cela me permet d'avoir une bibliothèque de sous programmes que je peux utiliser sans me soucier de vérifier le nom des variables.

Pas de problème pour les variables pour les déclarer en entête de module.

Il faut corriger, c'est une erreur d'un copier coller.
If SaisieTauxOccup.SelStart = 0 Then permet de positionner l'indicateur si l'utilisateur efface les données


Si je rentre une valeur numérique avec une virgule, ou si je rentre une valeur qui n'est pas dans les balises, le message erreur met
1mn 35 s pour s'afficher.

Je n'ai jamais eu de problème. Si je déplace la souris j'ai une réponse immédiate.



JP
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
1 K

Statistiques des forums

Discussions
312 438
Messages
2 088 411
Membres
103 847
dernier inscrit
Girardon