le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007
-
10 nov. 2007 à 08:54
le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007
-
23 nov. 2007 à 22:32
Re-bonjour a tous...
Je poursuit le petit prgm sur base XL dont le but est de faire un graphique de progression et une base de calcul d'index pour jouer de Golf.
J'ai donc une Userform (Newcard) comportant plusieurs Frames chacune liée a une serie de Text ou Combobox permettant la saisie des nombreuses donnees necessaire au calcul d'une feuille de score d une partie de golf, le stockage des resultat par joueur etc etc ...
Je vais pas mettre tout mon code la parce qu'il y a une 20 aine de pages deja mais j'ai un soucis tout c*n sur une procedure, j explique :
J'ai une combo avec en tete de liste la valeur "Nouveau Joueur" puis les joueurs deja entrés ds la base... Si l'utilisateur n'y est pas repertorié, il selectionne donc "Nouveau Joueur"... et la ma routine fait deux boucles se perd ... je vous copie ici le code, je precise que j'ai déclaré toutes les variables ds le module en Public !...
__________________________________________________________________________________________________
1- Private Sub In_joueur_Click()
2- ' Si l'utilisateur n est pas repertorié => choix "Nouveau Joueur"
3- If Newcard.In_Joueur.Value = "Nouveau Joueur" Then
4- ' Ajout de "newgolfeur" en fin de liste des joueurs.
5- Message = "Entrez le nouveau nom dans la base de donnéee et validez : "
6- new_joueur = InputBox(Message)
7- ' Formatage de l'entrée ex : "yves" devient "Yves"
8- new_joueur = StrConv(new_joueur, vbProperCase)
9- ' Enregistrement de l'entrée en bas de liste des joueurs
10- ' (active sheet range H2(Nouveau Joueur) a H30 (donc 27 joueurs possible en memoire)
11- For i = 3 To 30
12- If Range("H" & i) = joueur Then Exit For ' Car le nom existe deja ds la liste des joueurs repertoriés.
13- If Range("H" & i) = "" Then ' Soit la 1ere ligne vide de la liste des joueurs repertoriés
14- ligne_joueur = i ' Je memorise la ligne concernée
15- Range("H" & i) = new_joueur ' J'ecris ds la case vide le nouveau nom correctement formaté (StrConv(Nom,vbProperCase))
C'est a la ligne 15 que ca commence a derailler... au lieu de poursuivre la routine, (je m'en suis rendu compte en faisant du pas a pas)
le programme revient a la ligne 1 !... Quelqu un peut il me dire pourquoi ??? et surtout .... comment y remedier ?
C'est comme si d'affecter a Hi la valeur new_joueur correspondait a un changement dans la combobox !...
' Trier la nouvelle liste " nom de golf" ainsi crée.
ActiveSheet.Range("H3:H" & ligne_joueur).Sort Key1:=Range("H" & "3"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
' Faut maintenant affecter à "golfeur" la valeur "new_joueur"
Golfeur = new_joueur
Exit For
End If
Next i
' Je stocke la valeur dans la feuille temporaire de calcul cellule C4.
Sheets("datas").Range("C4") = Golfeur
' et je crée une feuille pour ce joueur sur le modele de feuille nommé "Exemple"
On Error Resume Next
' Je desactive le rafraichissement d ecran et je copy "Exemple" comme nouvelle feuille en derniere position
Application.ScreenUpdating = False
ActiveWorkbook.Sheets("Exemple").Copy after:=Worksheets(Worksheets.Count)
' Je renomme la feuille crée au nom du joueur
ActiveSheet.Name = Golfeur
' Et je verifie qu'il soit conforme au nom de feuille autorisé par XL
If Err <> 0 Then
Err.Clear
With Application
.ScreenUpdating = True
.DisplayAlerts = False
End With
ActiveSheet.Delete
Msg = "Le nom de feuille que vous avez tapé n'est pas valide !" _
& vbCrLf
Msg = Msg & vbCrLf
Msg = Msg & "- Vérifiez que le nom ne dépasse " _
& "pas 31 caractères" & vbCrLf
Msg = Msg & "- Vérifiez que le nom ne contient " _
& "aucun des caractères suivants :" & vbCrLf
Msg = Msg & " \ / : ? * [ ou ]" & vbCrLf
Message = MsgBox(Msg, , "Saisie invalide")
End If
Application.DisplayAlerts = True
Sheets("datas").Activate
End If
' Ou se trouve le Joueur dans la liste ?
For i = 3 To 30
If ActiveSheet.Range("H" & i) = Golfeur Then
ligne_joueur = i
Exit For
End If
Next i
End Sub
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 !!!
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 nov. 2007 à 14:25
C'est quoi « In_joueur » ?
Ton combobox ?
Si oui, utilises-tu Rowsource pour le charger ?
et si oui encore..., probablement que le simple fait de modifier une donnée faisant partie de son Rowsource va rappeler cette procédure, mais je n'en suis pas certain... je n'utilise jamais Rowsource...
Tu pourrais créer une variable Boolean Public dans un module.
Lorsque tu entres dans cette procédure, tu vérifies son état.
Si Vraie, tu sors
sinon tu la mets Vraie, tu fais tes manipulations
et avant de sortir tu la mets Fausse.
le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007 10 nov. 2007 à 15:03
Merci de ta reponse MPi ...
In_joueur est en effet le label de ma ComboBox.
Lorsque je lance la UserForm, je determine en effet la Rowsource de Newcard.In_joueur(UserForm.Combobox) de la sorte :
____________________________________________________
' On commence par fixer le Rowcontrol de la liste joueur
For i = 3 To 30
If Sheets("datas").Range("H" & i) = "" Then
Newcard.In_Joueur.RowSource = "datas!H2:H" & (i - 1)
Exit For
End If
Next
_____________________________________________________
Le fait de modifier la ComboBox In_joueur des l'appel de la UserForm Newcard n'appelle pas la procedure In_joueur_Click()
J'ai essayé de modifier l'appel à la procedure car au départ j'avais : In_joueur_Change() mais cela ne change pas le deroulement de
la procédure.... Dés la ligne 15 je remonte a la ligne 1 !!!...
Tu comprends donc que ton astuce d'une Public Boolean ne m'avance pas car je ne veux pas sortir de la procedure mais faire
en sorte qu'elle se poursuive ....
le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007 11 nov. 2007 à 01:48
Merci pour le tuyau mais ... ça semble ne pas marcher ... voila la nouvelle mouture :
(j'ai pas remis le code au normes de couleur mais ... c est galere , ya pas un autre moyen pour le faire au fait ?)
En fait, la procedure stoppe et reprend a la ligne 1 au moment ou je trie la liste des noms (ici ligne en rouge)
Precision : les variables sont ttes definies Public dans le module
_______________________________________________________________________
1 Private Sub In_joueur_Click()
2 Golfeur = Newcard.In_Joueur.Value
3 ' Si on choisit "Nouveau joueur"...
4 If Golfeur = "Nouveau Joueur" Then
5 ' Arrêt des evenements VB a cause du retour ligne 1 de la proc sans ça !
6 Application.EnableEvents = False
7 ' Ajout de "newgolfeur" en fin de liste des joueurs.
8 Message = "Entrez le nouveau nom dans la base de donnéee et validez : "
9 Golfeur = InputBox(Message)
10 ' Formatage de l'entrée ex : "yves" devient "Yves"
11 Golfeur = StrConv(Golfeur, vbProperCase)
12 ' Enregistrement de l'entrée en bas de liste des joueurs
13 Range("H30") = Golfeur
14 ' Tri de la nouvelle liste " nom de golf" ainsi crée.
15 ActiveSheet.Range("H3:H30").Sort Key1:=Range("H" & "3"), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
16 ' Recherche de la nouvelle position
17 For i = 3 To 30
18 If Range("H" & i) = Golfeur Then
ligne_joueur = i
Exit For
End If
Next i
' Memorisation du joueur sur la feuille ("datas")
Sheets("datas").Range("C4") = Golfeur
' En cas d'erreur le nom "feuille" est invalide
' on désactive le rafraichissement d'écran
On Error Resume Next
Application.ScreenUpdating = False
' Création de la feuille du joueur
ActiveWorkbook.Sheets("Exemple").Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Golfeur
If Err <> 0 Then
Err.Clear
With Application
.ScreenUpdating = True
.DisplayAlerts = False
End With
ActiveSheet.Delete
Msg = "Le nom de feuille que vous avez tapé n'est pas valide !" _
& vbCrLf
Msg = Msg & vbCrLf
Msg = Msg & "- Vérifiez que le nom de la feuille ne dépasse " _
& "pas 31 caractères" & vbCrLf
Msg = Msg & "- Vérifiez que le nom de la feuille ne contient " _
& "aucun des caractères suivants :" & vbCrLf
Msg = Msg & " \ / : ? * [ ou ]" & vbCrLf
Msg = Msg & "- Vérifiez qu'une feuille du classeur ne possède " _
& "pas déjà un nom identique" & vbCrLf
Reponse = MsgBox(Msg, , "Saisie invalide")
End If
Application.DisplayAlerts = True
' Sheets("Exemple").Copy after:=Sheets(Sheets.Count)
' ActiveSheet.Name = Golfeur
Application.EnableEvents = True
Sheets("datas").Activate
End If
' Ou se trouve le Joueur dans la liste ?
For i = 3 To 30
If ActiveSheet.Range("H" & i) = Golfeur Then
ligne_joueur = i
Exit For
End If
Next i
End Sub
_____________________________________________________________________________________
Une idee du pourquoi malgré le EventEnable= false, la procedure est rapellée?
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 !!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 11 nov. 2007 à 15:22
>> In_joueur est en effet le label de ma ComboBox.
qu'est-ce que tu entends par label ? un contrôle Label à côté du Combobox ? ou plutôt le Combobox lui-même ?
Et lorsque tu tries, tu ne sélectionnes que la colonne H. Je ne connais pas ton fichier, mais les autres colonnes à côté de H (A à G, par exemple) ne seront pas triées, c'est correct ?
le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007 11 nov. 2007 à 23:10
MPI, j'entend par label, le nom de ma combo ...
Pour le tri la colonne H, le cheminement est le suivant :
sur ma feuille "datas" j'ai en H1 le nom de liste : "Liste des jouers repertoriés"
H2 : "Nouveau Joueur"
H3 à 29 espace reservé aux joueurs deja repertorié sachant que c'est destiné a 3 ou 4 joueurs en pratique...
H30 : cellule de stockage de la reponse a l'InputBox "Entrez le nom du joueur
Lorsque l'utilisateur choisit l'item "Nouveau joueur", je lui demande (via inputBox) son nom que je stocke en bas de liste (Colonne H), liste que je trie (seule donc ...) pour la mettre dans l ordre alphabetique. Ca me permet de faire recoller tous les noms sur la partie haute de la colonne,(plus d'espace entre les noms de la liste et le nouveau nom après le tri).
Cette liste est ensuite affiliée à la RowSource de la ComboBox In_Joueur...
Bon maintenant que ceci est éclairé, j'ai continué a bosser un peu sur la procédure pour découvrir que si je remplace le type d 'evenement de la procédure de Change() ou Click() en AfterUpDate(), la procedure suit son chemin, mais ça force l utilisateur a valider ou jouer du "Tab" pour que lui soit demandé le nom du nouveau joueur.
Je prefererai continuer a utiliser l'evenement Change() ...
Pourtant j'ai une autre procédure similaire dans mon programme qui fait bien la chose .... comprends pas là !... je vous la copie
COPIE D'UNE AUTRE PROCEDURE QUI NE BOUCLE PAS SUR LE TRI...
__________________________________________________________________________________
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''' MODIFICATION DE LA TEXTBOX " Nom du golf " ''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub in_Golf_Change()
Dim Golf_dat As String
Sheets("datas").Activate
ActiveSheet.Range("E5") = Newcard.in_Golf
Golf = Newcard.in_Golf
pnr = False
' Choix "Nouveau Parcours" :
If Golf = "Nouveau Parcours" Then
' Ajout de "newgolf" en fin de liste de la region choisie.
Message = "Entrez le nouveau parcours dans la base de donnéee et validez : "
New_Golf = InputBox(Message)
' Formatage de l'entrée ex : "gOlf de PAU" devient "Golf De Pau"
New_Golf = StrConv(New_Golf, vbProperCase)
' Enregistrement de l'entrée en bas de liste de région
' Et en vis a vis, le Golf ID par defaut (ZZZ...D)
' Affecter à la textbox "Nom de golf" la valeur New_golf, et à "golf" la valeur "new_golf"
Golf = New_Golf
End If
' A ce niveau, "Nom de Golf" à une valeur !...
................ ect etc etc ...... et la procédure se poursuit sans soucis....
alors pourquoi la premiere ne fonctionne t elle pas ???
Une autre question puisque j'y suis :
Comment puis je, une fois le tri des donnée faite, rafraichir ma Combo (Ellle montre tjrs "Nouveau Joueur" ) a partir du moment
ou le nom est validé ...
arg... faut donc que ce soit un nom valide AVANT de le trier !!!
Bon ca empeche pas de repondre a ces questions plus haut ....
Bon merci de repondre j espere ne pas etre trop confu
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 !!!
le_syd1961
Messages postés10Date d'inscriptionlundi 12 juin 2006StatutMembreDernière intervention23 novembre 2007 23 nov. 2007 à 22:32
Pour faire part de mes avancées concernant ce probleme ...
J'ai lu dans le forum que l':
- On ne peux pas utiliser AddItem ou RemoveItem sur une ListBox ou Combobox
lorsque celles ci ont été initialisées avec la propriété RowSource....
Je vais bosser sur cette assertion et vous dire ce qu'il en est ... quoi qu'il en soit
- J'ai remplacé mes Combo par des ListBox parce que ça à l'air quand meme plus adapté...
J'ai echangé en MP avec MPi (super sympa, merci encore) qui m'avait mis en garde sur
l'usage de RowSource, je suis surpris que l'info soulignée au dessus soit aussi confidentielle !...
Dés que j'ai avancé sur le sujet je vous en fait part ...
Pour l heure je bataille encore sur le fait que certaines commandes sont assimilées à un
évènement.
En l'occurence l'instruction :
Userform1.ListBox1.clear
Appelle la routine
Sub Listbox1_Change()
Meme EnableEvent semble inopérant !...
je vous tiens au courant
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 !!!