Déplacement de ligne et modification dans cellule
Bonjour le forum,
Je viens aujourd'hui vers vous car j'ai besoin d'aide sur une chose dont je n'arrive point à réaliser, j'ai essayer d'écrire le fonctionnement en Pseudo-code mais la réalisation en VBA est très complexe.. Je pense dû à ma faible expérience en VBA..
Voici mon souci expliqué en détail:
J'ai actuellement une feuille de Planning, sur laquelle j'ai 3 tableaux sur la colonne A qui correspond au 3 rôles d'un employé. ( Je suis obligé de garder les 3 tableaux, c'est noté dans mon cahier des charges sinon ça serait beaucoup plus simple....). On peux donc créer un employé sur la feuille 'Ajout Rapide' ou soit le modifier/supprimer ! C'est au niveau de la modification que je bloque, les personnes qui sont destinées à avoir ce fichier ( mes responsables de stage) peuvent se tromper lors de la définition du personnel ( soit le nom prénom ou rôle) donc je leur permet de modifier. Cependant lors de la modification du rôle, je dois du coup changer la ligne du personnel pour la remettre sur le bon tableau sur ma Feuille Planning ou bien juste changer le nouveau prénom et nom. Voir le code, j'ai essayé de détaillé un maximum ma réflexion. De plus n'hésitez pas à me poser des questions !
Je remercie d'avance tout ceux qui vont m'aider, ça fait maintenant 3 jours que je suis dessus. Je commence à ne plus avoir de cheveux…
'test pour modifier dans notre calendrier
If stockerrole = Me.ComboBox2 Then ' Si le rôle reste le même lors de la modification
' Je fais une recherche sur ce qu'il y a modifier
Valeur_Cherchee = stockernom & " " & stockerprenom
Set PlageRecherche = Sheets("Planning").Range("A")
Set Recherche = PlageRecherche.Rows.Find(What:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole)
'Dès que la recherche est trouvé alors ( je pensais faire comme ceci :)
' -> on sélectionne ce qu'il y a dans la cellule, on supprime
' -> ensuite on réinsère les nouvelles données
' Ce qui pourrait ressembler à ceci :
If Not Recherche Is Nothing Then
Recherche.Select ' je pense la méthode n'est pas bonne
Selection.Cells.Value = Me.Textebox1 & " " & Me.TextBox2 'Pour integrer les valeurs dans la case selectionné
End If
Set PlageRecherche = Nothing: Set Recherche = Nothing
ElseIf stockerrole <> Me.ComboBox2 Then ' Si le rôle change lors de la modification alors il faudra déplacer les lignes
If Me.ComboBox2 = "Salarié" Then 'Si c'est un salarié quand la modification est faite
' Je fais une recherche sur ce qu'il y a modifier
Valeur_Cherchee = stockernom & " " & stockerprenom
Set PlageRecherche = Sheets("Planning").Range("A")
Set Recherche = PlageRecherche.Rows.Find(What:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole)
'Dès que la recherche est trouvé alors ( je pensais faire comme ceci :)
' -> on sélectionne les 3 lignes de la recherche ( en gros la recherche et les 2 en dessous qui correspondent à Véhicule et Zone)
' -> ensuite on déplace les 3 lignes à la ligne 7 jusque 9 car le début de ce tableau ne buge pas
' Ce qui pourrait ressembler à ceci :
If Not Recherche Is Nothing Then
Recherche.Select ' Mais il faudrait prendre les 3 lignes
Sheets("Planning").Rows(79).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Pour inserer les 3 nouvelles lignes car à ce que j'ai vu pour déplacer
Selection.Cut Destination:=Rows(7) 'il faut faire un couper/coller non ?
'Et ensuite on va réinserer les 3 lignes dans les nouvelles créer en pensant à bien cut ceux d'avant
' Info on sait que pour salarié le tableau commence toujours à la ligne 7
' Permet de connaitre toujours la 1ere ligne des mes tableaux
If stockerrole = "Apprenti" Then
CountApprenti = CountApprenti + 3
ElseIf stockerrole = "Intérimaire" Then
CountApprenti = CountApprenti + 3
CountIntérimaire = CountIntérimaire + 3
End If
ElseIf Me.ComboBox2 = "Apprenti" Then 'Si c'est un apprenti quand la modification est faite
' Je fais une recherche sur ce qu'il y a modifier
Valeur_Cherchee = stockernom & " " & stockerprenom
Set PlageRecherche = Sheets("Planning").Range("A")
Set Recherche = PlageRecherche.Rows.Find(What:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole)
'Dès que la recherche est trouvé alors ( je pensais faire comme ceci :)
' -> on sélectionne les 3 lignes de la recherche ( en gros la recherche et les 2 en dessous qui correspondent à Véhicule et Zone)
' -> ensuite on déplace les 3 lignes à la ligne qui nous est donné par CountApprenti ( qui est la première ligne de notre tableau
' Ce qui pourrait ressembler à ceci :
If Not Recherche Is Nothing Then
Recherche.Select ' Mais il faudrait prendre les 3 lignes
Sheets("Planning").Rows(CountIntérimaire).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Pour inserer les 3 nouvelles lignes car à ce que j'ai vu pour déplacer
Selection.Cut Destination:=Rows(CountIntérimaire) 'il faut faire un couper/coller non ?
'Et ensuite on va réinserer les 3 lignes dans les nouvelles créer en pensant à bien cut ceux d'avant
End If
' Permet de connaitre toujours la 1ere ligne des mes tableaux
If stockerrole = "Salarié" Then
CountApprenti = CountApprenti - 3
ElseIf stockerrole = "Intérimaire" Then
CountIntérimaire = CountIntérimaire + 3
End If
Je relance le sujet, je viens découvrir la fonction replace() qui pourrait sans doute aider pour la première partie de mon soucis mais impossible de le faire fonctionner correctement de mon côté..
Bonsoir
En repensant totalement ton code voici une proposition qui me semble répondre à test attentes.
Les Employés sont gérés à partir d'un seul formulaire (Ajout, suppression modification). Les différents tableaux sont mis à jour à partir de là. Ce qui limite les sources d'erreur.
Le code est peut être un peu ardu, n'hésite pas si tu as des questions. Si je trouve un moment j'essayerais d'intégrer des commentaires.
Bonjour, yal_excel !
Merci pour ta réponse en effet, ce que tu me proposes 'est très intéressant cependant, j'ai un peu du mal à comprendre tout le code.
Il y a aussi une petite modification à faire, qui serait d'intégrer sur la feuille excel "Planning" sur les Tableaux en dessous de chaque employé, les lignes correspondant à Véhicule et Zone.
En tout cas, un grand merci pour ton aide !
En explorant aussi encore un peu plus ton fichier, il manque aussi la sélection du chantier ou autres sur la ligne du personnel. J'avais de mon côté trouvé un moyen de l'incorporer à mon code. Cependant sur le votre, je comprends pas trop comment le faire..
- Lorsque le rôle est modifié. Ce que l'on a attribué sur la ligne de notre salarié ce n'est pas déplacer avec ( exemple: on lui mets un chantier en semaine 1 et 2, si on le modifie, les chantiers se mettent sur l'autre employé).
- Lorsque un employé est créer, sur la feuille "Planning" il ne faut pas oublier d'insérer la liste déroulante sur la plage de cellule ("D: BD")
de plus vient s'ajouter : les lignes voitures et Zone en dessous. De même que l'employé, sur la ligne voiture il faut intégrer la liste déroulante et je suis à la recherche en ce moment même, d'une formule qui permettrait de récupérer le chantier sélectionnez sur la case de l'employé pour ressortir la zone qui sont stocker sur la feuille "Chantier" voir le fichier ci-joint ( ce n'est pas une suite à votre fichier mais une version de ma partie pour que tu puisses comprendre mes attentes)
N'hésite pas à me poser des questions pour avoir plus d'information !
( J'ai une erreur lors du changement d'année, je suis encore à la recherche du soucis)
Bonsoir
J'ai passé un bon moment sur tes fichiers et franchement je bloque. Je n'arrive pas à comprendre quelle peut bien être la finalité de ce truc. Et quand je ne comprends pas j'ai du mal à imaginer des solutions.
En effet la demande de mon maitre de stage est farfelu et complexe.
La finalité c'est d'avoir un planning quasi full automatique. Il restera juste à mon maitre de stage de choisir le chantier pour la semaine de l'employé, le véhicule qu'il va prendre et du coup afficher la zone par rapport à la sélection du chantier pour calculer les coûts de déplacement.
Mais il veut absolument dissocier les 3 catégories de personnes qu'il prend dans son entreprise...
En clair la demande.. est assez bizarre et dur à la conception. J'ai fait un petit peu de pseudo-code pour essayer de voir comment réalisez tout ça mais c'est un peu complexe par rapport à mes compétences..
Je crois que je commence à comprendre la feuille "Planning". Maintenant si tu pouvais m'expliquer à quoi sert et comment est sensé fonctionner la feuille "Evenements"?
Enfaite la feuille "Evenements" elle répertorie juste ce qu'il se passe sur la feuille planning ( elle est buger la, j'essaye de régler le soucis).
En gros, elle permet de mémoriser par exemple une valeur sur la semaine 2 de l'année 2022 sur l'employé "Robert" si tu lui attribues un chantier et lorsque tu changes d'année, ça reset la feuille et si tu remets 2022 ça remets les valeurs.
J'espère que tu vas me comprendre, j'ai du mal a expliqué...
Tu peux regarder le code sur la feuille "Planning" tu pourras sans doute comprendre.
Je fini de modifier, quelques trucs et je te refournis un dossier à jour avec des commentaires pour que tu puisses comprendre ! :)
Voilà le fichier, tu peux faire tes tests pour comprendre
Si j'ai bien tout compris voila une version qui devrait combler tes espérances. Si cela te convient laisse moi un peu de temps pour faire le ménage dans le code parce qu'à force de chercher dans tous les sens c'est un joyeux bordel…
Je n'ai pas utilisé tes UserForms et j'ai ajouté des noms de plage
Bonjour Yal.
Tu es artiste en code VBA, vraiment le fichier ressemble fortement à ce que je recherche ! Me permets-tu de te donner quelques petits axes à revoir et d'amélioration ?
Sur une petite chose je pense pas avoir été assez clair, je suis désolé..
Enfaite la Zone ça doit être une case "calculé" qui dépend du chantier sélectionnez sur la ligne de l'employé.Du coup pour être plus précis, sur la ligne de l'employé ( regarde mon fichier joint, tu comprendras sans doute mieux). Tu peux choisir son état :Maladie, Congé, Modulation et les chantiers en cours. Cette liste déroulante dépend de mon tableau "Travail" sur la feuille Données !Pour récupérer les chantiers dans mon tableau "Travail" j'ai utilisé cette formule, si ça peut t'aider : =""&@INDIRECT("'Chantier'!A"&LIGNE()-4)
Pour revenir à la ligne "Zone", je n'ai pas trouver cette fameuse Formule qui permetterait de récuperer le chantier ou autres états pour afficher la zone.C'est à dire, soit la zone du chantier ( qui est défini lors de la création d'un chantier sur la feuille "Chantiers") ou rien si c'est par exemple: maladie.
De plus je crois, qu'il y a une petite erreur pour les changements de date et la sauvegarde des cellules lorsque l'on change d'année.Ou bien, ça vient de moi qui ne sait pas l'utiliser ?
En continuant les tests, je me suis aperçu que lors de la modification d'un employé ( genre par exemple d'apprenti -> Salarié), la ligne sur laquelle, on a rempli son chantier, le véhicule et la zone. Les lignes ne le suivent pas, c'est à dire que ils ne viennent pas à son nouvelle emplacement.Si c'est un peu trop complexe. Il faudrait juste effacer tout la ligne avant qu'ils soit modifié et change de statut ( d'apprenti -> Salarié).
De plus concernant les véhicules, je ne peux pas te fournir les immatriculations mais dans l'entreprise de mon stage.Il fonctionne juste avec les plaques donc ne t'embête pas avec autres choses ! :p
En tout cas, un grand merci pour ton aide fourni ! L'aide me permet de voir, un nouvelle aspect en VBA, plus complexe mais plus fiable !
PS :Ah oui aussi, si tu veux faire des tests avec les chantiers, il faut importer les userforms de mon fichier fourni auparavant.
Et j'ai oublié, concernant les statues les "salariés" peuvent eux avoir un véhicule mais les autres " Apprenti, Intérimaire, Stagiaire", ils ne peuvent pas, donc si ça peut t'alléger quelques tâches, tu peux retirer cependant si c'est une tâche chiant, laisse comme ça!
Surtout que si tu les mets pas au début, si par exemple on modifie un Intérimaire qui devient un salarié alors il faudrait lui recréer une ligne véhicule donc...
Bon ben désolé mais je renonce. Tout cela me semble beaucoup trop alambiqué. J'ai fais les trois formulaires: employés, chantiers et véhicules. A toi de voir si tu veux t'en servir. Comme ils sont construits sur le même modèle ils ne sont pas très compliqués à adapter.
Pour le reste ne parviens pas comprendre la finalité de cette usine à gaz. Si c'est juste pour avoir la liste des évènements?
Je ne comprends pas la nécessité de séparer les statuts dans des tableaux différents? Un seul tableau ferait le même travail et avec des filtres ça reviendrait au même.
Avec un filtre c'est à dire ? Je peux sans doute, proposer l'idée à mon chef de stage. Car je suis totalement d'accord avec toi que je comprends pas l'utilité des 3 tableaux !
Voilà pour te donner une idée de ce que ça pourrait être. Je sais que les listes de validations et d'autres bricoles ne sont pas bonnes mais c'est juste pour l'exemple
Mais c'est beaucoup mieux vraiment. Je ne sais pas pourquoi, mon gérant n'est pas parti sur ça depuis le début !
Bon mon mettre de stage a trouvé l'idée bonne du coup, un grand merci ! ( j'en pouvais plus de sa gestion de triple tableau)
Cependant, je suis un peu perdu sur l'utilisation, car j'aimerai faire des modifs dessus pour l'adapter au mieux à mes attentes.
ça serait possible, que tu m'aides ?
J'y travaille