Probleme conversion de type [Résolu]

Signaler
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007
-
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007
-
salut,

je suis confronté à un ptit souci.
Dans un controle grille lié à un controle data, je rentre des données numériques dont le format est réel. Quand je dois rentrer un décimal, je dois utiliser la virgule et non le point.

autorisé: 12,5
non autorisé: 12.5

ceci n'est pas gênant en soi sauf qu'il y a quand même un truc qui me chagrine: sur un autre ordi, le point est autorisé! ça, c'est ma première question.

d'autre part, j'aimerais bien pouvoir utiliser le point car pour de longues saisies de chiffres, je gagne du temps en utilisant seulement les touches du pavé numérique.

D'où l'idée de piéger l'erreur "conversion de type de donnée" et de remplacer le point par une virgule le cas échéant sur un événement beforecolupdate par exemple.

mais là, surpise pour moi, mais peut-être suis-je naïf? une erreur est interceptée à chaque update, que ma valeur soit ou non valide.
code

on erreur goto blabla
...
...
blabla:
debug.print err.number
end sub

comme je l'ai dit, sur chaque évènement beforecolupdate, le programme se branche sur blabla et affiche le numéro de l'erreur qui est 0 !
et là, je suis encore surpris mais ce n'est pas fini...

d'abord, que signifie erreur=0?

enfin, et ce sera tout pour ce soir, quand je rentre une valeur non valide, le numéro de l'erreur reste 0 alors que j'attends un trois mille et quelques. Finalement, le programme s'arrête avec le message d'erreur 'erreur conversion type donnes" que je n'arrive pas à piéger.

que faire?

monsieurlémouche

9 réponses

Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut,

si c'est ton pc, change les paramètres régionaux concernant le séparateur décimal. Tu peux remplacer la virgule par le point.
(dans panneau de configuration)

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

salut et merci de ta réponse,
pour le séparateur décimale c'est relativement simple.

mais j'aimerais avoir une réponse sur mes histoires de numéro d'erreur, à savoir: pourquoi on error goto blabla récupère une erreur de number=0 quelle que soit la frappe (valide ou invalide)?

monsieurlémouche
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Re,

ton On Error GoTo blabla,
ça veut dire, "si une erreur arrive, le code à exécuter se trouve à l'étiquette blabla", et donc, le numéro de l'erreur repasse à 0.

Si tu veux gérer avec les numéros, c'est On Error Resume Next, puis,
If Err.Number = 13 Then
   ... ce que tu veux faire
   Err.Clear  'repasse le numéro à 0
End If

