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

14planning.xlsm (30.33 Ko)

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 Sub

Cdlt

Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, 55)).ClearContents

Je 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 Sub

la ligne complète:

Range(Cells(Target.Row, Target.Column + 1), Cells(Target.Row, DerCol)).ClearContents

par 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 <= DerCol

Eh 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 Sub

Cdlt

C'est parfait tout marche à la perfection

Merci beaucoup pour votre aide ainsi que le temps que vous m'avez consacré

Nicolas

Rechercher des sujets similaires à "automatisation planning"