Automatisation d'un planning
Bonjour à tous,
J’aimerai automatiser un planning afin qu’il puisse se remplir tout seul. Actuellement je le rempli manuellement mais je perds beaucoup de temps à le remplir.
Globalement j’ai des opérations qui doivent être réalisées à différentes fréquences. Les tâches sont planifiées jusqu’à 1 an d’avance par des « P ». Lorsqu’une opération est réalisée, je change le « P » par un « O ». Cependant il n’est parfois pas possible de réaliser une opération, dans ce cas-là je mets un « A » ou « PL ». Je dois ensuite reprogrammer l’opération pour la semaine suivante et décaler toutes les opérations à venir et c’est là que je passe beaucoup de temps (environ 700 lignes d'opérations).
J’ai déjà passé pas mal de temps à essayer des choses sur VBA mais sans succès… J’aimerai donc avoir votre aide pour que le fichier puisse planifier les opérations en fonction d’une périodicité et changer le planning en fonction de la réalisation d’une action ou non.
Dans le fichier en pièce jointe, la première page correspond au fichier vierge et la deuxième page au fichier en cours d’année.
Je vous remercie d’avance pour votre aide.
Nicolas
Bonjour,
Je dois ensuite reprogrammer l’opération pour la semaine suivante et décaler toutes les opérations à venir
Question: sur la ligne 4 il y a un A en J4, cela veut-il dire qu'il faille reprendre le placement des valeurs de toutes les sélections des lignes en-dessous?
Pour mieux se comprendre, ,il serait plus simple de fournir un tableau avec quelques exemples de résultats attendus.
Cdlt
Bonjour Arturo,
Question: sur la ligne 4 il y a un A en J4, cela veut-il dire qu'il faille reprendre le placement des valeurs de toutes les sélections des lignes en-dessous?
Non, chaque ligne est indépendante. Dans le cas de cette ligne, l'opération est réalisée chaque semaine donc il y a juste besoin de refaire cette action la semaine suivante mais ça ne change donc pas par rapport au planning d'origine. Le problème vient plutôt pour les autres périodicité.
Pour mieux se comprendre, ,il serait plus simple de fournir un tableau avec quelques exemples de résultats attendus.
L'exemple du résultat attendu est sur la feuille n°2
N'hésitez pas à revenir vers moi si d'autres choses ne sont pas claires
Voilà, essayez ceci tout changement de valeur "A" ou "PL" dans la feuille 1 recalcule la ligne entière
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Frequence As Long, Col As Long
On Error GoTo Sortie
If Target.Column > 2 And Target.Column < 56 Then
Application.EnableEvents = False
Application.ScreenUpdating = False
If Target.Value = "A" Or Target.Value = "PL" Then
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, 55)).ClearContents
Frequence = Cells(Target.Row, "B")
Col = Target.Column
Do
Cells(Target.Row, Col + 1) = "P"
Col = Col + (Frequence / 7)
Loop While Target.Column < 55
End If
End If
Sortie:
Application.EnableEvents = True
End SubCdlt
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, 55)).ClearContentsJe ne comprend pas très bien la fin de la ligne. A quoi correspond la deuxième partie de Range après la virgule et en particulier le 55 ?
Je préfère comprendre le code plutôt que recopier bêtement qqch de déjà fait
La 2ème partie de range correspond à la dernière cellule de la ligne sélectionnée, 55 étant le N° de la dernière colonne (j'ai mis 55 au cas où l'on tombe sur une année à 53 semaine. Bon, c'est vrai que j'ai un peu abrégé, pour être plus juste, j'aurai dû faire ceci:
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Frequence As Long, Col As Long, DerCol As Long
On Error GoTo Sortie
If Target.Column > 2 And Target.Column < 56 Then
Application.EnableEvents = False
Application.ScreenUpdating = False
DerCol = Range("A2").End(xlToRight).Column
If Target.Value = "A" Or Target.Value = "PL" Then
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, DerCol)).ClearContents
Frequence = Cells(Target.Row, "B")
Col = Target.Column
Do
Cells(Target.Row, Col + 1) = "P"
Col = Col + (Frequence / 7)
Loop While Target.Column <= DerCol
End If
End If
Sortie:
Application.EnableEvents = True
End Subla ligne complète:
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, DerCol)).ClearContentspar exemple si la cellule sélectionnée est en J4, cela se traduirait par : (en décomposant la ligne précédente)
Cells(Target.Row, Target.Column + 1) ===> range("K4")
Cells(Target.Row, DerCol)===> range("BB4")
et la ligne entière
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, DerCol)) ===> range("K4:BB4")
Voilà
Merci beaucoup pour ces explications, c'est plus clair comme ça.
Je viens seulement de m’apercevoir d'un problème. Lorsqu'il y a un "A" ou un "PL", les "P" se remettent comme il faut mais ils vont jusqu'à la fin du classeur. Je pensait que la ligne ci-dessous arrêtait la boucle et donc l'écriture des "P"
Loop While Target.Column <= DerColEh oui, c'est ce qui arrive quand on ne vérifie ce qu'on propose, je vous prie de m'excuser, voilà le correctif.
Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Frequence As Long, Col As Long, DerCol As Long
On Error GoTo Sortie
If Target.Column > 2 And Target.Column < 56 Then
Application.EnableEvents = False
Application.ScreenUpdating = False
DerCol = Range("A2").End(xlToRight).Column
If Target.Value = "A" Or Target.Value = "PL" Then
Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, DerCol)).ClearContents
Frequence = Cells(Target.Row, "B")
Col = Target.Column
Do
Cells(Target.Row, Col + 1) = "P"
Col = Col + (Frequence / 7)
Loop While Col < DerCol
End If
End If
Sortie:
Application.EnableEvents = True
End SubCdlt
C'est parfait tout marche à la perfection
Merci beaucoup pour votre aide ainsi que le temps que vous m'avez consacré
Nicolas