(si t'as plusieurs erreurs à gérer, Select Case est mieux)

Ps : l'aide VB6 sur la gestion des erreurs est très complête

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Mortalino, ta seconde explication est completement fausse et dangereuse en plus.
On Error Resume Next est à bannir absolument, avec il n'y a aucune gestion d'erreur

Je pense plutot que c'est un oubli de sortir de la procédure avant le code de gestion d'erreur

Si, en temps normal sans erreur, tu ne sort pas de la procédure avant d'atteindre l'étiquette blabla: tu vas executer le code qui suit l'étiquette comme s'il s'agissait du code normal de la routine

Quand on utilise On error Goto, il faut mettre en place le schéma suivant

On Error Goto blabla
......
......
Exit Sub 'ou Exit Function suivant si la procédure est une Sub ou une Function

blabla:
    Debug.Print Err.Number

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Salut Casy,

fausse, je ne pense pas (puisque je l'utilise et je n'ai pas de problème d'utilisation), mais comme tu dis, dangereuse. Je suis d'accord, mais dans certains cas, t'es obligé.
Et puis dangereuse reste un grand mot, si tu sais où se trouve l'erreur, il suffit de placer le On error resume next juste avant l'endroit où l'erreur est censé se produire, tu fais le select case en cas d'étude de plusieurs cas d'erreurs, puis on error GoTo 0 pour revenir à la normale de la gestion d'erreur.

Donc banir le On Error Resume Next, c'est un choix, moi je l'utilise toujours car je n'ai aucun problème avec (et trouve ça plus lisible que de faire le yoyo avec des étiquettes)

J'ai un (petit) exemple sur ma dernière source, je suis certains qu'il y a une autre solution, mais la mienne me convient, en tou cas :

                    If TypeOf ctl Is CommandButton Or TypeOf ctl Is CheckBox Or TypeOf ctl Is Frame Or TypeOf ctl Is ListBox Or TypeOf ctl Is OptionButton Or TypeOf ctl Is RichTextBox Or TypeOf ctl Is TextBox Then
                  
                        With AfSize
                            .Text =  ctl.Text
                   ICI ==>  If Err.Number = 438 Then .Text = ctl.Caption: Err.Clear
                            .Font = ctl.Font
                            iRet = .GetFontSize(ctl.Width - 120, ctl.Height - 120)
                            ctl.FontSize = iRet
                            ctl.Text = .Text
                   ICI ==>  If Err.Number = 438 Then ctl.Caption = .Text: Err.Clear
                        End With
                    End If

~ <small> Mortalino ~ Colorisation automatique </small>

Ce code m'évite de déterminer les types de contrôles (et donc savoir si c'est .Caption ou .Text)

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

salut vous deux,

il y avait, c'est certain, un oubli de exit sub
si bien que le code de gestion d'erreur s'exécutait bien qu'il n'y ait pas d'erreur (donc err.number=0 était normal)

je viens de comprendre que l'erreur est détectée au moment où le programme sort de la procédure (exit sub)
le code de gestion d'erreur n'est pas exécuté.
comment faire?

voici les évènements qui se produisent lors d'une saisie invalide
gridObs_beforecoledite
gridObs_beforecolupdate
gridObs_aftercolupdate
gridObs_aftercoledit
gridObs_beforeupdate

le programme s'arrête après, à la sortie de la procédure gridObs_beforeupdate

j'ai donc fait ceci:
------------------------
Private Sub gridObs_BeforeUpdate(Cancel As Integer)

   On Error GoTo blabla
   Exit Sub
   blabla:
   Debug.Print err.Number


End Sub
------------------------
 le programme ne se branche pas sur le label blabla

comment faire

monsieurlémouche
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Dsl, dangereuse et à bannir, je maintiens

On Error Resume Next, signifie que tu as une erreur dans ton code, que tu le sais, que tu en es concsient, mais que tu decide volontairement d'ignorer cette erreur. Sauf cas extremement rare ou on a pas le choix (pas encore rencontré, perso), ça signifie surtout que tu fais appel à une solution de facilité et donc que ton code est mal conçu ou optimisé. Ce n'est pas un code propre.
(Pour info, ce n'est pas ton cas, mais avec certains clients, ça passe pas)

Perso, j'ai toujours trouver un moyen de contourner un Resume Next, et parfois ça remet en cause une grande partie du code voire parfois plusieurs fonctions et necessite quelque fois de réétudier toute une partie de l'architecture du soft. Mais le résultat est un code de bien meilleure qualité et parfaitement maitrisé

Par contre quand tu dis "...ça veut dire, "si une erreur arrive, le code à exécuter se trouve à
l'étiquette blabla", et donc, le numéro de l'erreur repasse à 0....", ça c'est totalement faux, le numéro n'est pas remis à 0, par contre le gestionnaire d'erreur est désactivé. Donc à la prochaine erreur c'est une exception qui est générée avec à la clé le plantage complet de l'appli.

Si on doit continuer tout de même l'execution du code, il faut penser à faire un Err.Clear pour réactivé le gestionnaire d'erreur

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
monsieurlémouche, quel est le message d'erreur que tu obtient ?????

Détail : Dans ta procédure, le code suceptible de générer l'erreur doit etre placé entre la ligne On Error Goto et la ligne Exit Sub

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

justement, j'ai pas de code d'erreur.

dans ma grille, je rentre une valeur au format erroné...
je passe à l'enregistrement suivant,
les gestionnaires suivants sont appelés, sans qu'une erreur ne soit détectée par le programme:

gridObs_beforecoledite
gridObs_beforecolupdate
gridObs_aftercolupdate
gridObs_aftercoledit

enquite, c'est le gestionnaire   gridObs_beforeupdate qui entre en action: le code est le suivant:
------------------------
Private Sub gridObs_BeforeUpdate(Cancel As Integer)
    ...
   On Error GoTo blabla
   Exit Sub
   blabla:
   Debug.Print err.Number
End Sub
------------------------

quand je suit pas à pas ce gestionnaire, le programme va jusqu'à la ligne exit sub et l'erreur apparaît quand on sort de cette procédure, sans qu'il n'y ait eu branchement sur l'étiquette blabla:
cela semble normal, puisque l'enregistrement doit être mis à jour à la sorti de la procédure et c'est à ce moment qu'une erreur de type est détectée. Conclusion, je ne connait pas le numéro d'erreur et surtout, je ne suis pas capable de l'interceptée.
Il doit falloir mettre un gestionnaire d'erreur à un autre endroit, à un niveau supérieur (bien que je ne sache pas vraiment ce que cela veuille dire dans ce cas précis)
en tout cas, merci de votre aide
monsieurlémouche