Planning Calendrier VBA
Bonjour à tous,
Bon ma joie de copier coller le code pour remplir mon planning n'aura était que de courte durée au bout de 10 jours seulement de code il me marque en bug procédure trop grande. Donc si quelqu'un à une solution pour remplier mon calendrier sans recopier les code pour chaque jours de l'année je suis preneur.
En copie mon fichier bugué
Merci d'avance
Bonjour,
en effet ce n'est pas jojo, j'ai l'impression de me voir en 2009 !
Depuis je fais un tout petit mieux
Comme j'ai coutume de dire :
"C'est en forgeant qu'on devient forgeron,
c'est en sciant que Léonard De Vinci"
Bref je pense qu'il y a mieux à faire et en disant je pense je ne prend pas trop de risque.
Premièrement, il n'est pas nécessaire de sélectionner pour modifier.
Donc :
Worksheets("Feuil1").Select
Range("B4").Select 'Sélection B4
ActiveCell.FormulaR1C1 = "CP"peu très bien être remplacé par :
Worksheets("Feuil1").Range("B4").FormulaR1C1 = "CP"et le FormulaR1C1 par Value tout simplement, donc :
Worksheets("Feuil1").Range("B4").Value = "CP"Ensuite je trouve qu'il y a une erreur de conception. Je dis cela au vu de votre code :
Vous faites un test pour savoir si l'utilisateur à cocher CP, JCO etc. et tout ceci pour une seule journée, mais si je comprend bien c'est une position au choix, non ? Donc un groupe de bouton radio serait le mieux, comme ceci si un est choisi, alors les autres ne le sont pas, cela réduit le champ des tests.
Pour ce qui est du personnel, les boites à cocher sont les bienvenue, cela permet de renseigner plusieurs personnel en même temps.
Pour ce qui est de la journée, une seule journée par validation. Cette date est utile pour connaître la zone à remplir sur la feuille.
Vous êtes partis sur le principe de nommer chaque cellule pour chaque date... Le mieux est de calculer le décalage de cette cellule en fonction de la date : par exemple pour le premier personnel : si 1 janvier alors B4 mais si c'est février, c'est B4 décaler vers le bas de 11 lignes soit B15, mais si c'est l'opérateur 2 alors c'est B5 décaler toujours de 11 lignes si on est en février, etc.
Il suffit de trouver la relation entre date (jour pour les colonnes, et mois pour les lignes) et le personnel afin de "pointer" la bonne cellule.
Vous mettez le tout dans une boucle pour tester tous les opérateurs et hop votre code diminue en taille.
Manque de temps en ce moment...
Mais ce peut être une bonne direction.
Une autre solution serait de partir sur une forme de fichier différent, mais n'est pas là la question posée
@ (très) bientôt
LouReeD
bonjour,
Je pense que tu te compliques bien la vie...
Tu devrais essayer d'adopter un truc comme comme dans le fichier joint :
Tu peux y rajouter autant de personnel que tu veux et autant de motif de preésence ou d'absence que tu veux sans grande modification.
De plus il est très facile d'y faire des stats...
A+
[EDIT] Hiiiii ! Salut LouReed on a frisé de peu la collision !
Bon. Moi j'ai choisi de répondre à la question qui n'est pas posée...
Bonsoir galopin01 !
Donc voilà, je répond à la question :
Private Sub CommandButton1_Click() 'Validation
Dateselect = Calendar1.Value 'enregistre la date dans une variable
' définition de plusieurs variables
Dim Cpt As Integer, La_Position As String, La_colonne As Integer, La_ligne As Long
' CPT = compteur
' La_Position = valeur de la position du personnel
' La_colonne = colonne de la cellule où il faut écrire la position
' La_ligne = idem mais en ligne
' on boucle les contrôles du frame 2 afin de chercher l'option bouton sélectionné
For Each c In Me.Frame2.Controls
If c.Value = True Then ' si le contrôle est égal à vrai, c'est l'option bouton sélectionné
La_Position = c.Caption ' La_Position est égal à son nom
Exit For ' on sort d ela boucle car un seul option bouton par groupe peut être sélectionné
End If
Next
' calcul de la colonne qui en fait correspond au numéro du jour + 1
La_colonne = Day(Dateselect) + 1
' on boucle sur les 8 personnels
For Cpt = 1 To 8
If Controls("Operateur" & Cpt).Value = True Then ' si le personnel est coché
La_ligne = 3 + (11 * (Month(Dateselect) - 1)) + Cpt ' on calcul son numéro de ligne
' 3 = nombre de ligne d'entête avant le premier personnel
' 11 = nombre de cellule qui sépare le même personnel d'un mois à l'autre
' month(dateselect) = numéro du mois
' -1 = pour janvier il n'y a pas de décalage de 11 lignes donc on hinibe ce décalage grace à la multiplication 11 * 0 = 0
' Cpt permet de décaler la cellule trouvée du nombre de ligne qui correspond au personnel
Worksheets("Feuil1").Cells(La_ligne, La_colonne).Value = La_Position ' on écrit dans la cellule feuille 1 cellule (ligne, colonne) la valeur de la position
End If
Next
' tout est fait on cache le userform
UserForm1.Hide
End SubJ'ai donc remplacé les checkbox par des options boutons dont le "caption" correspond aux codes voulus.
J'ai donc ajouter 8 label pour écrire ces noms en toutes lettres.
Au niveau du code, j'ai laissé la variable Dateselect
Pour le reste mise en place de deux boucles et de trois variables :
une variable de colonne et une de ligne, et une qui reprendra le caption de l'optionbouton sélectionné.
La colonne c'est facile : date du jour + 1 colonne pour "passer" la colonne A
Pour la ligne ce n'est pas plus compliqué : 3 pour enlever les trois ligne d'entête du tableau
month(dateselect) pour connaître le numéro de mois sélectionné, 11 pour le décalage de ligne entre deux ligne du même personnel, et Cpt qui correspond au numéro d'opérateur du personnel dans le USF.
Ce qui donne 3 + (11 x (Month(Dateselect) - 1)) + Cpt
Pourquoi le - 1 ? car pour le premier mois il faut "effacer" le décalage de 11 lignes ! et pour le mois de fécvrier ce décalage est de 11 lignes et non pas 22 donc on a bien (11 x (2-1)) = 11 !
Voilà, le fichier joint :
En général lorsque votre code se répète ainsi, il faut trouver la solution des boucles c'est un gain de place et de temps !
Le code reste compréhensible du fait de sa courte longueur ! (je crois que dire des choses contraires c'est mon point fort !!!!
@ bientôt
LouReeD
Bonjour,
Et merci à tous et surtout à LouReeD, car je voulais garder ce visuel pour le planning. Je ne connais pas du tout les boucles mais promis je vais mis mettre car je commençais à choper des crampes à faire copier coller. Un grand merci à tous pour le temps que vous avez passé à mon sujet.
Bonsoir
le "surtout" est un peu de trop, non ?
Il est vrai, comme je le disais plus haut, il m'arrive souvent de répondre à la question de la façon la plus proche de la question, même si cela ne va pas dans le sens d'un "bonne" programmation ou structure de feuille.
Mais j'ai connu un temps où je ne demandais que la résolution de mes problèmes sans me soucier du reste, et les réponses "Pro" me tournaient la tête plus qu'elles m'aidaient...
ceci dit, c'est un temps révolu, maintenant j'aime regarder la programmation des "Pros" afin de continuer (il me reste du chemin à parcourir) à me perfectionner !
Sur les applications que j'ai mis en téléchargement, il m'arrive de modifier une version suite à la retouche de code VBA afin que ce dernier soit plus propre !
Bon le problème est résolu, je suis ravis pour vous.
@ bientôt pour d'autre problèmes
LouReeD
Re bonsoir !
En revenant sur votre fichier je viens de m'apercevoir que la structure "personnel" n'est pas la même pour tous les mois !
Ce qui fait que le décalage de 11 lignes n'est plus vrai à partir du mois de février !
Alors pour corriger il vous faut ajouter une ligne après Delmas de février à décembre, dans ce cas le code VBA n'est pas à modifier ou alors supprimer celle qui se trouve au mois de janvier et dans ce cas il faut modifier le code en remplaçant le "11" par "10".
D'ailleurs si un jour vous deviez rajouter du personnel, les boites à cocher devraient continuer dans l'ordre chronologique (opérateur9, opérateur10 etc.) et ajouter autant de ligne par mois que d'opérateur, et modifier la boucle dans le code VBA pour "scruter" ses opérateurs, et également la valeur 11 qui est égal à NB_opérateur +1 .
@ bientôt
LouReeD