Nouvelle feuille fonction d'une combobox

le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 novembre 2007 - 10 nov. 2007 à 08:54
le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 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

Merci a vous de m'aider

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

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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.

MPi²
0
le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 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 ....

Arggg .... qu elle c*nner|e ce zinbreck !!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 nov. 2007 à 15:39
Dans ce cas-là, peut-être regarder du côté de
EnableEvents

Ne pas oublier de le remettre à True immédiatement après utilisation et, éventuellement, dans la gestion d'erreur.

MPi²
0
le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 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 !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
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 ?

MPi²
0
le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 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)
       
        ActiveSheet.Range(Colonne & (Ligne + 1)) = New_Golf
        ActiveSheet.Range(Colonne_dat & (Ligne + 1)) = Def_Golf_ID
       
        ' Trier la nouvelle liste " nom de golf" ainsi crée.
       
        Coordonne = Colonne & "42:" & Colonne & (Ligne + 1)
        ActiveSheet.Range(Coordonne).Sort Key1:=Range(Colonne & "41"), Order1:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
       
        ' 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 !!!
0
le_syd1961 Messages postés 10 Date d'inscription lundi 12 juin 2006 Statut Membre Dernière intervention 23 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 !!!
0
Rejoignez-nous