Je commence un projet de gestion du personnel et des formations sous excel (macro + VBA) et j'ai des difficultés à aller au bout des choses toute seule. Alors comme cela m'est arrivée il y a quelques temps maintenant, je viens faire appel à vos lumières, qui m'avaient déjà bien secourues à l'époque.
Cette fois je pars d'un fichier excel existant ou sur une feuille de calcul j'ai : en colonne les noms du perssonel entreprise et en ligne les formations réalisées. Quand un personnel a suivi une formation, je met un "X" à l'intersection ligne / colonne.
Je me suis fixée un nombre maxi de formation de 48 => 50 lignes dans le tableau et un nombre de personnel de 20 => 21 colonnes.
Je viens de créer un Userform permettant de créer une nouvelle formation (zone texte) qui est récupérer pour alimenter le feuille de calcul excel précitée en dernière ligne. L'Userform est ouvert à partir d'une commande bouton sur la 1 feuille excel de mon fichier. Jusque là tout fonctionne. Voici le code affecté au bouton VALIDER :
Code :
Private Sub CommandValider_Click()
Dim BDAC As Worksheet
Dim GFDP As Worksheet
Set BDAC = Worksheets("BD Acteur" )
Set GFDP = Worksheets("Gestion FDP" )
' On teste la saisie de la dénomination ...
If Me.TextDenom.Text = "" Then
MsgBox "Vous devez entrer une dénomination."
Me.TextDenom.SetFocus
Exit Sub
End If
' Mise en place des données dans la feuille de calcul BD acteur'
Là où ça se corse, c'est que j'ai X listbox pour sélectionner les participants à la formation et une case à cocher au cas où tout le personnel aurait suivi la formation et que je veux pouvoir pour chaque nom de participant sélectionner, mettre une croix "X" sur la ligne de formation correspondante. Dans le cas de la case à cocher "TOUS", je veux une croix pour tout le personnel sur la ligne de la formation.
Et c'est pour cette seconde partie que je fais appel à vos lumières car malgré mes recherches sur divers forum, je n'arrive pas à trouver par quel bout prendre le problème.
Please HELP !
Vire-moi ces Select/Selection, ligne 21 à 23, s'il te plaît.
Code :
BDAC.Range("A1:B50" ).Sort Key1:=Range("B2" )...
Sinon, je ne vois pas trop clairement ton problème. Et je ne vois pas le rapport avec le code et l'explication de ton problème. Bref, c'est confus de ton côté. (C'est peut-être moi qui est l'esprit embrumé).
------------------
Si tu peux savoir à l'avance quelle zone doit être remplie de X, tu peux faire comme ça :
Code :
Dim cell As Range
For Each cell In Range("C2:L50" ).Rows(4)
cell.Value = "X"
Next
Avec C2:L50, ta zone de X et 4 si tu veux remplir à 4ème ligne de cette zone.
Boujour Zeb, Je vous que tu es toujours fidèle au poste et que tu es toujours aussi rapide déguéner
Bon! je vais essayer d'être le plus claire possible.
Voici le contenu de ma feuille "BD form" :
- colonne A : les désignation des formations (jusqu'à la ligne 50)
- colonne B à U : en 1ère ligne les noms des perssones et lignes suivantes une croix "X" en face des formations suivies
Le but de mon Userform : créer une nouvelle formation et y affecter des participants L'Userform est construit de la façon suivante :
- Un textbox servant à l'intitulé de la formation à créer
- 10 listbox permettant de sélectionner les participants
- une case à cocher intitulée "TOUS" permettant d'affecter la formation à tous les participants.
Question subsidiaire : j'ai mis 10 list box, mais n'aurait-il pas mieux value que je mette une liste à sélection multiple ? (que je ne sais pas utiliser voilà le pourquoi des 10 listbox)
L'utilisateur doit donc créer une formation et sélectionner des participants.
Ce que je veux pouvoir faire, c'est récupérer les informations saisies ou sélectionnées dans l'Userform pour les mettre dans ma feuille "BD form".
Le code que j'ai écris ne me permet actuellement que de créer une nouvelle formation et de l'ajouter à la liste des formations existantes sur la feuille BD form en les retriant par ordre alphabétique.
Comment puis-je dire en VBA, prend le nom de la première list box, cherche la colonne correspondante dans la feuille "BD form" et écrit une croix "X" dans cette colonne, à la hauteur de la ligne correspondante à la formation (cf intitulé du textbox)??? Et ainsi desuite avec les autres noms.
Et idem au cas où la case TOUS est cochée?
Est-ce plus clair comme ceci?
La bonne solution, c'est effectivement la liste unique en multiselect. Il n'est pas question que je te dise comment faire une listbox en multiselect. Tu me connais maintenant, je te laisse chercher. (Click sur la listbox dans l'éditeur VB et appuye sur F4. Ca devrait te sembler évident)
Bon, alors voilà ce que je te propose :
Un Userform avec : Un textbox pour donner un nom à ta formation Une listbox à choix multiple Un bouton pour sélectionner tout le monde Un bouton Valider Un bouton Annuler
Sais-tu remplir cette listbox ? Avec la méthode AddItem bien sûr :
Code :
ListBox.AddItem BDForm.Range("B1" ) '//C'est une personne ou un code ?
ListBox.AddItem BDForm.Range("C1" )
ListBox.AddItem BDForm.Range("D1" )
...
Bon, ce code est idiot. Voilà comment on peut faire autrement :
Code :
Dim c As Range
ListBox1.Clear
For Each c In BDForm.Range("C1:U1" )
If c.Value = "" Then Exit For
ListBox1.AddItem c.Value
Next
Tu remarqueras que je m'arrête à la première case vide. S'il y a un "trou" entre deux personnes, tant pis.
Voici le code pour le bouton "Sélectionner tout le monde" :
Code :
Dim i As Integer
For i = 0 To ListBox1.ListCount - 1
ListBox1.Selected(i) = True
Next
Fais-moi aussi un bouton "Désélectionner tout le monde" s'il te plaît
Ce code est tout moche. Regarde bien ce que tu fais. Tu cherches la dernière ligne non vide et tu te décales d'une ligne vers le bas. Ca, c'est TRES BIEN Bon, donc tu l'as trouvé. Ensuite tu recherche à nouveau la même ligne. Ca, c'es IDIOT.
Regarde ça :
Code :
Dim NewLine As Range
Set NewLine = BDAC.Range("A65536" ).End(xlUp).Offset(1, 0).Rows(1)
NewLine.Cells(1, 1) = Me.TextDenom.Text
NewLine.Cells(1, 2) = Me.TextCode.Text
Pourquoi est-ce mieux ?
Eh, parce que maintenant, on va pouvoir écrire dans la bonne ligne sans avoir à la rechercher tout le temps.
Bon, quand tu cliques sur Valider, il faut regarder si la personne est sélectionnée, et si oui, mettre une croix. Dans la ligne NewLine, A=0, B=1, C=2, etc. Donc la première personne est dans la cellule 2.
Pour aller, plus loin. Au lieu de se servir de l'ordre d'entrée implicite des valeurs dans une liste, on stocke en général cette valeur dans l'élément lui-même :
Je vois que tu as travaillé dur sur ma question!
Je me plonge dans la réponse pour l'exploitée et retravailler mon code et je te tiens au courant biensûr!
En attendant grand merci, pour le grain à moudre que tu m'as donné!
Je galère grave!
Alors si tu veux bien, procédons par étape
Citation :
Oh là là ! Les dix listboxes, c'est une hérésie
1ère erreur de ma part j’ai parlé de listbox là ou j’ai utilisé des combobox (mea culpa)
Citation :
Il n'est pas question que je te dise comment faire une listbox en multiselect. Tu me connais maintenant, je te laisse chercher.
Oui est c’est bien pour çà que je suis contente de voir que tu réponds toujours à mes demandes car j’ai toujours avancé grâce à tes réponses ! Pour le multi select j'ai mis le temps, mais j'ai trouvé la fonction 1 fmMultiSelectSingle dans les propriétés!
Citation :
(Click sur la listbox dans l'éditeur VB et appui sur F4. Ca devrait te sembler évident)
Pour sûr, j’ai toujours les propriétés des contrôles ouvertes, mais merci pour le raccourci touche!
Pour le Userform que tu me proposes je suis OK.
Pour ce qui est de remplir la listbox, j’utilise la solution « Rowsource » [‘BD poste’ !A2 :A21] feuille où j’ai toutes les personnes de l’entreprise sur une seule colonne (cette solution est plus simple à mon goût et surtout, elle allège le code qui n’est déjà pas simple !).
Est-ce que la méthode Row source vaut la solution que tu proposes ou est-ce que c’est moins bien ?
Quant au contenu des cellules A2 à A21 c’est un nom ou plus exactement « Prénom NOM » (séparés par un espace). Il y a des noms jusqu'à la ligne 13 de la feuille BD poste, les autres lignes sont disponibles pour les nouveaux recrutés (du coup dans ma listbox j'ai les premières lignes avec les noms et les dernières sont vides => conséquence : quand je coche l'option "sélectionner tout le personnel" même les lignes vides sont sélectionnées, j'aurais donc des croix pour la formation dans des colonnes qui sont encore vierge de salarié)
Comment puis-je résoudre ce 1er point ?
Je continue de mon coté et je pense que je ne suis pas au bout de mes peines!
Pour la suite j'ai du planter quelque chose car j'ai une erreur d'axécution 1004' (erreur définie par l'application ou par l'objet) sur la ligne : 33.
Voici le code :
Code :
Private Sub CommandValider_Click()
Dim BDF As Worksheet
Dim GFDP As Worksheet
Dim BDP As Worksheet
Dim NewLine As Range
Dim f As Integer
Set BDF = Worksheets("BD form" )
Set GFDP = Worksheets("Gestion FDP" )
Set BDP = Worksheets("BD poste" )
Set NewLine = BDF.Range("A1" ).End(xlDown).Offset(1, 0).Rows(1)
' On teste la saisie de la dénomination ...
If Me.TextFormCompl.Text = "" Then
MsgBox "Vous n'avez pas saisi l'intitulé de la formation complémentaire."
Me.TextFormCompl.SetFocus
Exit Sub
End If
' On teste s'il y a suffisamment de place pour ajouter une formation complémentaire'
'trouve la derniere ligne ecrite de la colonne
FIN = BDF.Range("A65536" ).End(xlUp).Row
If FIN > 50 Then ' test si plus de 50 lignes écrites
MsgBox "Vous avez dépassé le nombre de formations complémentaires possible. Faite faire un tri des formations complémentaires par l'administrateur pour pouvoir saisir une formation."
' Mise en place des données dans la feuille de calcul BD acteur'
ElseIf FIN <= 50 Then
NewLine.Cells(0, 0) = Me.TextFormCompl.Text
For f = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(f) Then
NewLine.Cells(0, 1 + f) = "X"
End If
Next
' On tri le tableau des formations par ordre croissannt de l'intitulé'
de retour de week end, je viens de faire la modif, mais j'ai toutjours la même erreur au même endroit! Je sais que je n'ai pas trop les yeux en face des trous ce matin, mais je ne vois pas d'où vient le problème.
C'est que le week-end fut bon Il te reste 5 jours de semaine pour te reposer avant le prochain week-end
Tu as bien modifier ta ligne 12 ? L'erreur est toujours sur la ligne 33 ?
Quand tu as ce genre de problème, ajoute un Stop avant la ligne incriminée. Ensuite, utilise la fenêtre Exécution (Ctrl+G) et la fenêtre Espion pour explorer des objets. (Il faudrait que je fasse un topic sur le sujet.)
Donc ça plante sur la ligne
Code :
NewLine.Cells(1, 2 + f) = "X"
Pour ce cas particulier, dans la fenêtre Exécution, tape les lignes suivantes :
Je te confirme que j'ai changé la ligne 12 et que j'ai toujours l'erreur sur la ligne 30, soit la ligne
Code :
NewLine.Cells(0, 0). = Me.TextFormCompl.Text
Je te remet le code complet au cas où pb sur autre lignes ou erreur de frappe de ma part.
Code :
Private Sub CommandValider_Click()
Dim BDF As Worksheet
Dim GFDP As Worksheet
Dim NewLine As Range
Dim f As Integer
Set BDF = Worksheets("BD form" )
Set GFDP = Worksheets("Gestion FDP" )
Set BDP = Worksheets("BD poste" )
Set NewLine = BDF.Range("A1" ).End(xlDown).Offset(1, 0).EntireRow
' On teste la saisie de la dénomination ...
If Me.TextFormCompl.Text = "" Then
MsgBox "Vous n'avez pas saisi l'intitulé de la formation complémentaire."
Me.TextFormCompl.SetFocus
Exit Sub
End If
' On teste s'il y a suffisamment de place pour ajouter une formation complémentaire'
'trouve la derniere ligne ecrite de la colonne
FIN = BDF.Range("A65536" ).End(xlUp).Row
If FIN > 50 Then ' test si plus de 50 lignes écrites
MsgBox "Vous avez dépassé le nombre de formations complémentaires possible. Faite faire un tri des formations complémentaires par l'administrateur pour pouvoir saisir une formation."
' Mise en place des données dans la feuille de calcul BD acteur'
ElseIf FIN <= 50 Then
NewLine.Cells(0, 0). = Me.TextFormCompl.Text
For f = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(f) Then
NewLine.Cells(0, 1 + f) = "X"
End If
Next
' On tri le tableau des formations par ordre croissannt de l'intitulé'
J'ai mis un stop at il me met le message "Erreur de compilation. Erreur de synthaxe"
Quant au résultat de la fenêtre exécution après avoir tapé les lignes que tu m'as donné, j'ai une erreur d'éxécution 424. Objet requis.
Mais là je ne suis pas sûre du tout de ma manipulation.
Pour la fenêtre espion, tu trouves çà où ?
Pour la fenêtre espion, tu trouves çà où ?
- J'ai trouvé la fenêtre espion
De toute façon, je t'aurais répondu "cherche mieux"
Citation :
après avoir tapé les lignes
Ce qui m'embête, c'est que tu dois taper une seule ligne, taper [Entrée], lire le résultat, taper une autre ligne, taper [Entrée], lire le résultat, etc. Donc si tu ne précises pas, c'est que ça a planté sur la première ligne
Ligne 29,5 (entre tes lignes 29 et 30), je ne vois pas le Stop.
Je prends le temps de faire un topic sur les fenêtres Espion et Exécution, et je reviens à toi....
De toute façon, je t'aurais répondu "cherche mieux"
C'est marrant mais je m'y attendais, c'est pour çà que dès que j'ai trouvé la solution j'ai rajouté un message.
Citation :
Ligne 29,5 (entre tes lignes 29 et 30), je ne vois pas le Stop.
Normal, avant de recopier le code j'ai enlevé le stop.
Bon si je fais les choses comme il faut :
1- je remet stop entre ligne 29 et 30
2- je lance l'exécution à partir du bouton de commande comme pour créer une formation
3- dans la fenêtre exécution je tape :
Citation :
print NewLine.Address
puis entrée
C'est à ce moment là que j'ai l'erreur d'exécution 424
4- si je n'avais pas d'erreur il faudrait que je répète la ligne 3 pour les trois autres lignes que tu m'as donné.
Comment dit-on? C'est en forgeant qu'on devient forgeron ! Alors forgeons!