Stopper l excecution d'une procedure jusqu a la fin de saisie de l'utilisateur d [Résolu]

Signaler
Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007
-
Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007
-
Bonjour a tous ....

Jusqu'a présent j'ai réussi à trouver tout ce que je souhaitais ds les forums (ici ou ailleurs ...) mais là ... je vois pas pourtant ce doit etre tout  bête !...

Explication globale  :
Je mets en place une feuille excell destinée a saisir des cartes de score de Golf... J'ai listé tous les parcours de France (eh oui !!!) en les triant par régions. Tout parcours de golf est identifié (dans les faits) par une carte de parcours indiquant, outre la difficulté globale du parcours, la difficulté de chaque trou (de 1 à 18), ordre de difficulté qui n est pas forcement l'ordre de jeu (le trou 1 peut etre le plus facile et en ce cas on dit que le handicap du trou est 18, le trou le plus difficile etant le trou Handicap 1).
En résumé, un parcours est defini par la succession des 18 "par (global)" (les trous se joue en 3, 4 ou 5 cps qd on est champion) et son "Handicap"  (difficulté de 1 à 18 de chaque trou et qui permet de determiner, en fonction du niveau de chaque jouer (l'index du joueur), en combien de coups lui va devoir jouer chaque trou ... 

Organisation de mon programme :
Dans une Userform, j'ai une frame contenant deux lignes de 18 textbox(es) ... une ligne de 18 pour les Pars et une de ligne de 18 pour les Handicaps et nommées P1 a P18 et H1 a H18. Afin de concatener facilement les 36 données à la file (dans une cellule attenante a celle du nom du parcours sur ma feuille de donnée "datas"),  je transforme chaque valeur HCP(Handicap) en Base 19 pour n'avoir que 18 valeurs par le parcours.
Si, par exemple, pour un parcours donné j'ai pour valeur de handicap des 5 premiers trous  "12 - 8 - 1 - 3 - 10" c est plus facile de stocker et manipuler une chaine alpha sous la forme "C813A" que de chercher ensuite ou se trouve la séparation entre les valeurs en  Base 10  ...

Cette transformation de base 10 en base 19 se fait en transparence pour l'utilisateur ... il saisi donc dans la textbox H1 (pour l'exemple précité)  : la valeur 12 ... Manque de bol avec ma procedure que voici :

Private Sub H1_Change()    Val(3) Right(ActiveSheet.Range(Coordonne_dat), 17)   ' Coordonne_dat chaine de 36 caracteres : 18 pour les Par et 18 pour les Hcp
    Val(2) = Base10N(Newcard.H1.Value, 19)                      ' Base10N(Valeur,BaseX) va changer la valeur entree en base 19
    Val(1) = Left(ActiveSheet.Range(Coordonne_dat), 18)     ' Val(1) c'est la chaine AVANT le caractere a changer et Val(3) la chaine APRES
    ActiveSheet.Range(Coordonne_dat) = Val(1) & Val(2) & Val(3)   'Et la je recompose la chaine que je sauve dans ActiveSheet.Range(Coordonne_dat)
    Newcard.H1.BackColor = 8454042                                  ' Le fond précedement rouge (valeur a entrer) devient vert (valeur intégrée)
End Sub

la sous routine Base10N est appellée dés que l'utilisateur entre le chiffre "1" au lieu d'attendre que la saisie soit terminée pour se faire ....

Ma question est donc la suivante : Comment puis je faire pour ne lancer la Sub Hx_Change() seulement lorsque la touche Tab ou Enter est utilisée ??

Merci a vous ...

Yves

Le stress, c'est quand pour la premiere fois, la deuxieme fois tu peux pas ... l'angoisse, c est quand pour la deuxieme fois, la premiere fois tu peux pas !!!

7 réponses

Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007

Merci Renfield de t'interresser a mon soucis ...

pour reprendre tes remarques une a une :

- Val est un mot clé reservé
Aucun soucis avec la variable Val(x) ... pas de message d erreur a ce niveau la ...
Mais je peux changer si ça gène ...

- Tu ne déclares aucune variable ?
Toutes mes variables sont déclarées en "Public" dans le Module de mon classeur
______________________________________________________________________
' Déclaration des variables du projet dans MODULE1
Option Explicit
Public Ctrl As Control
Public Region As String, Golf As String, Golf_ID As String
Public Colonne As String, Colonne_dat As String
Public New_Golf As String, Message As String, Val(1 To 3)As String
Public Coordonne As String, Coordonne_datAs String, Val_dat As String
Public Touche As Integer, Index As Integer, Slope As Integer, Check As Integer
Public SSS As Integer, Ligne As Integer, Ligne_dat As Integer
Public Region_num As Single, In_Jour As Single, In_Mois As Single, In_An As Single
Public i As Single, Jour As Single, Mois  As Single, An  As Single
Public V_Slope(1 To 4) As String, V_SSS(1 To 4) As String, Def_Golf_ID As String
Public Tampon(1 To 4) As String, Golf_ID_Check As String
Public Blanc As Boolean, Jaune As Boolean, Bleu As Boolean, Rouge As Boolean
Public Const DICTIONNARY = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Public pnr As Boolean
_______________________________________________________________________

- Aucune verification dans ton Else... tu fais Right(..., 17) sans avoir validé la saisie
J'utilise la valeur entrée dans la texbox (voir la ligne ici en gras ...)
la valeur est ensuite enregistrée en base 19 à la bonne position dans la chaine stockée dans l'ActiveSheet.Range(Coordonne_dat)
________________________________________________________________________
Private Sub H1_AfterUpDate()    If Newcard.H1.Value "" Or Newcard.H1.Value "Z" Or Newcard.H1.Value = "0" Then
        Newcard.H1.BackColor = 10628345
        Newcard.H1.Value = "0"
    Else
        Val(3) = Right(Tampon(1), 17)
        Val(2) = Base10N(Newcard.H1.Caption, 19)
        Val(1) = Left(Tampon(1), 18)
        Tampon(3) = Val(1) & Val(2) & Val(3) & "-" & Tampon(2)
        ActiveSheet.Range("I1") = Tampon(3)
        ActiveSheet.Range(Coordonne_dat) = Tampon(3)
        Tampon(1) = Left(Tampon(3), 36)
        Newcard.H1.BackColor = 8454042
    End If
End Sub
____________________________________________________________

- Tentes de debugger ton code en pas, en ajoutant un/des point d'arret (F9)
He bien oui ... mais en refaisant tourner le code pour vous détailler plus mon blème je me rends compte
que ça bugge pas a cause de AfterUpdate mais a cause du .Caption !!!
que j'ai modifié en .Value (on essaie parfois des trucs en tatonnant quand on connait pas gd chose comme moi sourire)

ET CA MARCHE .... enfin pour le moment ... Merci en tout cas à vous (MPi pour ler AfterUpDate et  Renfield pour m'avoir fait revenir sur mon code au bon endroit ...)

Le stress, c'est quand pour la premiere fois, la deuxieme fois tu peux pas ... l'angoisse, c est quand pour la deuxieme fois, la premiere fois tu peux pas !!!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
n'utilise pas H1_Change
mais H1_LostFocus, par exemple...

ou teste la pression de la touche vbKeyReturn (13) dans un KeyPress...
Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007

Ok merci j'essaie ca ...

Le stress, c'est quand pour la premiere fois, la deuxieme fois tu peux pas ... l'angoisse, c est quand pour la deuxieme fois, la premiere fois tu peux pas !!!
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
16
Sous Excel, dans un UserForm, les textbox n'ont pas LostFocus.
Mais tu peux utiliser
AfterUpdate ou Exit

MPi²
Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007

Bon ... je bloque la !...
lorsque j'utilise Private Sub Textbox_Exit j'obtiens une erreur j'ai essayé ça : Private Sub Textbox_AfterUpDate()
(avec of course Textbox = Nom reel de ma textbox en l'occurence de H1 a H18)  mais ca bloque aussi ...

Je ne sais pas comment formuler le fait d'attendre la fin d'une saisie avant de poursuivre la procedure ...

cpp
Private Sub H1_AfterUpDate()    If Newcard.H1.Value "" Or Newcard.H1.Value "Z" Or Newcard.H1.Value = "0" Then
        Newcard.H1.BackColor = 10628345
        Newcard.H1.Value = "0"
    Else
        Val(3) = Right(Tampon(1), 17)
        Val(2) = Base10N(Newcard.H1.Caption, 19)
        Val(1) = Left(Tampon(1), 18)
        Tampon(3) = Val(1) & Val(2) & Val(3) & "-" & Tampon(2)
        ActiveSheet.Range("I1") = Tampon(3)
        ActiveSheet.Range(Coordonne_dat) = Tampon(3)
        Tampon(1) = Left(Tampon(3), 36)
        Newcard.H1.BackColor = 8454042
    End If
End Sub
/cpp

Le stress, c'est quand pour la premiere fois, la deuxieme fois tu peux pas ... l'angoisse, c est quand pour la deuxieme fois, la premiere fois tu peux pas !!!
Messages postés
10
Date d'inscription
lundi 12 juin 2006
Statut
Membre
Dernière intervention
23 novembre 2007

je ne sais pas utiliser la balise cpp et /cpp désolé !


Merci de m'apporter une reponse ... c est rageant d etre bloqué sur une broutille pareille !! (et je ne parle pas de la balise !)

Le stress, c'est quand pour la premiere fois, la deuxieme fois tu peux pas ... l'angoisse, c est quand pour la deuxieme fois, la premiere fois tu peux pas !!!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
- Val est un mot clé reservé
- tu ne déclare aucune variable ?
- aucune verification dans ton Else... tu fais Right(..., 17) sans avoir validé la saisie
- tentes de debugger ton code en pas, en ajoutant un/des point d'arret (F9)
- cpp     /cpp n'existe pas, faut formatter a la main, ou utiliser un outil (tools.codes-sources.com)

sois moins évasif, "ca bloque" est un constat qui a tendance a pas nous apprendre grand chose... un comportement, un code erreur...

Renfield
Admin CodeS-SourceS- MVP Visual Basic